Skip to content

Commit c58c343

Browse files
committed
More MySQLdb compatibility to make it django compatible
1 parent ece08ad commit c58c343

File tree

5 files changed

+30
-8
lines changed

5 files changed

+30
-8
lines changed

MySQLdb/connection.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ class Connection(object):
2727

2828
def __init__(self, host=None, user=None, passwd=None, db=None, port=0,
2929
client_flag=0, charset=None, init_command=None, connect_timeout=None,
30-
sql_mode=None, encoders=None, decoders=None, use_unicode=True):
30+
sql_mode=None, encoders=None, decoders=None, use_unicode=True,
31+
conv=None):
3132

3233
self._db = libmysql.c.mysql_init(None)
3334

@@ -54,8 +55,13 @@ def __init__(self, host=None, user=None, passwd=None, db=None, port=0,
5455
encoders = converters.DEFAULT_ENCODERS
5556
if decoders is None:
5657
decoders = converters.DEFAULT_DECODERS
57-
self.encoders = encoders
58-
self.decoders = decoders
58+
self.real_encoders = encoders
59+
self.real_decoders = decoders
60+
61+
# MySQLdb compatibility
62+
if conv is None:
63+
conv = converters.conversions
64+
self.encoders = dict(conv.iteritems())
5965

6066
if charset is not None:
6167
res = libmysql.c.mysql_set_character_set(self._db, charset)
@@ -123,9 +129,9 @@ def cursor(self, cursor_class=None, encoders=None, decoders=None):
123129
if cursor_class is None:
124130
cursor_class = cursors.Cursor
125131
if encoders is None:
126-
encoders = self.encoders[:]
132+
encoders = self.real_encoders[:]
127133
if decoders is None:
128-
decoders = self.decoders[:]
134+
decoders = self.real_decoders[:]
129135
return cursor_class(self, encoders=encoders, decoders=decoders)
130136

131137
def string_literal(self, obj):
@@ -143,5 +149,8 @@ def get_server_info(self):
143149
self._check_closed()
144150
return libmysql.c.mysql_get_server_info(self._db)
145151

152+
def ping(self):
153+
return libmysql.c.mysql_ping(self._db)
154+
146155
def connect(*args, **kwargs):
147-
return Connection(*args, **kwargs)
156+
return Connection(*args, **kwargs)

MySQLdb/converters.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def datetime_encoder(connection, obj):
3030
int: literal_encoder,
3131
bool: lambda connection, obj: str(int(obj)),
3232
unicode: unicode_to_quoted_sql,
33+
str: unicode_to_quoted_sql,
3334
datetime: datetime_encoder,
3435
}
3536

@@ -98,4 +99,8 @@ def fallback_decoder(connection, field):
9899

99100
DEFAULT_DECODERS = [
100101
fallback_decoder,
101-
]
102+
]
103+
104+
# MySQLdb compatibility
105+
conversions = _simple_field_decoders
106+
conversions.update(_simple_field_encoders)

MySQLdb/cursors.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,9 @@ def fetchmany(self, size):
302302
break
303303
self.rows.append(row)
304304
if self.row_index >= len(self.rows):
305-
return []
305+
# MySQLdb compatbility: There are applications checking for tuple
306+
# instead of empty lists or even an iterator...
307+
return ()
306308
row_end = self.row_index + size
307309
if row_end >= len(self.rows):
308310
row_end = len(self.rows)

MySQLdb/libmysql.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ class MYSQL_FIELD(ctypes.Structure):
139139
c.mysql_character_set_name.argtypes = [MYSQL_P]
140140
c.mysql_character_set_name.restype = ctypes.c_char_p
141141

142+
c.mysql_ping.argtypes = [MYSQL_P]
143+
c.mysql_ping.restype = None
144+
142145
# Second thing is an enum, it looks to be a long on Linux systems.
143146
c.mysql_options.argtypes = [MYSQL_P, ctypes.c_long, ctypes.c_char_p]
144147
c.mysql_options.restype = ctypes.c_int

tests/test_connection.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ def test_closed_error(self, connection):
3838
with py.test.raises(connection.InterfaceError) as exc:
3939
connection.rollback()
4040
assert str(exc.value) == "(0, '')"
41+
42+
def test_ping(self, connection):
43+
connection.ping()

0 commit comments

Comments
 (0)