From 8ac921c3040e25f7e5ef10445fc2c5fe468c51ee Mon Sep 17 00:00:00 2001 From: adustman Date: Thu, 25 Mar 1999 07:11:24 +0000 Subject: [PATCH] Added some new result object methods for fetching many or all rows, which should speed things up a bit. Not that it's slow... Records whether the result was obtained by mysql_store_result or mysql_use_result so it can avoid giving up the global interpreter lock when store was used. I'm assuming the other functions which return a result set (i.e. mysql_list_dbs, mysql_list_tables, etc.) effectively use mysql_store_result. --- mysql/_mysqlmodule.c | 85 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/mysql/_mysqlmodule.c b/mysql/_mysqlmodule.c index 5c1e8a9..9a990b9 100644 --- a/mysql/_mysqlmodule.c +++ b/mysql/_mysqlmodule.c @@ -27,6 +27,7 @@ typedef struct { MYSQL *connection; MYSQL_RES *result; int nfields; + int use; PyObject **converter; } _mysql_ResultObject; @@ -340,9 +341,10 @@ static _mysql_Constant _mysql_Constant_er[] = { } ; static _mysql_ResultObject* -_mysql_ResultObject_New(conn, result) +_mysql_ResultObject_New(conn, result, use) _mysql_ConnectionObject *conn; MYSQL_RES *result; + int use; { int n, i; MYSQL_FIELD *fields; @@ -352,6 +354,7 @@ _mysql_ResultObject_New(conn, result) r->connection = &conn->connection; r->conn = (PyObject *) conn; r->converter = NULL; + r->use = use; Py_INCREF(conn); r->result = result; n = mysql_num_fields(result); @@ -608,10 +611,16 @@ _mysql_ResultObject_fetch_row(self, args) unsigned long *length; PyObject *r; MYSQL_ROW row; - if (!PyArg_NoArgs(args)) return NULL; - Py_BEGIN_ALLOW_THREADS - row = mysql_fetch_row(self->result); - Py_END_ALLOW_THREADS; + 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); if (!row && mysql_errno(self->connection)) return _mysql_Exception(self->connection); @@ -646,6 +655,58 @@ _mysql_ResultObject_fetch_row(self, args) return NULL; } +static PyObject * +_mysql_ResultObject_fetch_all_rows(self, args) + _mysql_ResultObject *self; + PyObject *args; +{ + unsigned int n, i; + unsigned long *length; + 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_rows(self, args) + _mysql_ResultObject *self; + PyObject *args; +{ + unsigned int n, i; + PyObject *r; + + if (!PyArg_ParseTuple(args, "i", &n)) return NULL; + if (!(r = PyTuple_New(n))) return NULL; + for (i = 0; iconnection), wild); Py_END_ALLOW_THREADS if (!result) return _mysql_Exception(self); - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 0); } static PyObject * @@ -754,7 +815,7 @@ _mysql_ConnectionObject_list_fields(self, args) result = mysql_list_fields(&(self->connection), table, wild); Py_END_ALLOW_THREADS if (!result) return _mysql_Exception(self); - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 0); } static PyObject * @@ -769,7 +830,7 @@ _mysql_ConnectionObject_list_processes(self, args) result = mysql_list_processes(&(self->connection)); Py_END_ALLOW_THREADS if (!result) return _mysql_Exception(self); - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 0); } static PyObject * @@ -785,7 +846,7 @@ _mysql_ConnectionObject_list_tables(self, args) result = mysql_list_tables(&(self->connection), wild); Py_END_ALLOW_THREADS if (!result) return _mysql_Exception(self); - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 0); } static PyObject * @@ -920,7 +981,7 @@ _mysql_ConnectionObject_store_result(self, args) Py_INCREF(Py_None); return Py_None; } - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 0); } static PyObject * @@ -951,7 +1012,7 @@ _mysql_ConnectionObject_use_result(self, args) Py_INCREF(Py_None); return Py_None; } - return (PyObject *) _mysql_ResultObject_New(self, result); + return (PyObject *) _mysql_ResultObject_New(self, result, 1); } static void @@ -1053,6 +1114,8 @@ static PyMethodDef _mysql_ResultObject_methods[] = { {"data_seek", (PyCFunction)_mysql_ResultObject_data_seek, 1}, {"describe", (PyCFunction)_mysql_ResultObject_describe, 0}, {"fetch_row", (PyCFunction)_mysql_ResultObject_fetch_row, 0}, + {"fetch_rows", (PyCFunction)_mysql_ResultObject_fetch_rows, 1}, + {"fetch_all_rows", (PyCFunction)_mysql_ResultObject_fetch_all_rows, 0}, {"field_flags", (PyCFunction)_mysql_ResultObject_field_flags, 0}, {"num_fields", (PyCFunction)_mysql_ResultObject_num_fields, 0}, {"num_rows", (PyCFunction)_mysql_ResultObject_num_rows, 0},