Commit 8a5f5b5b authored by Jérome Perrin's avatar Jérome Perrin

ZMySQLDA: fix string_literal usage

MySQLdb's string_literal is a method from the C API and the name is not
natural for python programmers, because it manipulates bytes. It
supports str, unless they have non ASCII characters, so it's better to
always pass bytes.

On python2, this change repairs a regression visible when searching
catalog with translated related keys. This regression was introduced in
the merge of zope4 support, more specifically with 610972af (py3:
Update Shared.DC.ZRDB.{sqltest,sqlvar} monkey patches., 2022-04-16),
because with the new version of the patches this method gets passed
unicode strings, which is fine, unless they contain non ASCII characters.
parent cd24fb39
...@@ -89,6 +89,7 @@ $Id: DA.py,v 1.4 2001/08/09 20:16:36 adustman Exp $''' % database_type ...@@ -89,6 +89,7 @@ $Id: DA.py,v 1.4 2001/08/09 20:16:36 adustman Exp $''' % database_type
__version__='$Revision: 1.4 $'[11:-2] __version__='$Revision: 1.4 $'[11:-2]
import os import os
import six
from collections import defaultdict from collections import defaultdict
from weakref import WeakKeyDictionary from weakref import WeakKeyDictionary
import transaction import transaction
...@@ -172,6 +173,8 @@ class Connection(DABase.Connection): ...@@ -172,6 +173,8 @@ class Connection(DABase.Connection):
# any reason, that would generate an infinite loop. # any reason, that would generate an infinite loop.
self.connect(self.connection_string) self.connect(self.connection_string)
connection = self._v_database_connection connection = self._v_database_connection
if not isinstance(v, six.binary_type):
v = v.encode('utf-8')
return connection.string_literal(v) return connection.string_literal(v)
......
...@@ -466,6 +466,8 @@ class DB(TM): ...@@ -466,6 +466,8 @@ class DB(TM):
return items, result return items, result
def string_literal(self, s): def string_literal(self, s):
# This method accepts bytes or str with only ASCII characters
# and return bytes.
return self.db.string_literal(s) return self.db.string_literal(s)
def _begin(self, *ignored): def _begin(self, *ignored):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment