12
12
13
13
14
14
static void PLy_result_dealloc (PyObject * arg );
15
+ static PyObject * PLy_result_colnames (PyObject * self , PyObject * unused );
16
+ static PyObject * PLy_result_coltypes (PyObject * self , PyObject * unused );
17
+ static PyObject * PLy_result_coltypmods (PyObject * self , PyObject * unused );
15
18
static PyObject * PLy_result_nrows (PyObject * self , PyObject * args );
16
19
static PyObject * PLy_result_status (PyObject * self , PyObject * args );
17
20
static Py_ssize_t PLy_result_length (PyObject * arg );
@@ -35,6 +38,9 @@ static PySequenceMethods PLy_result_as_sequence = {
35
38
};
36
39
37
40
static PyMethodDef PLy_result_methods [] = {
41
+ {"colnames" , PLy_result_colnames , METH_NOARGS , NULL },
42
+ {"coltypes" , PLy_result_coltypes , METH_NOARGS , NULL },
43
+ {"coltypmods" , PLy_result_coltypmods , METH_NOARGS , NULL },
38
44
{"nrows" , PLy_result_nrows , METH_VARARGS , NULL },
39
45
{"status" , PLy_result_status , METH_VARARGS , NULL },
40
46
{NULL , NULL , 0 , NULL }
@@ -96,6 +102,7 @@ PLy_result_new(void)
96
102
ob -> status = Py_None ;
97
103
ob -> nrows = PyInt_FromLong (-1 );
98
104
ob -> rows = PyList_New (0 );
105
+ ob -> tupdesc = NULL ;
99
106
100
107
return (PyObject * ) ob ;
101
108
}
@@ -108,10 +115,57 @@ PLy_result_dealloc(PyObject *arg)
108
115
Py_XDECREF (ob -> nrows );
109
116
Py_XDECREF (ob -> rows );
110
117
Py_XDECREF (ob -> status );
118
+ if (ob -> tupdesc )
119
+ {
120
+ FreeTupleDesc (ob -> tupdesc );
121
+ ob -> tupdesc = NULL ;
122
+ }
111
123
112
124
arg -> ob_type -> tp_free (arg );
113
125
}
114
126
127
+ static PyObject *
128
+ PLy_result_colnames (PyObject * self , PyObject * unused )
129
+ {
130
+ PLyResultObject * ob = (PLyResultObject * ) self ;
131
+ PyObject * list ;
132
+ int i ;
133
+
134
+ list = PyList_New (ob -> tupdesc -> natts );
135
+ for (i = 0 ; i < ob -> tupdesc -> natts ; i ++ )
136
+ PyList_SET_ITEM (list , i , PyString_FromString (NameStr (ob -> tupdesc -> attrs [i ]-> attname )));
137
+
138
+ return list ;
139
+ }
140
+
141
+ static PyObject *
142
+ PLy_result_coltypes (PyObject * self , PyObject * unused )
143
+ {
144
+ PLyResultObject * ob = (PLyResultObject * ) self ;
145
+ PyObject * list ;
146
+ int i ;
147
+
148
+ list = PyList_New (ob -> tupdesc -> natts );
149
+ for (i = 0 ; i < ob -> tupdesc -> natts ; i ++ )
150
+ PyList_SET_ITEM (list , i , PyInt_FromLong (ob -> tupdesc -> attrs [i ]-> atttypid ));
151
+
152
+ return list ;
153
+ }
154
+
155
+ static PyObject *
156
+ PLy_result_coltypmods (PyObject * self , PyObject * unused )
157
+ {
158
+ PLyResultObject * ob = (PLyResultObject * ) self ;
159
+ PyObject * list ;
160
+ int i ;
161
+
162
+ list = PyList_New (ob -> tupdesc -> natts );
163
+ for (i = 0 ; i < ob -> tupdesc -> natts ; i ++ )
164
+ PyList_SET_ITEM (list , i , PyInt_FromLong (ob -> tupdesc -> attrs [i ]-> atttypmod ));
165
+
166
+ return list ;
167
+ }
168
+
115
169
static PyObject *
116
170
PLy_result_nrows (PyObject * self , PyObject * args )
117
171
{
0 commit comments