From ad6b9b7b392b82ef737f464610e4cf18d89f5066 Mon Sep 17 00:00:00 2001 From: adustman Date: Wed, 8 Mar 2000 22:29:35 +0000 Subject: [PATCH] Add support for returning values as dictionaries a la MySQLmodule. --- mysql/_mysqlmodule.c | 110 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/mysql/_mysqlmodule.c b/mysql/_mysqlmodule.c index ee691fc..94d85c1 100644 --- a/mysql/_mysqlmodule.c +++ b/mysql/_mysqlmodule.c @@ -698,6 +698,63 @@ _mysql_ResultObject_fetch_row(self, args) return NULL; } +static PyObject * +_mysql_ResultObject_fetch_row_as_dict(self, args) + _mysql_ResultObject *self; + PyObject *args; +{ + unsigned int n, i; + unsigned long *length; + PyObject *r, *c; + MYSQL_ROW row; + 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); + 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; + length = mysql_fetch_lengths(self->result); + fields = mysql_fetch_fields(self->result); + for (i=0; iconverter, i); + if (c != Py_None) + v = PyObject_CallFunction(c, + "s#", + row[i], + (int)length[i]); + else + v = PyString_FromStringAndSize(row[i], + (int)length[i]); + if (!v) goto error; + } + else { + Py_INCREF(Py_None); + v = Py_None; + } + PyMapping_SetItemString(r, fields[i].name, v); + Py_DECREF(v); + } + return r; + error: + Py_XDECREF(r); + return NULL; +} + static PyObject * _mysql_ResultObject_fetch_all_rows(self, args) _mysql_ResultObject *self; @@ -721,6 +778,29 @@ _mysql_ResultObject_fetch_all_rows(self, args) 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; @@ -748,6 +828,33 @@ _mysql_ResultObject_fetch_rows(self, args) return NULL; } +static PyObject * +_mysql_ResultObject_fetch_rows_as_dict(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; i