@@ -57,12 +57,31 @@ def escape_int(value, mapping=None):
57
57
def escape_float (value , mapping = None ):
58
58
return ('%.15g' % value )
59
59
60
+ _escape_table = [chr (x ) for x in range (128 )]
61
+ _escape_table [0 ] = u'\\ 0'
62
+ _escape_table [ord ('\\ ' )] = u'\\ \\ '
63
+ _escape_table [ord ('\n ' )] = u'\\ n'
64
+ _escape_table [ord ('\r ' )] = u'\\ r'
65
+ _escape_table [ord ('\032 ' )] = u'\\ Z'
66
+ _escape_table [ord ('"' )] = u'\\ "'
67
+ _escape_table [ord ("'" )] = u"\\ '"
68
+
69
+ def _escape_unicode (value , mapping = None ):
70
+ """escapes *value* without adding quote.
71
+
72
+ Value should be unicode
73
+ """
74
+ return value .translate (_escape_table )
75
+
60
76
if PY2 :
61
77
def escape_string (value , mapping = None ):
62
78
"""escape_string escapes *value* but not surround it with quotes.
63
79
64
80
Value should be bytes or unicode.
65
81
"""
82
+ if isinstance (value , unicode ):
83
+ return escape_unicode (value )
84
+ assert isinstance (value , (bytes , bytearray ))
66
85
value = value .replace ('\\ ' , '\\ \\ ' )
67
86
value = value .replace ('\0 ' , '\\ 0' )
68
87
value = value .replace ('\n ' , '\\ n' )
@@ -71,22 +90,12 @@ def escape_string(value, mapping=None):
71
90
value = value .replace ("'" , "\\ '" )
72
91
value = value .replace ('"' , '\\ "' )
73
92
return value
74
- else :
75
- _escape_table = [chr (x ) for x in range (128 )]
76
- _escape_table [0 ] = '\\ 0'
77
- _escape_table [ord ('\\ ' )] = '\\ \\ '
78
- _escape_table [ord ('\n ' )] = '\\ n'
79
- _escape_table [ord ('\r ' )] = '\\ r'
80
- _escape_table [ord ('\032 ' )] = '\\ Z'
81
- _escape_table [ord ('"' )] = '\\ "'
82
- _escape_table [ord ("'" )] = "\\ '"
83
93
84
- def escape_string (value , mapping = None ):
85
- """escape_string escapes *value* but not surround it with quotes.
86
-
87
- Value should be str (unicode).
88
- """
89
- return value .translate (_escape_table )
94
+ def escape_bytes (value , mapping = None ):
95
+ assert isinstance (value , (bytes , bytearray ))
96
+ return b"_binary'%s'" % escape_string (value )
97
+ else :
98
+ escape_string = _escape_unicode
90
99
91
100
# On Python ~3.5, str.decode('ascii', 'surrogateescape') is slow.
92
101
# (fixed in Python 3.6, http://bugs.python.org/issue24870)
@@ -95,15 +104,15 @@ def escape_string(value, mapping=None):
95
104
_escape_bytes_table = _escape_table + [chr (i ) for i in range (0xdc80 , 0xdd00 )]
96
105
97
106
def escape_bytes (value , mapping = None ):
98
- return "'%s'" % value .decode ('latin1' ).translate (_escape_bytes_table )
107
+ return "_binary'%s'" % value .decode ('latin1' ).translate (_escape_bytes_table )
108
+
99
109
110
+ def escape_unicode (value , mapping = None ):
111
+ return u"'%s'" % _escape_unicode (value )
100
112
101
113
def escape_str (value , mapping = None ):
102
114
return "'%s'" % escape_string (value , mapping )
103
115
104
- def escape_unicode (value , mapping = None ):
105
- return escape_str (value , mapping )
106
-
107
116
def escape_None (value , mapping = None ):
108
117
return 'NULL'
109
118
@@ -337,6 +346,7 @@ def convert_characters(connection, field, data):
337
346
list : escape_sequence ,
338
347
set : escape_sequence ,
339
348
dict : escape_dict ,
349
+ bytearray : escape_bytes ,
340
350
type (None ): escape_None ,
341
351
datetime .date : escape_date ,
342
352
datetime .datetime : escape_datetime ,
0 commit comments