diff options
Diffstat (limited to 'src/pl/plpython/plpy_planobject.c')
-rw-r--r-- | src/pl/plpython/plpy_planobject.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/pl/plpython/plpy_planobject.c b/src/pl/plpython/plpy_planobject.c new file mode 100644 index 0000000..ec2439c --- /dev/null +++ b/src/pl/plpython/plpy_planobject.c @@ -0,0 +1,125 @@ +/* + * the PLyPlan class + * + * src/pl/plpython/plpy_planobject.c + */ + +#include "postgres.h" + +#include "plpy_cursorobject.h" +#include "plpy_elog.h" +#include "plpy_planobject.h" +#include "plpy_spi.h" +#include "plpython.h" +#include "utils/memutils.h" + +static void PLy_plan_dealloc(PyObject *arg); +static PyObject *PLy_plan_cursor(PyObject *self, PyObject *args); +static PyObject *PLy_plan_execute(PyObject *self, PyObject *args); +static PyObject *PLy_plan_status(PyObject *self, PyObject *args); + +static char PLy_plan_doc[] = "Store a PostgreSQL plan"; + +static PyMethodDef PLy_plan_methods[] = { + {"cursor", PLy_plan_cursor, METH_VARARGS, NULL}, + {"execute", PLy_plan_execute, METH_VARARGS, NULL}, + {"status", PLy_plan_status, METH_VARARGS, NULL}, + {NULL, NULL, 0, NULL} +}; + +static PyTypeObject PLy_PlanType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "PLyPlan", + .tp_basicsize = sizeof(PLyPlanObject), + .tp_dealloc = PLy_plan_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_doc = PLy_plan_doc, + .tp_methods = PLy_plan_methods, +}; + +void +PLy_plan_init_type(void) +{ + if (PyType_Ready(&PLy_PlanType) < 0) + elog(ERROR, "could not initialize PLy_PlanType"); +} + +PyObject * +PLy_plan_new(void) +{ + PLyPlanObject *ob; + + if ((ob = PyObject_New(PLyPlanObject, &PLy_PlanType)) == NULL) + return NULL; + + ob->plan = NULL; + ob->nargs = 0; + ob->types = NULL; + ob->values = NULL; + ob->args = NULL; + ob->mcxt = NULL; + + return (PyObject *) ob; +} + +bool +is_PLyPlanObject(PyObject *ob) +{ + return ob->ob_type == &PLy_PlanType; +} + +static void +PLy_plan_dealloc(PyObject *arg) +{ + PLyPlanObject *ob = (PLyPlanObject *) arg; + + if (ob->plan) + { + SPI_freeplan(ob->plan); + ob->plan = NULL; + } + if (ob->mcxt) + { + MemoryContextDelete(ob->mcxt); + ob->mcxt = NULL; + } + arg->ob_type->tp_free(arg); +} + + +static PyObject * +PLy_plan_cursor(PyObject *self, PyObject *args) +{ + PyObject *planargs = NULL; + + if (!PyArg_ParseTuple(args, "|O", &planargs)) + return NULL; + + return PLy_cursor_plan(self, planargs); +} + + +static PyObject * +PLy_plan_execute(PyObject *self, PyObject *args) +{ + PyObject *list = NULL; + long limit = 0; + + if (!PyArg_ParseTuple(args, "|Ol", &list, &limit)) + return NULL; + + return PLy_spi_execute_plan(self, list, limit); +} + + +static PyObject * +PLy_plan_status(PyObject *self, PyObject *args) +{ + if (PyArg_ParseTuple(args, ":status")) + { + Py_INCREF(Py_True); + return Py_True; + /* return PyLong_FromLong(self->status); */ + } + return NULL; +} |