mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-15 19:31:54 +08:00
Optimization (I hope).
This commit is contained in:
@ -56,7 +56,7 @@ cp MySQLdb.py{,c,o} $RPM_BUILD_ROOT/usr/lib/python1.5/site-packages
|
|||||||
%clean
|
%clean
|
||||||
%files
|
%files
|
||||||
%defattr(-, root, root)
|
%defattr(-, root, root)
|
||||||
%doc ZMySQLDA.patch license.py examples/README examples/dbtrainer0 examples/dbtrainer1 examples/dbtrainer2 examples/dbtrainer3 examples/dbtrainer4 examples/test.sql doc/*
|
%doc license.py examples/* doc/*
|
||||||
/usr/lib/python1.5/site-packages/MySQLdb.py
|
/usr/lib/python1.5/site-packages/MySQLdb.py
|
||||||
/usr/lib/python1.5/site-packages/MySQLdb.pyc
|
/usr/lib/python1.5/site-packages/MySQLdb.pyc
|
||||||
/usr/lib/python1.5/site-packages/MySQLdb.pyo
|
/usr/lib/python1.5/site-packages/MySQLdb.pyo
|
||||||
|
@ -344,16 +344,32 @@ class CursorUseResultMixIn:
|
|||||||
|
|
||||||
class CursorTupleRowsMixIn:
|
class CursorTupleRowsMixIn:
|
||||||
|
|
||||||
def _fetch_row(self): return self._result.fetch_row()
|
def _fetch_row(self): return self._result.fetch(1)[0]
|
||||||
def _fetch_rows(self, size): return self._result.fetch_rows(size)
|
|
||||||
def _fetch_all_rows(self): return self._result.fetch_all_rows()
|
def _fetch_rows(self, size): return self._result.fetch(size)
|
||||||
|
|
||||||
|
def _fetch_all_rows(self):
|
||||||
|
r = list(self._result.fetch(self.arraysize))
|
||||||
|
while len(r) >= self.arraysize:
|
||||||
|
rows = self._result.fetch(self.arraysize)
|
||||||
|
if not rows: break
|
||||||
|
r.extend(list(rows))
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
class CursorDictRowsMixIn:
|
class CursorDictRowsMixIn:
|
||||||
|
|
||||||
def _fetch_row(self): return self._result.fetch_row_as_dict()
|
def _fetch_row(self): return self._result.fetch(1, 1)[0]
|
||||||
def _fetch_rows(self, size): return self._result.fetch_rows_as_dict(size)
|
|
||||||
def _fetch_all_rows(self): return self._result.fetch_all_rows_as_dict()
|
def _fetch_rows(self, size): return self._result.fetch(size, 1)
|
||||||
|
|
||||||
|
def _fetch_all_rows(self):
|
||||||
|
r = list(self._result.fetch(self.arraysize, 1))
|
||||||
|
while len(r) >= self.arraysize:
|
||||||
|
rows = self._result.fetch(self.arraysize, 1)
|
||||||
|
if not rows: break
|
||||||
|
r.extend(list(rows))
|
||||||
|
return r
|
||||||
|
|
||||||
## XXX Deprecated
|
## XXX Deprecated
|
||||||
|
|
||||||
|
@ -673,51 +673,47 @@ _mysql_ResultObject_field_flags(self, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ResultObject_fetch_row(self, args)
|
_mysql_field_to_python(converter, rowitem, length)
|
||||||
|
PyObject *converter;
|
||||||
|
char *rowitem;
|
||||||
|
unsigned long length;
|
||||||
|
{
|
||||||
|
PyObject *v;
|
||||||
|
if (rowitem) {
|
||||||
|
if (converter != Py_None)
|
||||||
|
v = PyObject_CallFunction(converter,
|
||||||
|
"s#",
|
||||||
|
rowitem,
|
||||||
|
(int)length);
|
||||||
|
else
|
||||||
|
v = PyString_FromStringAndSize(rowitem,
|
||||||
|
(int)length);
|
||||||
|
if (!v)
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
v = Py_None;
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
_mysql_row_to_tuple(self, row)
|
||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
PyObject *args;
|
MYSQL_ROW row;
|
||||||
{
|
{
|
||||||
unsigned int n, i;
|
unsigned int n, i;
|
||||||
unsigned long *length;
|
unsigned long *length;
|
||||||
PyObject *r, *c;
|
PyObject *r, *c;
|
||||||
MYSQL_ROW row;
|
|
||||||
if (!args) {
|
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
|
||||||
}
|
|
||||||
if (!self->use)
|
|
||||||
row = mysql_fetch_row(self->result);
|
|
||||||
else {
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
|
||||||
row = mysql_fetch_row(self->result);
|
|
||||||
Py_END_ALLOW_THREADS;
|
|
||||||
}
|
|
||||||
n = mysql_num_fields(self->result);
|
n = mysql_num_fields(self->result);
|
||||||
if (!row && mysql_errno(self->connection))
|
|
||||||
return _mysql_Exception(self->connection);
|
|
||||||
if (!row) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
if (!(r = PyTuple_New(n))) return NULL;
|
if (!(r = PyTuple_New(n))) return NULL;
|
||||||
length = mysql_fetch_lengths(self->result);
|
length = mysql_fetch_lengths(self->result);
|
||||||
for (i=0; i<n; i++) {
|
for (i=0; i<n; i++) {
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
if (row[i]) {
|
|
||||||
c = PyTuple_GET_ITEM(self->converter, i);
|
c = PyTuple_GET_ITEM(self->converter, i);
|
||||||
if (c != Py_None)
|
v = _mysql_field_to_python(c, row[i], length[i]);
|
||||||
v = PyObject_CallFunction(c,
|
|
||||||
"s#",
|
|
||||||
row[i],
|
|
||||||
(int)length[i]);
|
|
||||||
else
|
|
||||||
v = PyString_FromStringAndSize(row[i],
|
|
||||||
(int)length[i]);
|
|
||||||
if (!v) goto error;
|
if (!v) goto error;
|
||||||
}
|
|
||||||
else {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
v = Py_None;
|
|
||||||
}
|
|
||||||
PyTuple_SET_ITEM(r, i, v);
|
PyTuple_SET_ITEM(r, i, v);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
@ -727,53 +723,24 @@ _mysql_ResultObject_fetch_row(self, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ResultObject_fetch_row_as_dict(self, args)
|
_mysql_row_to_dict(self, row)
|
||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
PyObject *args;
|
MYSQL_ROW row;
|
||||||
{
|
{
|
||||||
unsigned int n, i;
|
unsigned int n, i;
|
||||||
unsigned long *length;
|
unsigned long *length;
|
||||||
PyObject *r, *c;
|
PyObject *r, *c;
|
||||||
MYSQL_ROW row;
|
|
||||||
MYSQL_FIELD *fields;
|
MYSQL_FIELD *fields;
|
||||||
if (!args) {
|
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
|
||||||
}
|
|
||||||
if (!self->use)
|
|
||||||
row = mysql_fetch_row(self->result);
|
|
||||||
else {
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
|
||||||
row = mysql_fetch_row(self->result);
|
|
||||||
Py_END_ALLOW_THREADS;
|
|
||||||
}
|
|
||||||
n = mysql_num_fields(self->result);
|
n = mysql_num_fields(self->result);
|
||||||
if (!row && mysql_errno(self->connection))
|
|
||||||
return _mysql_Exception(self->connection);
|
|
||||||
if (!row) {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
if (!(r = PyDict_New())) return NULL;
|
if (!(r = PyDict_New())) return NULL;
|
||||||
length = mysql_fetch_lengths(self->result);
|
length = mysql_fetch_lengths(self->result);
|
||||||
fields = mysql_fetch_fields(self->result);
|
fields = mysql_fetch_fields(self->result);
|
||||||
for (i=0; i<n; i++) {
|
for (i=0; i<n; i++) {
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
if (row[i]) {
|
|
||||||
c = PyTuple_GET_ITEM(self->converter, i);
|
c = PyTuple_GET_ITEM(self->converter, i);
|
||||||
if (c != Py_None)
|
v = _mysql_field_to_python(c, row[i], length[i]);
|
||||||
v = PyObject_CallFunction(c,
|
|
||||||
"s#",
|
|
||||||
row[i],
|
|
||||||
(int)length[i]);
|
|
||||||
else
|
|
||||||
v = PyString_FromStringAndSize(row[i],
|
|
||||||
(int)length[i]);
|
|
||||||
if (!v) goto error;
|
if (!v) goto error;
|
||||||
}
|
|
||||||
else {
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
v = Py_None;
|
|
||||||
}
|
|
||||||
if (!PyMapping_HasKeyString(r, fields[i].name)) {
|
if (!PyMapping_HasKeyString(r, fields[i].name)) {
|
||||||
PyMapping_SetItemString(r, fields[i].name, v);
|
PyMapping_SetItemString(r, fields[i].name, v);
|
||||||
} else {
|
} else {
|
||||||
@ -795,71 +762,35 @@ _mysql_ResultObject_fetch_row_as_dict(self, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ResultObject_fetch_all_rows(self, args)
|
_mysql_row_to_dict_old(self, row)
|
||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
PyObject *args;
|
MYSQL_ROW row;
|
||||||
{
|
|
||||||
PyObject *r;
|
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
|
||||||
if (!(r = PyList_New(0))) return NULL;
|
|
||||||
while (1) {
|
|
||||||
PyObject *v = _mysql_ResultObject_fetch_row(self, NULL);
|
|
||||||
if (!v) goto error;
|
|
||||||
if (v == Py_None) {
|
|
||||||
Py_DECREF(v);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
PyList_Append(r, v);
|
|
||||||
Py_DECREF(v);
|
|
||||||
}
|
|
||||||
error:
|
|
||||||
Py_XDECREF(r);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
_mysql_ResultObject_fetch_all_rows_as_dict(self, args)
|
|
||||||
_mysql_ResultObject *self;
|
|
||||||
PyObject *args;
|
|
||||||
{
|
|
||||||
PyObject *r;
|
|
||||||
if (!PyArg_NoArgs(args)) return NULL;
|
|
||||||
if (!(r = PyList_New(0))) return NULL;
|
|
||||||
while (1) {
|
|
||||||
PyObject *v = _mysql_ResultObject_fetch_row_as_dict(self, NULL);
|
|
||||||
if (!v) goto error;
|
|
||||||
if (v == Py_None) {
|
|
||||||
Py_DECREF(v);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
PyList_Append(r, v);
|
|
||||||
Py_DECREF(v);
|
|
||||||
}
|
|
||||||
error:
|
|
||||||
Py_XDECREF(r);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
_mysql_ResultObject_fetch_rows(self, args)
|
|
||||||
_mysql_ResultObject *self;
|
|
||||||
PyObject *args;
|
|
||||||
{
|
{
|
||||||
unsigned int n, i;
|
unsigned int n, i;
|
||||||
PyObject *r;
|
unsigned long *length;
|
||||||
|
PyObject *r, *c;
|
||||||
|
MYSQL_FIELD *fields;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "i", &n)) return NULL;
|
n = mysql_num_fields(self->result);
|
||||||
if (!(r = PyTuple_New(n))) return NULL;
|
if (!(r = PyDict_New())) return NULL;
|
||||||
for (i = 0; i<n; i++) {
|
length = mysql_fetch_lengths(self->result);
|
||||||
PyObject *v = _mysql_ResultObject_fetch_row(self, NULL);
|
fields = mysql_fetch_fields(self->result);
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
PyObject *v;
|
||||||
|
c = PyTuple_GET_ITEM(self->converter, i);
|
||||||
|
v = _mysql_field_to_python(c, row[i], length[i]);
|
||||||
if (!v) goto error;
|
if (!v) goto error;
|
||||||
if (v == Py_None) {
|
{
|
||||||
Py_DECREF(v);
|
int len;
|
||||||
if (_PyTuple_Resize(&r, i, 0) == -1)
|
char buf[256];
|
||||||
goto error;
|
strncpy(buf, fields[i].table, 256);
|
||||||
return r;
|
len = strlen(buf);
|
||||||
|
strncat(buf, ".", 256-len);
|
||||||
|
len = strlen(buf);
|
||||||
|
strncat(buf, fields[i].name, 256-len);
|
||||||
|
PyMapping_SetItemString(r, buf, v);
|
||||||
}
|
}
|
||||||
PyTuple_SET_ITEM(r, i, v);
|
Py_DECREF(v);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
error:
|
error:
|
||||||
@ -868,24 +799,50 @@ _mysql_ResultObject_fetch_rows(self, args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_mysql_ResultObject_fetch_rows_as_dict(self, args)
|
_mysql_ResultObject_fetch(self, args, kwargs)
|
||||||
_mysql_ResultObject *self;
|
_mysql_ResultObject *self;
|
||||||
PyObject *args;
|
PyObject *args, *kwargs;
|
||||||
{
|
{
|
||||||
unsigned int n, i;
|
typedef PyObject *_PYFUNC();
|
||||||
|
static char *kwlist[] = { "maxrows", "as_dict", NULL };
|
||||||
|
static _PYFUNC *row_converters[] =
|
||||||
|
{
|
||||||
|
_mysql_row_to_tuple,
|
||||||
|
_mysql_row_to_dict,
|
||||||
|
_mysql_row_to_dict_old
|
||||||
|
};
|
||||||
|
_PYFUNC *convert_row;
|
||||||
|
unsigned int maxrows=1, as_dict=0, i;
|
||||||
PyObject *r;
|
PyObject *r;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "i", &n)) return NULL;
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii:fetch", kwlist,
|
||||||
if (!(r = PyTuple_New(n))) return NULL;
|
&maxrows, &as_dict))
|
||||||
for (i = 0; i<n; i++) {
|
return NULL;
|
||||||
PyObject *v = _mysql_ResultObject_fetch_row_as_dict(self, NULL);
|
if (as_dict < 0 || as_dict >= sizeof(row_converters)) {
|
||||||
if (!v) goto error;
|
PyErr_SetString(PyExc_ValueError, "as_dict out of range");
|
||||||
if (v == Py_None) {
|
return NULL;
|
||||||
Py_DECREF(v);
|
|
||||||
if (_PyTuple_Resize(&r, i, 0) == -1)
|
|
||||||
goto error;
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
convert_row = row_converters[as_dict];
|
||||||
|
|
||||||
|
if (!(r = PyTuple_New(maxrows))) return NULL;
|
||||||
|
for (i = 0; i<maxrows; i++) {
|
||||||
|
PyObject *v;
|
||||||
|
if (!self->use)
|
||||||
|
row = mysql_fetch_row(self->result);
|
||||||
|
else {
|
||||||
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
|
row = mysql_fetch_row(self->result);
|
||||||
|
Py_END_ALLOW_THREADS;
|
||||||
|
}
|
||||||
|
if (!row && mysql_errno(self->connection))
|
||||||
|
return _mysql_Exception(self->connection);
|
||||||
|
if (!row) {
|
||||||
|
if (_PyTuple_Resize(&r, i, 0) == -1) goto error;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
v = convert_row(self, row);
|
||||||
|
if (!v) goto error;
|
||||||
PyTuple_SET_ITEM(r, i, v);
|
PyTuple_SET_ITEM(r, i, v);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
@ -1355,12 +1312,7 @@ static PyMethodDef _mysql_ResultObject_methods[] = {
|
|||||||
{"row_seek", (PyCFunction)_mysql_ResultObject_row_seek, 1},
|
{"row_seek", (PyCFunction)_mysql_ResultObject_row_seek, 1},
|
||||||
{"row_tell", (PyCFunction)_mysql_ResultObject_row_tell, 0},
|
{"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", (PyCFunction)_mysql_ResultObject_fetch, METH_VARARGS | METH_KEYWORDS},
|
||||||
{"fetch_row_as_dict", (PyCFunction)_mysql_ResultObject_fetch_row_as_dict, 0},
|
|
||||||
{"fetch_rows", (PyCFunction)_mysql_ResultObject_fetch_rows, 1},
|
|
||||||
{"fetch_rows_as_dict", (PyCFunction)_mysql_ResultObject_fetch_rows_as_dict, 1},
|
|
||||||
{"fetch_all_rows", (PyCFunction)_mysql_ResultObject_fetch_all_rows, 0},
|
|
||||||
{"fetch_all_rows_as_dict", (PyCFunction)_mysql_ResultObject_fetch_all_rows_as_dict, 0},
|
|
||||||
{"field_flags", (PyCFunction)_mysql_ResultObject_field_flags, 0},
|
{"field_flags", (PyCFunction)_mysql_ResultObject_field_flags, 0},
|
||||||
{"num_fields", (PyCFunction)_mysql_ResultObject_num_fields, 0},
|
{"num_fields", (PyCFunction)_mysql_ResultObject_num_fields, 0},
|
||||||
{"num_rows", (PyCFunction)_mysql_ResultObject_num_rows, 0},
|
{"num_rows", (PyCFunction)_mysql_ResultObject_num_rows, 0},
|
||||||
|
Reference in New Issue
Block a user