diff options
author | Peter Eisentraut | 2012-05-10 17:38:17 +0000 |
---|---|---|
committer | Peter Eisentraut | 2012-05-10 17:40:30 +0000 |
commit | a97207b6908f1d4a7d19b37b818367bb0171039f (patch) | |
tree | 2449209dd19a0894107b9c616b0451b4a5f06a4c /src/pl/plpython/plpy_resultobject.c | |
parent | 1540d3bf4d405278533377ba81dbbf1c857eaec0 (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.c | 26 |
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); +} |