Optimization (I hope).

This commit is contained in:
adustman
2000-05-02 04:39:51 +00:00
parent bdb3b8948d
commit ad5a4e3056
3 changed files with 124 additions and 156 deletions

View File

@ -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

View File

@ -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

View File

@ -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},