Add _binary prefix for binaries.
On Python 2, bytearray represents binary data. On Python 3, bytes and bytearray represents binary data. reference: https://github.com/go-sql-driver/mysql/pull/382 https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-46.html https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-27.html
This commit is contained in:
@@ -25,7 +25,7 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
VERSION = (0, 6, 7, None)
|
VERSION = (0, 6, 7, None)
|
||||||
|
|
||||||
from ._compat import text_type, JYTHON, IRONPYTHON
|
from ._compat import text_type, JYTHON, IRONPYTHON, PY2
|
||||||
from .constants import FIELD_TYPE
|
from .constants import FIELD_TYPE
|
||||||
from .converters import escape_dict, escape_sequence, escape_string
|
from .converters import escape_dict, escape_sequence, escape_string
|
||||||
from .err import Warning, Error, InterfaceError, DataError, \
|
from .err import Warning, Error, InterfaceError, DataError, \
|
||||||
@@ -76,8 +76,11 @@ ROWID = DBAPISet()
|
|||||||
def Binary(x):
|
def Binary(x):
|
||||||
"""Return x as a binary type."""
|
"""Return x as a binary type."""
|
||||||
if isinstance(x, text_type) and not (JYTHON or IRONPYTHON):
|
if isinstance(x, text_type) and not (JYTHON or IRONPYTHON):
|
||||||
return x.encode()
|
x = x.encode()
|
||||||
return bytes(x)
|
if PY2:
|
||||||
|
return bytearray(x)
|
||||||
|
else:
|
||||||
|
return bytes(x)
|
||||||
|
|
||||||
def Connect(*args, **kwargs):
|
def Connect(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -57,12 +57,31 @@ def escape_int(value, mapping=None):
|
|||||||
def escape_float(value, mapping=None):
|
def escape_float(value, mapping=None):
|
||||||
return ('%.15g' % value)
|
return ('%.15g' % value)
|
||||||
|
|
||||||
|
_escape_table = [chr(x) for x in range(128)]
|
||||||
|
_escape_table[0] = u'\\0'
|
||||||
|
_escape_table[ord('\\')] = u'\\\\'
|
||||||
|
_escape_table[ord('\n')] = u'\\n'
|
||||||
|
_escape_table[ord('\r')] = u'\\r'
|
||||||
|
_escape_table[ord('\032')] = u'\\Z'
|
||||||
|
_escape_table[ord('"')] = u'\\"'
|
||||||
|
_escape_table[ord("'")] = u"\\'"
|
||||||
|
|
||||||
|
def _escape_unicode(value, mapping=None):
|
||||||
|
"""escapes *value* without adding quote.
|
||||||
|
|
||||||
|
Value should be unicode
|
||||||
|
"""
|
||||||
|
return value.translate(_escape_table)
|
||||||
|
|
||||||
if PY2:
|
if PY2:
|
||||||
def escape_string(value, mapping=None):
|
def escape_string(value, mapping=None):
|
||||||
"""escape_string escapes *value* but not surround it with quotes.
|
"""escape_string escapes *value* but not surround it with quotes.
|
||||||
|
|
||||||
Value should be bytes or unicode.
|
Value should be bytes or unicode.
|
||||||
"""
|
"""
|
||||||
|
if isinstance(value, unicode):
|
||||||
|
return escape_unicode(value)
|
||||||
|
assert isinstance(value, bytes)
|
||||||
value = value.replace('\\', '\\\\')
|
value = value.replace('\\', '\\\\')
|
||||||
value = value.replace('\0', '\\0')
|
value = value.replace('\0', '\\0')
|
||||||
value = value.replace('\n', '\\n')
|
value = value.replace('\n', '\\n')
|
||||||
@@ -71,22 +90,12 @@ if PY2:
|
|||||||
value = value.replace("'", "\\'")
|
value = value.replace("'", "\\'")
|
||||||
value = value.replace('"', '\\"')
|
value = value.replace('"', '\\"')
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def escape_bytes(value, mapping=None):
|
||||||
|
assert isinstance(value, (bytes, bytearray))
|
||||||
|
return b"_binary'%s'" % value
|
||||||
else:
|
else:
|
||||||
_escape_table = [chr(x) for x in range(128)]
|
escape_string = _escape_unicode
|
||||||
_escape_table[0] = '\\0'
|
|
||||||
_escape_table[ord('\\')] = '\\\\'
|
|
||||||
_escape_table[ord('\n')] = '\\n'
|
|
||||||
_escape_table[ord('\r')] = '\\r'
|
|
||||||
_escape_table[ord('\032')] = '\\Z'
|
|
||||||
_escape_table[ord('"')] = '\\"'
|
|
||||||
_escape_table[ord("'")] = "\\'"
|
|
||||||
|
|
||||||
def escape_string(value, mapping=None):
|
|
||||||
"""escape_string escapes *value* but not surround it with quotes.
|
|
||||||
|
|
||||||
Value should be str (unicode).
|
|
||||||
"""
|
|
||||||
return value.translate(_escape_table)
|
|
||||||
|
|
||||||
# On Python ~3.5, str.decode('ascii', 'surrogateescape') is slow.
|
# On Python ~3.5, str.decode('ascii', 'surrogateescape') is slow.
|
||||||
# (fixed in Python 3.6, http://bugs.python.org/issue24870)
|
# (fixed in Python 3.6, http://bugs.python.org/issue24870)
|
||||||
@@ -95,15 +104,15 @@ else:
|
|||||||
_escape_bytes_table = _escape_table + [chr(i) for i in range(0xdc80, 0xdd00)]
|
_escape_bytes_table = _escape_table + [chr(i) for i in range(0xdc80, 0xdd00)]
|
||||||
|
|
||||||
def escape_bytes(value, mapping=None):
|
def escape_bytes(value, mapping=None):
|
||||||
return "'%s'" % value.decode('latin1').translate(_escape_bytes_table)
|
return "_binary'%s'" % value.decode('latin1').translate(_escape_bytes_table)
|
||||||
|
|
||||||
|
|
||||||
|
def escape_unicode(value, mapping=None):
|
||||||
|
return u"'%s'" % _escape_unicode(value)
|
||||||
|
|
||||||
def escape_str(value, mapping=None):
|
def escape_str(value, mapping=None):
|
||||||
return "'%s'" % escape_string(value, mapping)
|
return "'%s'" % escape_string(value, mapping)
|
||||||
|
|
||||||
def escape_unicode(value, mapping=None):
|
|
||||||
return escape_str(value, mapping)
|
|
||||||
|
|
||||||
def escape_None(value, mapping=None):
|
def escape_None(value, mapping=None):
|
||||||
return 'NULL'
|
return 'NULL'
|
||||||
|
|
||||||
@@ -337,6 +346,7 @@ encoders = {
|
|||||||
list: escape_sequence,
|
list: escape_sequence,
|
||||||
set: escape_sequence,
|
set: escape_sequence,
|
||||||
dict: escape_dict,
|
dict: escape_dict,
|
||||||
|
bytearray: escape_bytes,
|
||||||
type(None): escape_None,
|
type(None): escape_None,
|
||||||
datetime.date: escape_date,
|
datetime.date: escape_date,
|
||||||
datetime.datetime: escape_datetime,
|
datetime.datetime: escape_datetime,
|
||||||
|
|||||||
@@ -413,8 +413,8 @@ class TestGitHubIssues(base.PyMySQLTestCase):
|
|||||||
"create table issue364 (value_1 binary(3), value_2 varchar(3)) "
|
"create table issue364 (value_1 binary(3), value_2 varchar(3)) "
|
||||||
"engine=InnoDB default charset=utf8")
|
"engine=InnoDB default charset=utf8")
|
||||||
|
|
||||||
sql = "insert into issue364 (value_1, value_2) values (_binary%s, _binary%s)"
|
sql = "insert into issue364 (value_1, value_2) values (%s, %s)"
|
||||||
usql = u"insert into issue364 (value_1, value_2) values (_binary%s, _binary%s)"
|
usql = u"insert into issue364 (value_1, value_2) values (%s, %s)"
|
||||||
values = [b"\x00\xff\x00", u"\xe4\xf6\xfc"]
|
values = [b"\x00\xff\x00", u"\xe4\xf6\xfc"]
|
||||||
|
|
||||||
# test single insert and select
|
# test single insert and select
|
||||||
|
|||||||
Reference in New Issue
Block a user