summaryrefslogtreecommitdiff
path: root/src/pl/plpython/plpy_resultobject.c
diff options
context:
space:
mode:
authorPeter Eisentraut2012-05-10 17:38:17 +0000
committerPeter Eisentraut2012-05-10 17:40:30 +0000
commita97207b6908f1d4a7d19b37b818367bb0171039f (patch)
tree2449209dd19a0894107b9c616b0451b4a5f06a4c /src/pl/plpython/plpy_resultobject.c
parent1540d3bf4d405278533377ba81dbbf1c857eaec0 (diff)
PL/Python: Fix slicing support for result objects for Python 3
The old way of implementing slicing support by implementing PySequenceMethods.sq_slice no longer works in Python 3. You now have to implement PyMappingMethods.mp_subscript. Do this by simply proxying the call to the wrapped list of result dictionaries. Consolidate some of the subscripting regression tests. Jan UrbaƄski
Diffstat (limited to 'src/pl/plpython/plpy_resultobject.c')
-rw-r--r--src/pl/plpython/plpy_resultobject.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/pl/plpython/plpy_resultobject.c b/src/pl/plpython/plpy_resultobject.c
index fcf8074228d..deaddb7980f 100644
--- a/src/pl/plpython/plpy_resultobject.c
+++ b/src/pl/plpython/plpy_resultobject.c
@@ -23,6 +23,8 @@ static PyObject *PLy_result_item(PyObject *arg, Py_ssize_t idx);
static PyObject *PLy_result_slice(PyObject *arg, Py_ssize_t lidx, Py_ssize_t hidx);
static int PLy_result_ass_item(PyObject *arg, Py_ssize_t idx, PyObject *item);
static int PLy_result_ass_slice(PyObject *rg, Py_ssize_t lidx, Py_ssize_t hidx, PyObject *slice);
+static PyObject *PLy_result_subscript(PyObject *arg, PyObject *item);
+static int PLy_result_ass_subscript(PyObject* self, PyObject* item, PyObject* value);
static char PLy_result_doc[] = {
"Results of a PostgreSQL query"
@@ -38,6 +40,12 @@ static PySequenceMethods PLy_result_as_sequence = {
PLy_result_ass_slice, /* sq_ass_slice */
};
+static PyMappingMethods PLy_result_as_mapping = {
+ PLy_result_length, /* mp_length */
+ PLy_result_subscript, /* mp_subscript */
+ PLy_result_ass_subscript, /* mp_ass_subscript */
+};
+
static PyMethodDef PLy_result_methods[] = {
{"colnames", PLy_result_colnames, METH_NOARGS, NULL},
{"coltypes", PLy_result_coltypes, METH_NOARGS, NULL},
@@ -64,7 +72,7 @@ static PyTypeObject PLy_ResultType = {
0, /* tp_repr */
0, /* tp_as_number */
&PLy_result_as_sequence, /* tp_as_sequence */
- 0, /* tp_as_mapping */
+ &PLy_result_as_mapping, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
@@ -251,3 +259,19 @@ PLy_result_ass_slice(PyObject *arg, Py_ssize_t lidx, Py_ssize_t hidx, PyObject *
rv = PyList_SetSlice(ob->rows, lidx, hidx, slice);
return rv;
}
+
+static PyObject *
+PLy_result_subscript(PyObject *arg, PyObject *item)
+{
+ PLyResultObject *ob = (PLyResultObject *) arg;
+
+ return PyObject_GetItem(ob->rows, item);
+}
+
+static int
+PLy_result_ass_subscript(PyObject *arg, PyObject *item, PyObject *value)
+{
+ PLyResultObject *ob = (PLyResultObject *) arg;
+
+ return PyObject_SetItem(ob->rows, item, value);
+}