PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
plpy_resultobject.c File Reference
#include "postgres.h"
#include "plpy_elog.h"
#include "plpy_resultobject.h"
#include "plpython.h"
Include dependency graph for plpy_resultobject.c:

Go to the source code of this file.

Functions

static void PLy_result_dealloc (PLyResultObject *self)
 
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)
 
static PyObject * PLy_result_item (PyObject *arg, Py_ssize_t idx)
 
static PyObject * PLy_result_str (PyObject *arg)
 
static PyObject * PLy_result_subscript (PyObject *arg, PyObject *item)
 
static int PLy_result_ass_subscript (PyObject *arg, PyObject *item, PyObject *value)
 
void PLy_result_init_type (void)
 
PyObject * PLy_result_new (void)
 

Variables

static char PLy_result_doc [] = "Results of a PostgreSQL query"
 
static PyMethodDef PLy_result_methods []
 
static PyType_Slot PLyResult_slots []
 
static PyType_Spec PLyResult_spec
 
static PyTypeObject * PLy_ResultType
 

Function Documentation

◆ PLy_result_ass_subscript()

static int PLy_result_ass_subscript ( PyObject *  arg,
PyObject *  item,
PyObject *  value 
)
static

Definition at line 276 of file plpy_resultobject.c.

277{
279
280 return PyObject_SetItem(ob->rows, item, value);
281}
static struct @165 value
void * arg

References arg, PLyResultObject::rows, and value.

◆ PLy_result_colnames()

static PyObject * PLy_result_colnames ( PyObject *  self,
PyObject *  unused 
)
static

Definition at line 140 of file plpy_resultobject.c.

141{
142 PLyResultObject *ob = (PLyResultObject *) self;
143 PyObject *list;
144 int i;
145
146 if (!ob->tupdesc)
147 {
148 PLy_exception_set(PLy_exc_error, "command did not produce a result set");
149 return NULL;
150 }
151
152 list = PyList_New(ob->tupdesc->natts);
153 if (!list)
154 return NULL;
155 for (i = 0; i < ob->tupdesc->natts; i++)
156 {
158
159 PyList_SetItem(list, i, PLyUnicode_FromString(NameStr(attr->attname)));
160 }
161
162 return list;
163}
#define NameStr(name)
Definition: c.h:717
int i
Definition: isn.c:77
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:200
PyObject * PLy_exc_error
Definition: plpy_elog.c:15
void PLy_exception_set(PyObject *exc, const char *fmt,...)
Definition: plpy_elog.c:472
PyObject * PLyUnicode_FromString(const char *s)
Definition: plpy_util.c:117
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:154

References i, sort-test::list, NameStr, TupleDescData::natts, PLy_exc_error, PLy_exception_set(), PLyUnicode_FromString(), PLyResultObject::tupdesc, and TupleDescAttr().

◆ PLy_result_coltypes()

static PyObject * PLy_result_coltypes ( PyObject *  self,
PyObject *  unused 
)
static

Definition at line 166 of file plpy_resultobject.c.

167{
168 PLyResultObject *ob = (PLyResultObject *) self;
169 PyObject *list;
170 int i;
171
172 if (!ob->tupdesc)
173 {
174 PLy_exception_set(PLy_exc_error, "command did not produce a result set");
175 return NULL;
176 }
177
178 list = PyList_New(ob->tupdesc->natts);
179 if (!list)
180 return NULL;
181 for (i = 0; i < ob->tupdesc->natts; i++)
182 {
184
185 PyList_SetItem(list, i, PyLong_FromLong(attr->atttypid));
186 }
187
188 return list;
189}

References i, sort-test::list, TupleDescData::natts, PLy_exc_error, PLy_exception_set(), PLyResultObject::tupdesc, and TupleDescAttr().

◆ PLy_result_coltypmods()

static PyObject * PLy_result_coltypmods ( PyObject *  self,
PyObject *  unused 
)
static

Definition at line 192 of file plpy_resultobject.c.

193{
194 PLyResultObject *ob = (PLyResultObject *) self;
195 PyObject *list;
196 int i;
197
198 if (!ob->tupdesc)
199 {
200 PLy_exception_set(PLy_exc_error, "command did not produce a result set");
201 return NULL;
202 }
203
204 list = PyList_New(ob->tupdesc->natts);
205 if (!list)
206 return NULL;
207 for (i = 0; i < ob->tupdesc->natts; i++)
208 {
210
211 PyList_SetItem(list, i, PyLong_FromLong(attr->atttypmod));
212 }
213
214 return list;
215}

References i, sort-test::list, TupleDescData::natts, PLy_exc_error, PLy_exception_set(), PLyResultObject::tupdesc, and TupleDescAttr().

◆ PLy_result_dealloc()

static void PLy_result_dealloc ( PLyResultObject self)
static

Definition at line 117 of file plpy_resultobject.c.

118{
119#if PY_VERSION_HEX >= 0x03080000
120 PyTypeObject *tp = Py_TYPE(self);
121#endif
122
123 Py_XDECREF(self->nrows);
124 Py_XDECREF(self->rows);
125 Py_XDECREF(self->status);
126 if (self->tupdesc)
127 {
128 FreeTupleDesc(self->tupdesc);
129 self->tupdesc = NULL;
130 }
131
132 PyObject_Free(self);
133#if PY_VERSION_HEX >= 0x03080000
134 /* This was not needed before Python 3.8 (Python issue 35810) */
135 Py_DECREF(tp);
136#endif
137}
PyObject_HEAD PyObject * nrows
void FreeTupleDesc(TupleDesc tupdesc)
Definition: tupdesc.c:479

References FreeTupleDesc(), PLyResultObject::nrows, PLyResultObject::rows, PLyResultObject::status, and PLyResultObject::tupdesc.

◆ PLy_result_init_type()

void PLy_result_init_type ( void  )

Definition at line 81 of file plpy_resultobject.c.

82{
83 PLy_ResultType = (PyTypeObject *) PyType_FromSpec(&PLyResult_spec);
84 if (!PLy_ResultType)
85 elog(ERROR, "could not initialize PLy_ResultType");
86}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
static PyType_Spec PLyResult_spec
static PyTypeObject * PLy_ResultType

References elog, ERROR, PLy_ResultType, and PLyResult_spec.

Referenced by PLy_init_plpy().

◆ PLy_result_item()

static PyObject * PLy_result_item ( PyObject *  arg,
Py_ssize_t  idx 
)
static

Definition at line 244 of file plpy_resultobject.c.

245{
246 PyObject *rv;
248
249 rv = PyList_GetItem(ob->rows, idx);
250 if (rv != NULL)
251 Py_INCREF(rv);
252 return rv;
253}
Datum idx(PG_FUNCTION_ARGS)
Definition: _int_op.c:262

References arg, idx(), and PLyResultObject::rows.

◆ PLy_result_length()

static Py_ssize_t PLy_result_length ( PyObject *  arg)
static

Definition at line 236 of file plpy_resultobject.c.

237{
239
240 return PyList_Size(ob->rows);
241}

References arg, and PLyResultObject::rows.

◆ PLy_result_new()

PyObject * PLy_result_new ( void  )

Definition at line 89 of file plpy_resultobject.c.

90{
92
93 if ((ob = PyObject_New(PLyResultObject, PLy_ResultType)) == NULL)
94 return NULL;
95#if PY_VERSION_HEX < 0x03080000
96 /* Workaround for Python issue 35810; no longer necessary in Python 3.8 */
97 Py_INCREF(PLy_ResultType);
98#endif
99
100 /* ob->tuples = NULL; */
101
102 Py_INCREF(Py_None);
103 ob->status = Py_None;
104 ob->nrows = PyLong_FromLong(-1);
105 ob->rows = PyList_New(0);
106 ob->tupdesc = NULL;
107 if (!ob->rows)
108 {
109 Py_DECREF(ob);
110 return NULL;
111 }
112
113 return (PyObject *) ob;
114}

References PLyResultObject::nrows, PLy_ResultType, PLyResultObject::rows, PLyResultObject::status, and PLyResultObject::tupdesc.

Referenced by PLy_cursor_fetch(), and PLy_spi_execute_fetch_result().

◆ PLy_result_nrows()

static PyObject * PLy_result_nrows ( PyObject *  self,
PyObject *  args 
)
static

Definition at line 218 of file plpy_resultobject.c.

219{
220 PLyResultObject *ob = (PLyResultObject *) self;
221
222 Py_INCREF(ob->nrows);
223 return ob->nrows;
224}

References PLyResultObject::nrows.

◆ PLy_result_status()

static PyObject * PLy_result_status ( PyObject *  self,
PyObject *  args 
)
static

Definition at line 227 of file plpy_resultobject.c.

228{
229 PLyResultObject *ob = (PLyResultObject *) self;
230
231 Py_INCREF(ob->status);
232 return ob->status;
233}

References PLyResultObject::status.

◆ PLy_result_str()

static PyObject * PLy_result_str ( PyObject *  arg)
static

Definition at line 256 of file plpy_resultobject.c.

257{
259
260 return PyUnicode_FromFormat("<%s status=%S nrows=%S rows=%S>",
261 "PLyResult",
262 ob->status,
263 ob->nrows,
264 ob->rows);
265}

References arg, PLyResultObject::nrows, PLyResultObject::rows, and PLyResultObject::status.

◆ PLy_result_subscript()

static PyObject * PLy_result_subscript ( PyObject *  arg,
PyObject *  item 
)
static

Definition at line 268 of file plpy_resultobject.c.

269{
271
272 return PyObject_GetItem(ob->rows, item);
273}

References arg, and PLyResultObject::rows.

Variable Documentation

◆ PLy_result_doc

char PLy_result_doc[] = "Results of a PostgreSQL query"
static

Definition at line 25 of file plpy_resultobject.c.

◆ PLy_result_methods

PyMethodDef PLy_result_methods[]
static
Initial value:
= {
{"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}
}
static PyObject * PLy_result_nrows(PyObject *self, PyObject *args)
static PyObject * PLy_result_coltypmods(PyObject *self, PyObject *unused)
static PyObject * PLy_result_status(PyObject *self, PyObject *args)
static PyObject * PLy_result_coltypes(PyObject *self, PyObject *unused)
static PyObject * PLy_result_colnames(PyObject *self, PyObject *unused)

Definition at line 27 of file plpy_resultobject.c.

◆ PLy_ResultType

PyTypeObject* PLy_ResultType
static

Definition at line 78 of file plpy_resultobject.c.

Referenced by PLy_result_init_type(), and PLy_result_new().

◆ PLyResult_slots

PyType_Slot PLyResult_slots[]
static

Definition at line 36 of file plpy_resultobject.c.

◆ PLyResult_spec

PyType_Spec PLyResult_spec
static
Initial value:
=
{
.name = "PLyResult",
.basicsize = sizeof(PLyResultObject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
.slots = PLyResult_slots,
}
static PyType_Slot PLyResult_slots[]
struct PLyResultObject PLyResultObject

Definition at line 70 of file plpy_resultobject.c.

Referenced by PLy_result_init_type().