diff options
author | Peter Eisentraut | 2012-01-30 19:38:52 +0000 |
---|---|---|
committer | Peter Eisentraut | 2012-01-30 19:38:52 +0000 |
commit | ee7fa66b19f5454fac07caee4b7798810b579a82 (patch) | |
tree | 2cb224c8f99c3626f562f14fa7aa9b6990465010 /src/pl/plpython/plpy_resultobject.c | |
parent | c6ea8ccea6bf23501962ddc7ac9ffdb99c8643e1 (diff) |
PL/Python: Add result metadata functions
Add result object functions .colnames, .coltypes, .coltypmods to
obtain information about the result column names and types, which was
previously not possible in the PL/Python SPI interface.
reviewed by Abhijit Menon-Sen
Diffstat (limited to 'src/pl/plpython/plpy_resultobject.c')
-rw-r--r-- | src/pl/plpython/plpy_resultobject.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/pl/plpython/plpy_resultobject.c b/src/pl/plpython/plpy_resultobject.c index bf46a165959..b25e8083b9e 100644 --- a/src/pl/plpython/plpy_resultobject.c +++ b/src/pl/plpython/plpy_resultobject.c @@ -12,6 +12,9 @@ static void PLy_result_dealloc(PyObject *arg); +static PyObject *PLy_result_colnames(PyObject *self, PyObject *unused); +static PyObject *PLy_result_coltypes(PyObject *self, PyObject *unused); +static PyObject *PLy_result_coltypmods(PyObject *self, PyObject *unused); static PyObject *PLy_result_nrows(PyObject *self, PyObject *args); static PyObject *PLy_result_status(PyObject *self, PyObject *args); static Py_ssize_t PLy_result_length(PyObject *arg); @@ -35,6 +38,9 @@ static PySequenceMethods PLy_result_as_sequence = { }; static PyMethodDef PLy_result_methods[] = { + {"colnames", PLy_result_colnames, METH_NOARGS, NULL}, + {"coltypes", PLy_result_coltypes, METH_NOARGS, NULL}, + {"coltypmods", PLy_result_coltypmods, METH_NOARGS, NULL}, {"nrows", PLy_result_nrows, METH_VARARGS, NULL}, {"status", PLy_result_status, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} @@ -96,6 +102,7 @@ PLy_result_new(void) ob->status = Py_None; ob->nrows = PyInt_FromLong(-1); ob->rows = PyList_New(0); + ob->tupdesc = NULL; return (PyObject *) ob; } @@ -108,11 +115,58 @@ PLy_result_dealloc(PyObject *arg) Py_XDECREF(ob->nrows); Py_XDECREF(ob->rows); Py_XDECREF(ob->status); + if (ob->tupdesc) + { + FreeTupleDesc(ob->tupdesc); + ob->tupdesc = NULL; + } arg->ob_type->tp_free(arg); } static PyObject * +PLy_result_colnames(PyObject *self, PyObject *unused) +{ + PLyResultObject *ob = (PLyResultObject *) self; + PyObject *list; + int i; + + list = PyList_New(ob->tupdesc->natts); + for (i = 0; i < ob->tupdesc->natts; i++) + PyList_SET_ITEM(list, i, PyString_FromString(NameStr(ob->tupdesc->attrs[i]->attname))); + + return list; +} + +static PyObject * +PLy_result_coltypes(PyObject *self, PyObject *unused) +{ + PLyResultObject *ob = (PLyResultObject *) self; + PyObject *list; + int i; + + list = PyList_New(ob->tupdesc->natts); + for (i = 0; i < ob->tupdesc->natts; i++) + PyList_SET_ITEM(list, i, PyInt_FromLong(ob->tupdesc->attrs[i]->atttypid)); + + return list; +} + +static PyObject * +PLy_result_coltypmods(PyObject *self, PyObject *unused) +{ + PLyResultObject *ob = (PLyResultObject *) self; + PyObject *list; + int i; + + list = PyList_New(ob->tupdesc->natts); + for (i = 0; i < ob->tupdesc->natts; i++) + PyList_SET_ITEM(list, i, PyInt_FromLong(ob->tupdesc->attrs[i]->atttypmod)); + + return list; +} + +static PyObject * PLy_result_nrows(PyObject *self, PyObject *args) { PLyResultObject *ob = (PLyResultObject *) self; |