Commit 09fc5d92 authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki Committed by Jérome Perrin

py2/py3: handle bytes correctly in Python3.

parent 8ce32e8b
...@@ -29,7 +29,7 @@ from __future__ import absolute_import ...@@ -29,7 +29,7 @@ from __future__ import absolute_import
from six import string_types as basestring from six import string_types as basestring
from six.moves import xrange from six.moves import xrange
from Products.ERP5Type.Utils import ensure_list, str2bytes from Products.ERP5Type.Utils import bytes2str, ensure_list, str2bytes
from collections import defaultdict from collections import defaultdict
from contextlib import contextmanager from contextlib import contextmanager
from itertools import product, chain from itertools import product, chain
...@@ -397,10 +397,10 @@ CREATE TABLE %s ( ...@@ -397,10 +397,10 @@ CREATE TABLE %s (
for line in result] for line in result]
def countMessageSQL(self, quote, **kw): def countMessageSQL(self, quote, **kw):
return "SELECT count(*) FROM %s WHERE processing_node > %d AND %s" % ( return b"SELECT count(*) FROM %s WHERE processing_node > %d AND %s" % (
self.sql_table, DEPENDENCY_IGNORED_ERROR_STATE, " AND ".join( str2bytes(self.sql_table), DEPENDENCY_IGNORED_ERROR_STATE, b" AND ".join(
sqltest_dict[k](v, quote) for (k, v) in six.iteritems(kw) if v sqltest_dict[k](v, quote) for (k, v) in six.iteritems(kw) if v
) or "1") ) or b"1")
def hasActivitySQL(self, quote, only_valid=False, only_invalid=False, **kw): def hasActivitySQL(self, quote, only_valid=False, only_invalid=False, **kw):
where = [sqltest_dict[k](v, quote) for (k, v) in six.iteritems(kw) if v] where = [sqltest_dict[k](v, quote) for (k, v) in six.iteritems(kw) if v]
...@@ -425,7 +425,7 @@ CREATE TABLE %s ( ...@@ -425,7 +425,7 @@ CREATE TABLE %s (
0, 0,
)[1] )[1]
else: else:
subquery = (b"(" subquery = lambda *a, **k: str2bytes(bytes2str(b"("
b"SELECT 3*priority{} AS effective_priority, date" b"SELECT 3*priority{} AS effective_priority, date"
b" FROM %s" b" FROM %s"
b" WHERE" b" WHERE"
...@@ -434,7 +434,7 @@ CREATE TABLE %s ( ...@@ -434,7 +434,7 @@ CREATE TABLE %s (
b" date <= UTC_TIMESTAMP(6)" b" date <= UTC_TIMESTAMP(6)"
b" ORDER BY priority, date" b" ORDER BY priority, date"
b" LIMIT 1" b" LIMIT 1"
b")" % self.sql_table).format b")" % str2bytes(self.sql_table)).format(*a, **k))
result = query( result = query(
b"SELECT *" b"SELECT *"
b" FROM (%s) AS t" b" FROM (%s) AS t"
...@@ -443,11 +443,11 @@ CREATE TABLE %s ( ...@@ -443,11 +443,11 @@ CREATE TABLE %s (
b" UNION ALL ".join( b" UNION ALL ".join(
chain( chain(
( (
subquery(b'-1', b'node = %i' % processing_node), subquery('-1', 'node = %i' % processing_node),
subquery(b'', b'node=0'), subquery('', 'node=0'),
), ),
( (
subquery(b'-1', b'node = %i' % x) subquery('-1', 'node = %i' % x)
for x in node_set for x in node_set
), ),
), ),
...@@ -464,7 +464,7 @@ CREATE TABLE %s ( ...@@ -464,7 +464,7 @@ CREATE TABLE %s (
# sorted set to filter negative node values. # sorted set to filter negative node values.
# This is why this query is only executed when the previous one # This is why this query is only executed when the previous one
# did not find anything. # did not find anything.
result = query(subquery(b'+1', b'node>0'), 0)[1] result = query(subquery('+1', 'node>0'), 0)[1]
if result: if result:
return result[0] return result[0]
return Queue.getPriority(self, activity_tool, processing_node, node_set) return Queue.getPriority(self, activity_tool, processing_node, node_set)
...@@ -779,7 +779,7 @@ CREATE TABLE %s ( ...@@ -779,7 +779,7 @@ CREATE TABLE %s (
0, 0,
)) ))
else: else:
subquery = (b"(" subquery = lambda *a, **k: str2bytes(bytes2str(b"("
b"SELECT *, 3*priority{} AS effective_priority" b"SELECT *, 3*priority{} AS effective_priority"
b" FROM %s" b" FROM %s"
b" WHERE" b" WHERE"
...@@ -788,8 +788,7 @@ CREATE TABLE %s ( ...@@ -788,8 +788,7 @@ CREATE TABLE %s (
b" %s%s" b" %s%s"
b" ORDER BY priority, date" b" ORDER BY priority, date"
b" LIMIT %i" b" LIMIT %i"
b" FOR UPDATE" b")" % args).format(*a, *k))
b")" % args).format
result = Results(query( result = Results(query(
b"SELECT *" b"SELECT *"
b" FROM (%s) AS t" b" FROM (%s) AS t"
...@@ -798,11 +797,11 @@ CREATE TABLE %s ( ...@@ -798,11 +797,11 @@ CREATE TABLE %s (
b" UNION ALL ".join( b" UNION ALL ".join(
chain( chain(
( (
subquery(b'-1', b'node = %i' % processing_node), subquery('-1', 'node = %i' % processing_node),
subquery(b'', b'node=0'), subquery('', 'node=0'),
), ),
( (
subquery(b'-1', b'node = %i' % x) subquery('-1', 'node = %i' % x)
for x in node_set for x in node_set
), ),
), ),
...@@ -820,7 +819,7 @@ CREATE TABLE %s ( ...@@ -820,7 +819,7 @@ CREATE TABLE %s (
# sorted set to filter negative node values. # sorted set to filter negative node values.
# This is why this query is only executed when the previous one # This is why this query is only executed when the previous one
# did not find anything. # did not find anything.
result = Results(query(subquery(b'+1', b'node>0'), 0)) result = Results(query(subquery('+1', 'node>0'), 0))
if result: if result:
# Reserve messages. # Reserve messages.
uid_list = [x.uid for x in result] uid_list = [x.uid for x in result]
......
...@@ -1808,7 +1808,7 @@ class ActivityTool (BaseTool): ...@@ -1808,7 +1808,7 @@ class ActivityTool (BaseTool):
""" """
db = self.getSQLConnection() db = self.getSQLConnection()
quote = db.string_literal quote = db.string_literal
return sum(x for x, in db.query("(%s)" % ") UNION ALL (".join( return sum(x for x, in db.query(b"(%s)" % b") UNION ALL (".join(
activity.countMessageSQL(quote, **kw) activity.countMessageSQL(quote, **kw)
for activity in six.itervalues(activity_dict)))[1]) for activity in six.itervalues(activity_dict)))[1])
......
...@@ -385,7 +385,7 @@ def getTranslationStringWithContext(self, msg_id, context, context_id): ...@@ -385,7 +385,7 @@ def getTranslationStringWithContext(self, msg_id, context, context_id):
result = localizer.erp5_ui.gettext(msg_id_context, default='') result = localizer.erp5_ui.gettext(msg_id_context, default='')
if result == '': if result == '':
result = localizer.erp5_ui.gettext(msg_id) result = localizer.erp5_ui.gettext(msg_id)
return result.encode('utf8') return unicode2str(result)
def Email_parseAddressHeader(text): def Email_parseAddressHeader(text):
""" """
......
...@@ -48,7 +48,7 @@ from Products.PythonScripts.PythonScript import PythonScript ...@@ -48,7 +48,7 @@ from Products.PythonScripts.PythonScript import PythonScript
from Products.ERP5Type.Accessor.Constant import PropertyGetter as ConstantGetter from Products.ERP5Type.Accessor.Constant import PropertyGetter as ConstantGetter
from Products.ERP5Form.PreferenceTool import Priority from Products.ERP5Form.PreferenceTool import Priority
from zLOG import LOG, DEBUG from zLOG import LOG, DEBUG
from Products.ERP5Type.Utils import convertToUpperCase, str2bytes from Products.ERP5Type.Utils import convertToUpperCase, bytes2str, str2bytes
from Products.ERP5Type.tests.backportUnittest import SetupSiteError from Products.ERP5Type.tests.backportUnittest import SetupSiteError
from Products.ERP5Type.tests.utils import addUserToDeveloperRole from Products.ERP5Type.tests.utils import addUserToDeveloperRole
from Products.ERP5Type.tests.utils import parseListeningAddress from Products.ERP5Type.tests.utils import parseListeningAddress
...@@ -1560,7 +1560,7 @@ def optimize(): ...@@ -1560,7 +1560,7 @@ def optimize():
PythonScript._compile = _compile PythonScript._compile = _compile
PythonScript_exec = PythonScript._exec PythonScript_exec = PythonScript._exec
def _exec(self, *args): def _exec(self, *args):
self.func_code # trigger compilation if needed self.__code__ # trigger compilation if needed
return PythonScript_exec(self, *args) return PythonScript_exec(self, *args)
PythonScript._exec = _exec PythonScript._exec = _exec
from Acquisition import aq_parent from Acquisition import aq_parent
......
...@@ -31,6 +31,8 @@ def sqlquote(value): ...@@ -31,6 +31,8 @@ def sqlquote(value):
# (ex: ZMySQLDA.DA.Connection.sql_quote__). # (ex: ZMySQLDA.DA.Connection.sql_quote__).
# Duplicating such code is error-prone, and makes us rely on a specific SQL # Duplicating such code is error-prone, and makes us rely on a specific SQL
# dialect... # dialect...
if str != bytes and isinstance(value, bytes): # six.PY3
value = value.decode()
return "'" + (value return "'" + (value
.replace('\x5c', r'\\') .replace('\x5c', r'\\')
.replace('\x00', r'\0') .replace('\x00', r'\0')
......
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