mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-16 03:50:43 +08:00
Add some support for MySQL-3.23 features.
Fixed a few miscellaneous things.
This commit is contained in:
@ -53,6 +53,7 @@ def main():
|
|||||||
href="license.py"), " with it's lack of warranty\n" \
|
href="license.py"), " with it's lack of warranty\n" \
|
||||||
"statement."),
|
"statement."),
|
||||||
P(A("Download", href="."), " the friggin' thing."),
|
P(A("Download", href="."), " the friggin' thing."),
|
||||||
|
P("Read the ", A("FAQ",href="MySQLdb-FAQ.html")),
|
||||||
H2("Overview"),
|
H2("Overview"),
|
||||||
P("MySQLdb is an interface to the popular ",
|
P("MySQLdb is an interface to the popular ",
|
||||||
A("MySQL", href="http://www.mysql.net/mirrors.html"),
|
A("MySQL", href="http://www.mysql.net/mirrors.html"),
|
||||||
|
@ -16,6 +16,7 @@ This module uses the mxDateTime package for handling date/time types.
|
|||||||
|
|
||||||
__version__ = """$Revision$"""[11:-2]
|
__version__ = """$Revision$"""[11:-2]
|
||||||
|
|
||||||
|
import _mysql
|
||||||
from _mysql import *
|
from _mysql import *
|
||||||
from time import localtime
|
from time import localtime
|
||||||
import re, types
|
import re, types
|
||||||
@ -170,7 +171,9 @@ class _Cursor:
|
|||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
self._query(query % escape_row(args, qc))
|
self._query(query % escape_row(args, qc))
|
||||||
except TypeError:
|
except TypeError, m:
|
||||||
|
if m.args[0] == "not enough arguments for format string": raise
|
||||||
|
if m.args[0] == "not all arguments converted": raise
|
||||||
self._query(query % escape_dict(args, qc))
|
self._query(query % escape_dict(args, qc))
|
||||||
|
|
||||||
def executemany(self, query, args):
|
def executemany(self, query, args):
|
||||||
@ -191,7 +194,9 @@ class _Cursor:
|
|||||||
qc = self.connection.quote_conv
|
qc = self.connection.quote_conv
|
||||||
try:
|
try:
|
||||||
q = [query % escape(args[0], qc)]
|
q = [query % escape(args[0], qc)]
|
||||||
except TypeError:
|
except TypeError, m:
|
||||||
|
if m.args[0] == "not enough arguments for format string": raise
|
||||||
|
if m.args[0] == "not all arguments converted": raise
|
||||||
escape = escape_dict
|
escape = escape_dict
|
||||||
q = [query % escape(args[0], qc)]
|
q = [query % escape(args[0], qc)]
|
||||||
qv = query[p:]
|
qv = query[p:]
|
||||||
@ -249,7 +254,15 @@ class _Cursor:
|
|||||||
return self.result.fetch_all_rows_as_dict()
|
return self.result.fetch_all_rows_as_dict()
|
||||||
|
|
||||||
def nextset(self): return None
|
def nextset(self): return None
|
||||||
|
|
||||||
|
def seek(self, row, whence=0):
|
||||||
|
if self.use: raise NotSupportedError, "use must be 0 to use seek"
|
||||||
|
if whence: raise NotSupportedError, "can't do relative seek"
|
||||||
|
return self.result.data_seek(row)
|
||||||
|
## return whence and self.result.row_seek(row) or self.result.data_seek(row)
|
||||||
|
|
||||||
|
## def tell(self): return self.result.row_tell()
|
||||||
|
|
||||||
|
|
||||||
class Connection:
|
class Connection:
|
||||||
|
|
||||||
@ -292,8 +305,18 @@ class Connection:
|
|||||||
"""Close the connection. No further activity possible."""
|
"""Close the connection. No further activity possible."""
|
||||||
self.db.close()
|
self.db.close()
|
||||||
|
|
||||||
def commit(self): """Does nothing as there are no transactions."""
|
if hasattr(_mysql, 'transactions'):
|
||||||
|
def commit(self):
|
||||||
|
"""Commit the current transaction."""
|
||||||
|
return self.db.commit()
|
||||||
|
else:
|
||||||
|
def commit(self): """Does nothing as there are no transactions."""
|
||||||
|
|
||||||
|
if hasattr(_mysql, 'transactions'):
|
||||||
|
def rollback(self):
|
||||||
|
"""Rollback the current transaction."""
|
||||||
|
self.db.rollback()
|
||||||
|
|
||||||
def cursor(self, *args, **kwargs):
|
def cursor(self, *args, **kwargs):
|
||||||
"""Create a cursor on which queries may be performed."""
|
"""Create a cursor on which queries may be performed."""
|
||||||
return apply(self.CursorClass, (self,)+args, kwargs)
|
return apply(self.CursorClass, (self,)+args, kwargs)
|
||||||
@ -314,7 +337,8 @@ class Connection:
|
|||||||
def list_fields(self, table): return self.db.list_fields(table).fetch_all_rows()
|
def list_fields(self, table): return self.db.list_fields(table).fetch_all_rows()
|
||||||
def list_processes(self): return self.db.list_processes().fetch_all_rows()
|
def list_processes(self): return self.db.list_processes().fetch_all_rows()
|
||||||
def list_tables(self, db): return self.db.list_tables(db).fetch_all_rows()
|
def list_tables(self, db): return self.db.list_tables(db).fetch_all_rows()
|
||||||
def num_fields(self): return self.db.num_fields()
|
def field_count(self): return self.db.field_count()
|
||||||
|
num_fields = field_count # used prior to MySQL-3.22.24
|
||||||
def ping(self): return self.db.ping()
|
def ping(self): return self.db.ping()
|
||||||
def row_tell(self): return self.db.row_tell()
|
def row_tell(self): return self.db.row_tell()
|
||||||
def select_db(self, db): return self.db.select_db(db)
|
def select_db(self, db): return self.db.select_db(db)
|
||||||
@ -322,5 +346,11 @@ class Connection:
|
|||||||
def stat(self): return self.db.stat()
|
def stat(self): return self.db.stat()
|
||||||
def thread_id(self): return self.db.thread_id()
|
def thread_id(self): return self.db.thread_id()
|
||||||
|
|
||||||
|
def change_user(self, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
return apply(self.db.change_user, args, kwargs)
|
||||||
|
except AttributeError:
|
||||||
|
raise NotSupportedError, "not supported by MySQL library"
|
||||||
|
|
||||||
|
|
||||||
Connect = connect = Connection
|
Connect = connect = Connection
|
||||||
|
@ -194,6 +194,16 @@ static _mysql_Constant _mysql_Constant_cr[] = {
|
|||||||
{ NULL } /* sentinel */
|
{ NULL } /* sentinel */
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
static _mysql_Constant _mysql_Constant_option[] = {
|
||||||
|
{ "OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT },
|
||||||
|
{ "OPT_COMPRESS", MYSQL_OPT_COMPRESS },
|
||||||
|
{ "OPT_NAMED_PIPE", MYSQL_OPT_NAMED_PIPE },
|
||||||
|
{ "INIT_COMMAND", MYSQL_INIT_COMMAND },
|
||||||
|
{ "READE_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE },
|
||||||
|
{ "READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP },
|
||||||
|
{ NULL } /* sentinel */
|
||||||
|
} ;
|
||||||
|
|
||||||
static _mysql_Constant _mysql_Constant_er[] = {
|
static _mysql_Constant _mysql_Constant_er[] = {
|
||||||
{ "HASHCHK", ER_HASHCHK },
|
{ "HASHCHK", ER_HASHCHK },
|
||||||
{ "NISAMCHK", ER_NISAMCHK },
|
{ "NISAMCHK", ER_NISAMCHK },
|
||||||
@ -855,6 +865,28 @@ _mysql_ResultObject_fetch_rows_as_dict(self, args)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MYSQL_VERSION_ID >= 32303
|
||||||
|
static PyObject *
|
||||||
|
_mysql_ConnectionObject_change_user(self, args, kwargs)
|
||||||
|
_mysql_ConnectionObject *self;
|
||||||
|
PyObject *args, *kwargs;
|
||||||
|
{
|
||||||
|
char *user, *pwd=NULL, *db=NULL;
|
||||||
|
int r;
|
||||||
|
static char *kwlist[] = { "user", "passwd", "db", NULL } ;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|ss:change_user",
|
||||||
|
kwlist, &user, &pwd, &db))
|
||||||
|
return NULL;
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
r = mysql_change_user(&(self->connection), user, pwd, db);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
if (r) return _mysql_Exception(self);
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_get_client_info(self, args)
|
_mysql_get_client_info(self, args)
|
||||||
PyObject *self;
|
PyObject *self;
|
||||||
@ -1001,12 +1033,16 @@ _mysql_ConnectionObject_list_tables(self, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ConnectionObject_num_fields(self, args)
|
_mysql_ConnectionObject_field_count(self, args)
|
||||||
_mysql_ConnectionObject *self;
|
_mysql_ConnectionObject *self;
|
||||||
PyObject *args;
|
PyObject *args;
|
||||||
{
|
{
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
if (!PyArg_NoArgs(args)) return NULL;
|
||||||
|
#if MYSQL_VERSION_ID < 32224
|
||||||
return PyInt_FromLong((long)mysql_num_fields(&(self->connection)));
|
return PyInt_FromLong((long)mysql_num_fields(&(self->connection)));
|
||||||
|
#else
|
||||||
|
return PyInt_FromLong((long)mysql_field_count(&(self->connection)));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
@ -1058,19 +1094,6 @@ _mysql_ConnectionObject_query(self, args)
|
|||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
_mysql_ConnectionObject_row_tell(self, args)
|
|
||||||
_mysql_ConnectionObject *self;
|
|
||||||
PyObject *args;
|
|
||||||
{
|
|
||||||
unsigned int r;
|
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = mysql_insert_id(&(self->connection));
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
return PyInt_FromLong((long)r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ConnectionObject_select_db(self, args)
|
_mysql_ConnectionObject_select_db(self, args)
|
||||||
_mysql_ConnectionObject *self;
|
_mysql_ConnectionObject *self;
|
||||||
@ -1197,15 +1220,38 @@ _mysql_ResultObject_data_seek(self, args)
|
|||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
PyObject *args;
|
PyObject *args;
|
||||||
{
|
{
|
||||||
unsigned int offset;
|
unsigned int row;
|
||||||
if (!PyArg_ParseTuple(args, "i:data_seek", &offset)) return NULL;
|
if (!PyArg_ParseTuple(args, "i:data_seek", &row)) return NULL;
|
||||||
Py_BEGIN_ALLOW_THREADS
|
mysql_data_seek(self->result, row);
|
||||||
mysql_data_seek(self->result, offset);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
_mysql_ResultObject_row_seek(self, args)
|
||||||
|
_mysql_ResultObject *self;
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
MYSQL_ROW_OFFSET r;
|
||||||
|
if (!PyArg_ParseTuple(args, "i:row_seek", &offset)) return NULL;
|
||||||
|
r = mysql_row_tell(self->result);
|
||||||
|
mysql_row_seek(self->result, r+offset);
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
_mysql_ResultObject_row_tell(self, args)
|
||||||
|
_mysql_ResultObject *self;
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
MYSQL_ROW_OFFSET r;
|
||||||
|
if (!PyArg_NoArgs(args)) return NULL;
|
||||||
|
r = mysql_row_tell(self->result);
|
||||||
|
return PyInt_FromLong(r-self->result->data->data);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_mysql_ResultObject_dealloc(self)
|
_mysql_ResultObject_dealloc(self)
|
||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
@ -1228,10 +1274,14 @@ _mysql_ResultObject_repr(self)
|
|||||||
|
|
||||||
static PyMethodDef _mysql_ConnectionObject_methods[] = {
|
static PyMethodDef _mysql_ConnectionObject_methods[] = {
|
||||||
{"affected_rows", (PyCFunction)_mysql_ConnectionObject_affected_rows, 0},
|
{"affected_rows", (PyCFunction)_mysql_ConnectionObject_affected_rows, 0},
|
||||||
|
#if MYSQL_VERSION_ID >= 32303
|
||||||
|
{"change_user", (PyCFunction)_mysql_ConnectionObject_change_user, METH_VARARGS | METH_KEYWORDS},
|
||||||
|
#endif
|
||||||
{"close", (PyCFunction)_mysql_ConnectionObject_close, 0},
|
{"close", (PyCFunction)_mysql_ConnectionObject_close, 0},
|
||||||
{"dump_debug_info", (PyCFunction)_mysql_ConnectionObject_dump_debug_info, 0},
|
{"dump_debug_info", (PyCFunction)_mysql_ConnectionObject_dump_debug_info, 0},
|
||||||
{"error", (PyCFunction)_mysql_ConnectionObject_error, 0},
|
{"error", (PyCFunction)_mysql_ConnectionObject_error, 0},
|
||||||
{"errno", (PyCFunction)_mysql_ConnectionObject_errno, 0},
|
{"errno", (PyCFunction)_mysql_ConnectionObject_errno, 0},
|
||||||
|
{"field_count", (PyCFunction)_mysql_ConnectionObject_field_count, 0},
|
||||||
{"get_host_info", (PyCFunction)_mysql_ConnectionObject_get_host_info, 0},
|
{"get_host_info", (PyCFunction)_mysql_ConnectionObject_get_host_info, 0},
|
||||||
{"get_proto_info", (PyCFunction)_mysql_ConnectionObject_get_proto_info, 0},
|
{"get_proto_info", (PyCFunction)_mysql_ConnectionObject_get_proto_info, 0},
|
||||||
{"get_server_info", (PyCFunction)_mysql_ConnectionObject_get_server_info, 0},
|
{"get_server_info", (PyCFunction)_mysql_ConnectionObject_get_server_info, 0},
|
||||||
@ -1242,10 +1292,8 @@ static PyMethodDef _mysql_ConnectionObject_methods[] = {
|
|||||||
{"list_fields", (PyCFunction)_mysql_ConnectionObject_list_fields, 1},
|
{"list_fields", (PyCFunction)_mysql_ConnectionObject_list_fields, 1},
|
||||||
{"list_processes", (PyCFunction)_mysql_ConnectionObject_list_processes, 0},
|
{"list_processes", (PyCFunction)_mysql_ConnectionObject_list_processes, 0},
|
||||||
{"list_tables", (PyCFunction)_mysql_ConnectionObject_list_tables, 1},
|
{"list_tables", (PyCFunction)_mysql_ConnectionObject_list_tables, 1},
|
||||||
{"num_fields", (PyCFunction)_mysql_ConnectionObject_num_fields, 0},
|
|
||||||
{"ping", (PyCFunction)_mysql_ConnectionObject_ping, 0},
|
{"ping", (PyCFunction)_mysql_ConnectionObject_ping, 0},
|
||||||
{"query", (PyCFunction)_mysql_ConnectionObject_query, 1},
|
{"query", (PyCFunction)_mysql_ConnectionObject_query, 1},
|
||||||
{"row_tell", (PyCFunction)_mysql_ConnectionObject_row_tell, 0},
|
|
||||||
{"select_db", (PyCFunction)_mysql_ConnectionObject_select_db, 1},
|
{"select_db", (PyCFunction)_mysql_ConnectionObject_select_db, 1},
|
||||||
{"shutdown", (PyCFunction)_mysql_ConnectionObject_shutdown, 0},
|
{"shutdown", (PyCFunction)_mysql_ConnectionObject_shutdown, 0},
|
||||||
{"stat", (PyCFunction)_mysql_ConnectionObject_stat, 0},
|
{"stat", (PyCFunction)_mysql_ConnectionObject_stat, 0},
|
||||||
@ -1264,6 +1312,8 @@ static struct memberlist _mysql_ConnectionObject_memberlist[] = {
|
|||||||
|
|
||||||
static PyMethodDef _mysql_ResultObject_methods[] = {
|
static PyMethodDef _mysql_ResultObject_methods[] = {
|
||||||
{"data_seek", (PyCFunction)_mysql_ResultObject_data_seek, 1},
|
{"data_seek", (PyCFunction)_mysql_ResultObject_data_seek, 1},
|
||||||
|
{"row_seek", (PyCFunction)_mysql_ResultObject_row_seek, 1},
|
||||||
|
{"row_tell", (PyCFunction)_mysql_ResultObject_row_tell, 0},
|
||||||
{"describe", (PyCFunction)_mysql_ResultObject_describe, 0},
|
{"describe", (PyCFunction)_mysql_ResultObject_describe, 0},
|
||||||
{"fetch_row", (PyCFunction)_mysql_ResultObject_fetch_row, 0},
|
{"fetch_row", (PyCFunction)_mysql_ResultObject_fetch_row, 0},
|
||||||
{"fetch_row_as_dict", (PyCFunction)_mysql_ResultObject_fetch_row_as_dict, 0},
|
{"fetch_row_as_dict", (PyCFunction)_mysql_ResultObject_fetch_row_as_dict, 0},
|
||||||
@ -1524,6 +1574,8 @@ init_mysql()
|
|||||||
goto error;
|
goto error;
|
||||||
if (_mysql_Constant_class(dict, "ER", _mysql_Constant_er))
|
if (_mysql_Constant_class(dict, "ER", _mysql_Constant_er))
|
||||||
goto error;
|
goto error;
|
||||||
|
if (_mysql_Constant_class(dict, "option", _mysql_Constant_option))
|
||||||
|
goto error;
|
||||||
if (!(_mysql_NULL = PyString_FromString("NULL")))
|
if (!(_mysql_NULL = PyString_FromString("NULL")))
|
||||||
goto error;
|
goto error;
|
||||||
if (PyDict_SetItemString(dict, "NULL", _mysql_NULL)) goto error;
|
if (PyDict_SetItemString(dict, "NULL", _mysql_NULL)) goto error;
|
||||||
|
Reference in New Issue
Block a user