blob: 8efa8127195aa6fee8c99b7cde0b6855b4a50757 [file] [log] [blame]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001/* cursor.c - the cursor type
2 *
Gerhard Häringe7ea7452008-03-29 00:45:29 +00003 * Copyright (C) 2004-2007 Gerhard Häring <gh@ghaering.de>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004 *
5 * This file is part of pysqlite.
6 *
7 * This software is provided 'as-is', without any express or implied
8 * warranty. In no event will the authors be held liable for any damages
9 * arising from the use of this software.
10 *
11 * Permission is granted to anyone to use this software for any purpose,
12 * including commercial applications, and to alter it and redistribute it
13 * freely, subject to the following restrictions:
14 *
15 * 1. The origin of this software must not be misrepresented; you must not
16 * claim that you wrote the original software. If you use this software
17 * in a product, an acknowledgment in the product documentation would be
18 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
21 * 3. This notice may not be removed or altered from any source distribution.
22 */
23
24#include "cursor.h"
25#include "module.h"
26#include "util.h"
27#include "sqlitecompat.h"
28
Christian Heimes217cfd12007-12-02 14:31:20 +000029/* used to decide wether to call PyLong_FromLong or PyLong_FromLongLong */
Thomas Wouters477c8d52006-05-27 19:21:47 +000030#ifndef INT32_MIN
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000031#define INT32_MIN (-2147483647 - 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +000032#endif
33#ifndef INT32_MAX
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034#define INT32_MAX 2147483647
Thomas Wouters477c8d52006-05-27 19:21:47 +000035#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000036
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000037PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000038
Guido van Rossum6374bb52007-06-13 16:28:25 +000039static pysqlite_StatementKind detect_statement_type(const char* statement)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000040{
41 char buf[20];
Guido van Rossum6374bb52007-06-13 16:28:25 +000042 const char* src;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000043 char* dst;
44
45 src = statement;
46 /* skip over whitepace */
47 while (*src == '\r' || *src == '\n' || *src == ' ' || *src == '\t') {
48 src++;
49 }
50
51 if (*src == 0)
52 return STATEMENT_INVALID;
53
54 dst = buf;
55 *dst = 0;
56 while (isalpha(*src) && dst - buf < sizeof(buf) - 2) {
57 *dst++ = tolower(*src++);
58 }
59
60 *dst = 0;
61
62 if (!strcmp(buf, "select")) {
63 return STATEMENT_SELECT;
64 } else if (!strcmp(buf, "insert")) {
65 return STATEMENT_INSERT;
66 } else if (!strcmp(buf, "update")) {
67 return STATEMENT_UPDATE;
68 } else if (!strcmp(buf, "delete")) {
69 return STATEMENT_DELETE;
70 } else if (!strcmp(buf, "replace")) {
71 return STATEMENT_REPLACE;
72 } else {
73 return STATEMENT_OTHER;
74 }
75}
76
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000077int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000078{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000079 pysqlite_Connection* connection;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000080
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +000081 if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000082 {
Gerhard Häringe7ea7452008-03-29 00:45:29 +000083 return -1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000084 }
85
86 Py_INCREF(connection);
87 self->connection = connection;
88 self->statement = NULL;
89 self->next_row = NULL;
90
91 self->row_cast_map = PyList_New(0);
92 if (!self->row_cast_map) {
93 return -1;
94 }
95
96 Py_INCREF(Py_None);
97 self->description = Py_None;
98
99 Py_INCREF(Py_None);
100 self->lastrowid= Py_None;
101
102 self->arraysize = 1;
103
Christian Heimes217cfd12007-12-02 14:31:20 +0000104 self->rowcount = PyLong_FromLong(-1L);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000105 if (!self->rowcount) {
106 return -1;
107 }
108
109 Py_INCREF(Py_None);
110 self->row_factory = Py_None;
111
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000112 if (!pysqlite_check_thread(self->connection)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000113 return -1;
114 }
115
116 return 0;
117}
118
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000119void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000120{
121 int rc;
122
123 /* Reset the statement if the user has not closed the cursor */
124 if (self->statement) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000125 rc = pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 Py_DECREF(self->statement);
127 }
128
129 Py_XDECREF(self->connection);
130 Py_XDECREF(self->row_cast_map);
131 Py_XDECREF(self->description);
132 Py_XDECREF(self->lastrowid);
133 Py_XDECREF(self->rowcount);
134 Py_XDECREF(self->row_factory);
135 Py_XDECREF(self->next_row);
136
Christian Heimes90aa7642007-12-19 02:45:37 +0000137 Py_TYPE(self)->tp_free((PyObject*)self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000138}
139
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000140PyObject* _pysqlite_get_converter(PyObject* key)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000141{
142 PyObject* upcase_key;
143 PyObject* retval;
144
145 upcase_key = PyObject_CallMethod(key, "upper", "");
146 if (!upcase_key) {
147 return NULL;
148 }
149
150 retval = PyDict_GetItem(converters, upcase_key);
151 Py_DECREF(upcase_key);
152
153 return retval;
154}
155
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000156int pysqlite_build_row_cast_map(pysqlite_Cursor* self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000157{
158 int i;
159 const char* type_start = (const char*)-1;
160 const char* pos;
161
162 const char* colname;
163 const char* decltype;
164 PyObject* py_decltype;
165 PyObject* converter;
166 PyObject* key;
167
168 if (!self->connection->detect_types) {
169 return 0;
170 }
171
172 Py_XDECREF(self->row_cast_map);
173 self->row_cast_map = PyList_New(0);
174
175 for (i = 0; i < sqlite3_column_count(self->statement->st); i++) {
176 converter = NULL;
177
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000178 if (self->connection->detect_types & PARSE_COLNAMES) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000179 colname = sqlite3_column_name(self->statement->st, i);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 if (colname) {
181 for (pos = colname; *pos != 0; pos++) {
182 if (*pos == '[') {
183 type_start = pos + 1;
184 } else if (*pos == ']' && type_start != (const char*)-1) {
Brett Cannon40430012007-10-22 20:24:51 +0000185 key = PyUnicode_FromStringAndSize(type_start, pos - type_start);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000186 if (!key) {
187 /* creating a string failed, but it is too complicated
188 * to propagate the error here, we just assume there is
189 * no converter and proceed */
190 break;
191 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000192
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000193 converter = _pysqlite_get_converter(key);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000194 Py_DECREF(key);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000195 break;
196 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000197 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000198 }
199 }
200
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000201 if (!converter && self->connection->detect_types & PARSE_DECLTYPES) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000202 decltype = sqlite3_column_decltype(self->statement->st, i);
203 if (decltype) {
204 for (pos = decltype;;pos++) {
205 if (*pos == ' ' || *pos == 0) {
Brett Cannon40430012007-10-22 20:24:51 +0000206 py_decltype = PyUnicode_FromStringAndSize(decltype, pos - decltype);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000207 if (!py_decltype) {
208 return -1;
209 }
210 break;
211 }
212 }
213
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000214 converter = _pysqlite_get_converter(py_decltype);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000215 Py_DECREF(py_decltype);
216 }
217 }
218
219 if (!converter) {
220 converter = Py_None;
221 }
222
223 if (PyList_Append(self->row_cast_map, converter) != 0) {
224 if (converter != Py_None) {
225 Py_DECREF(converter);
226 }
227 Py_XDECREF(self->row_cast_map);
228 self->row_cast_map = NULL;
229
230 return -1;
231 }
232 }
233
234 return 0;
235}
236
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000237PyObject* _pysqlite_build_column_name(const char* colname)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000238{
239 const char* pos;
240
241 if (!colname) {
242 Py_INCREF(Py_None);
243 return Py_None;
244 }
245
246 for (pos = colname;; pos++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000247 if (*pos == 0 || *pos == '[') {
248 if ((*pos == '[') && (pos > colname) && (*(pos-1) == ' ')) {
249 pos--;
250 }
Gerhard Häring6d214562007-08-10 18:15:11 +0000251 return PyUnicode_FromStringAndSize(colname, pos - colname);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000252 }
253 }
254}
255
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000256PyObject* pysqlite_unicode_from_string(const char* val_str, int optimize)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000257{
Guido van Rossum98297ee2007-11-06 21:34:58 +0000258 return PyUnicode_FromString(val_str);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000259}
260
261/*
262 * Returns a row from the currently active SQLite statement
263 *
264 * Precondidition:
265 * - sqlite3_step() has been called before and it returned SQLITE_ROW.
266 */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000267PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000268{
269 int i, numcols;
270 PyObject* row;
271 PyObject* item = NULL;
272 int coltype;
273 PY_LONG_LONG intval;
274 PyObject* converter;
275 PyObject* converted;
276 Py_ssize_t nbytes;
277 PyObject* buffer;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000278 const char* val_str;
279 char buf[200];
Thomas Wouters477c8d52006-05-27 19:21:47 +0000280 const char* colname;
Gerhard Häring873d9ff2008-02-29 22:22:09 +0000281 PyObject* buf_bytes;
282 PyObject* error_obj;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000283
284 Py_BEGIN_ALLOW_THREADS
285 numcols = sqlite3_data_count(self->statement->st);
286 Py_END_ALLOW_THREADS
287
288 row = PyTuple_New(numcols);
289 if (!row) {
290 return NULL;
291 }
292
293 for (i = 0; i < numcols; i++) {
294 if (self->connection->detect_types) {
295 converter = PyList_GetItem(self->row_cast_map, i);
296 if (!converter) {
297 converter = Py_None;
298 }
299 } else {
300 converter = Py_None;
301 }
302
303 if (converter != Py_None) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000304 nbytes = sqlite3_column_bytes(self->statement->st, i);
305 val_str = (const char*)sqlite3_column_blob(self->statement->st, i);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000306 if (!val_str) {
307 Py_INCREF(Py_None);
308 converted = Py_None;
309 } else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000310 item = PyString_FromStringAndSize(val_str, nbytes);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000311 if (!item) {
312 return NULL;
313 }
314 converted = PyObject_CallFunction(converter, "O", item);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000315 Py_DECREF(item);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000316 if (!converted) {
317 break;
318 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000319 }
320 } else {
321 Py_BEGIN_ALLOW_THREADS
322 coltype = sqlite3_column_type(self->statement->st, i);
323 Py_END_ALLOW_THREADS
324 if (coltype == SQLITE_NULL) {
325 Py_INCREF(Py_None);
326 converted = Py_None;
327 } else if (coltype == SQLITE_INTEGER) {
328 intval = sqlite3_column_int64(self->statement->st, i);
329 if (intval < INT32_MIN || intval > INT32_MAX) {
330 converted = PyLong_FromLongLong(intval);
331 } else {
Christian Heimes217cfd12007-12-02 14:31:20 +0000332 converted = PyLong_FromLong((long)intval);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000333 }
334 } else if (coltype == SQLITE_FLOAT) {
335 converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i));
336 } else if (coltype == SQLITE_TEXT) {
337 val_str = (const char*)sqlite3_column_text(self->statement->st, i);
338 if ((self->connection->text_factory == (PyObject*)&PyUnicode_Type)
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000339 || (self->connection->text_factory == pysqlite_OptimizedUnicode)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000340
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000341 converted = pysqlite_unicode_from_string(val_str,
342 self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000343
344 if (!converted) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000345 colname = sqlite3_column_name(self->statement->st, i);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000346 if (!colname) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000347 colname = "<unknown column name>";
348 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000349 PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000350 colname , val_str);
Gerhard Häring873d9ff2008-02-29 22:22:09 +0000351 buf_bytes = PyBytes_FromStringAndSize(buf, strlen(buf));
352 if (!buf_bytes) {
353 PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8");
354 } else {
355 error_obj = PyUnicode_FromEncodedObject(buf_bytes, "ascii", "replace");
356 if (!error_obj) {
357 PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8");
Gerhard Häring873d9ff2008-02-29 22:22:09 +0000358 } else {
359 PyErr_SetObject(pysqlite_OperationalError, error_obj);
Gerhard Häringe871ad592008-03-29 14:11:55 +0000360 Py_DECREF(error_obj);
Gerhard Häring873d9ff2008-02-29 22:22:09 +0000361 }
362 Py_DECREF(buf_bytes);
363 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000364 }
365 } else if (self->connection->text_factory == (PyObject*)&PyString_Type) {
366 converted = PyString_FromString(val_str);
Gerhard Häring6d214562007-08-10 18:15:11 +0000367 } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) {
368 converted = PyBytes_FromStringAndSize(val_str, strlen(val_str));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000369 } else {
Gerhard Häring6d214562007-08-10 18:15:11 +0000370 converted = PyObject_CallFunction(self->connection->text_factory, "y", val_str);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000371 }
372 } else {
373 /* coltype == SQLITE_BLOB */
374 nbytes = sqlite3_column_bytes(self->statement->st, i);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000375 buffer = PyString_FromStringAndSize(
Guido van Rossumbae07c92007-10-08 02:46:15 +0000376 sqlite3_column_blob(self->statement->st, i), nbytes);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000377 if (!buffer) {
378 break;
379 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000380 converted = buffer;
381 }
382 }
383
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000384 if (converted) {
385 PyTuple_SetItem(row, i, converted);
386 } else {
387 Py_INCREF(Py_None);
388 PyTuple_SetItem(row, i, Py_None);
389 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000390 }
391
392 if (PyErr_Occurred()) {
393 Py_DECREF(row);
394 row = NULL;
395 }
396
397 return row;
398}
399
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000400PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000401{
402 PyObject* operation;
Guido van Rossum83857e32007-05-09 23:37:01 +0000403 const char* operation_cstr;
404 Py_ssize_t operation_len;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000405 PyObject* parameters_list = NULL;
406 PyObject* parameters_iter = NULL;
407 PyObject* parameters = NULL;
408 int i;
409 int rc;
410 PyObject* func_args;
411 PyObject* result;
412 int numcols;
413 PY_LONG_LONG lastrowid;
414 int statement_type;
415 PyObject* descriptor;
416 PyObject* second_argument = NULL;
417 long rowcount = 0;
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000418 int allow_8bit_chars;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000419
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000420 if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000421 return NULL;
422 }
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000423 /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */
424 allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) &&
425 (self->connection->text_factory != (PyObject*)&PyUnicode_Type && pysqlite_OptimizedUnicode));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000426
427 Py_XDECREF(self->next_row);
428 self->next_row = NULL;
429
430 if (multiple) {
431 /* executemany() */
432 if (!PyArg_ParseTuple(args, "OO", &operation, &second_argument)) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000433 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000434 }
435
Guido van Rossum98297ee2007-11-06 21:34:58 +0000436 if (!PyUnicode_Check(operation)) {
437 PyErr_SetString(PyExc_ValueError, "operation parameter must be str");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000438 return NULL;
439 }
440
441 if (PyIter_Check(second_argument)) {
442 /* iterator */
443 Py_INCREF(second_argument);
444 parameters_iter = second_argument;
445 } else {
446 /* sequence */
447 parameters_iter = PyObject_GetIter(second_argument);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000448 if (!parameters_iter) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000449 return NULL;
450 }
451 }
452 } else {
453 /* execute() */
454 if (!PyArg_ParseTuple(args, "O|O", &operation, &second_argument)) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000455 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000456 }
457
Guido van Rossum98297ee2007-11-06 21:34:58 +0000458 if (!PyUnicode_Check(operation)) {
459 PyErr_SetString(PyExc_ValueError, "operation parameter must be str");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000460 return NULL;
461 }
462
463 parameters_list = PyList_New(0);
464 if (!parameters_list) {
465 return NULL;
466 }
467
468 if (second_argument == NULL) {
469 second_argument = PyTuple_New(0);
470 if (!second_argument) {
471 goto error;
472 }
473 } else {
474 Py_INCREF(second_argument);
475 }
476 if (PyList_Append(parameters_list, second_argument) != 0) {
477 Py_DECREF(second_argument);
478 goto error;
479 }
480 Py_DECREF(second_argument);
481
482 parameters_iter = PyObject_GetIter(parameters_list);
483 if (!parameters_iter) {
484 goto error;
485 }
486 }
487
488 if (self->statement != NULL) {
489 /* There is an active statement */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000490 rc = pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000491 }
492
Guido van Rossumec9a4af2007-08-29 14:26:02 +0000493 operation_cstr = PyUnicode_AsStringAndSize(operation, &operation_len);
Guido van Rossumfa9a1212007-08-29 03:34:29 +0000494 if (operation == NULL)
Guido van Rossum83857e32007-05-09 23:37:01 +0000495 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000496
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000497 /* reset description */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498 Py_DECREF(self->description);
499 Py_INCREF(Py_None);
500 self->description = Py_None;
501
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000502 func_args = PyTuple_New(1);
503 if (!func_args) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000504 goto error;
505 }
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000506 Py_INCREF(operation);
507 if (PyTuple_SetItem(func_args, 0, operation) != 0) {
508 goto error;
509 }
510
511 if (self->statement) {
512 (void)pysqlite_statement_reset(self->statement);
513 Py_DECREF(self->statement);
514 }
515
516 self->statement = (pysqlite_Statement*)pysqlite_cache_get(self->connection->statement_cache, func_args);
517 Py_DECREF(func_args);
518
519 if (!self->statement) {
520 goto error;
521 }
522
523 if (self->statement->in_use) {
524 Py_DECREF(self->statement);
525 self->statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
526 if (!self->statement) {
527 goto error;
528 }
529 rc = pysqlite_statement_create(self->statement, self->connection, operation);
530 if (rc != SQLITE_OK) {
531 self->statement = 0;
532 goto error;
533 }
534 }
535
536 pysqlite_statement_reset(self->statement);
537 pysqlite_statement_mark_dirty(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000538
539 statement_type = detect_statement_type(operation_cstr);
540 if (self->connection->begin_statement) {
541 switch (statement_type) {
542 case STATEMENT_UPDATE:
543 case STATEMENT_DELETE:
544 case STATEMENT_INSERT:
545 case STATEMENT_REPLACE:
546 if (!self->connection->inTransaction) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000547 result = _pysqlite_connection_begin(self->connection);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548 if (!result) {
549 goto error;
550 }
551 Py_DECREF(result);
552 }
553 break;
554 case STATEMENT_OTHER:
555 /* it's a DDL statement or something similar
556 - we better COMMIT first so it works for all cases */
557 if (self->connection->inTransaction) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000558 result = pysqlite_connection_commit(self->connection, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000559 if (!result) {
560 goto error;
561 }
562 Py_DECREF(result);
563 }
564 break;
565 case STATEMENT_SELECT:
566 if (multiple) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000567 PyErr_SetString(pysqlite_ProgrammingError,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000568 "You cannot execute SELECT statements in executemany().");
569 goto error;
570 }
571 break;
572 }
573 }
574
575 func_args = PyTuple_New(1);
576 if (!func_args) {
577 goto error;
578 }
579 Py_INCREF(operation);
580 if (PyTuple_SetItem(func_args, 0, operation) != 0) {
581 goto error;
582 }
583
584 if (self->statement) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000585 (void)pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 Py_DECREF(self->statement);
587 }
588
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000589 self->statement = (pysqlite_Statement*)pysqlite_cache_get(self->connection->statement_cache, func_args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 Py_DECREF(func_args);
591
592 if (!self->statement) {
593 goto error;
594 }
595
596 if (self->statement->in_use) {
597 Py_DECREF(self->statement);
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000598 self->statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000599 if (!self->statement) {
600 goto error;
601 }
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000602 rc = pysqlite_statement_create(self->statement, self->connection, operation);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000603 if (rc != SQLITE_OK) {
604 self->statement = 0;
605 goto error;
606 }
607 }
608
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000609 pysqlite_statement_reset(self->statement);
610 pysqlite_statement_mark_dirty(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000611
612 while (1) {
613 parameters = PyIter_Next(parameters_iter);
614 if (!parameters) {
615 break;
616 }
617
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000618 pysqlite_statement_mark_dirty(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000619
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000620 pysqlite_statement_bind_parameters(self->statement, parameters, allow_8bit_chars);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000621 if (PyErr_Occurred()) {
622 goto error;
623 }
624
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000625 if (pysqlite_build_row_cast_map(self) != 0) {
626 PyErr_SetString(pysqlite_OperationalError, "Error while building row_cast_map");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000627 goto error;
628 }
629
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000630 /* Keep trying the SQL statement until the schema stops changing. */
631 while (1) {
632 /* Actually execute the SQL statement. */
633 rc = _sqlite_step_with_busyhandler(self->statement->st, self->connection);
634 if (rc == SQLITE_DONE || rc == SQLITE_ROW) {
635 /* If it worked, let's get out of the loop */
636 break;
637 }
638 /* Something went wrong. Re-set the statement and try again. */
639 rc = pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000640 if (rc == SQLITE_SCHEMA) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000641 /* If this was a result of the schema changing, let's try
642 again. */
643 rc = pysqlite_statement_recompile(self->statement, parameters);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000644 if (rc == SQLITE_OK) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000645 continue;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000646 } else {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000647 /* If the database gave us an error, promote it to Python. */
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000648 (void)pysqlite_statement_reset(self->statement);
649 _pysqlite_seterror(self->connection->db, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000650 goto error;
651 }
652 } else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653 if (PyErr_Occurred()) {
654 /* there was an error that occurred in a user-defined callback */
655 if (_enable_callback_tracebacks) {
656 PyErr_Print();
657 } else {
658 PyErr_Clear();
659 }
660 }
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000661 (void)pysqlite_statement_reset(self->statement);
662 _pysqlite_seterror(self->connection->db, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000663 goto error;
664 }
665 }
666
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000667 if (pysqlite_build_row_cast_map(self) != 0) {
668 PyErr_SetString(pysqlite_OperationalError, "Error while building row_cast_map");
669 goto error;
670 }
671
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000672 if (rc == SQLITE_ROW || (rc == SQLITE_DONE && statement_type == STATEMENT_SELECT)) {
673 Py_BEGIN_ALLOW_THREADS
674 numcols = sqlite3_column_count(self->statement->st);
675 Py_END_ALLOW_THREADS
676
677 if (self->description == Py_None) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000678 Py_BEGIN_ALLOW_THREADS
679 numcols = sqlite3_column_count(self->statement->st);
680 Py_END_ALLOW_THREADS
681
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000682 Py_DECREF(self->description);
683 self->description = PyTuple_New(numcols);
684 if (!self->description) {
685 goto error;
686 }
687 for (i = 0; i < numcols; i++) {
688 descriptor = PyTuple_New(7);
689 if (!descriptor) {
690 goto error;
691 }
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000692 PyTuple_SetItem(descriptor, 0, _pysqlite_build_column_name(sqlite3_column_name(self->statement->st, i)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000693 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 1, Py_None);
694 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 2, Py_None);
695 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 3, Py_None);
696 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 4, Py_None);
697 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 5, Py_None);
698 Py_INCREF(Py_None); PyTuple_SetItem(descriptor, 6, Py_None);
699 PyTuple_SetItem(self->description, i, descriptor);
700 }
701 }
702 }
703
704 if (rc == SQLITE_ROW) {
705 if (multiple) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000706 PyErr_SetString(pysqlite_ProgrammingError, "executemany() can only execute DML statements.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000707 goto error;
708 }
709
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000710 self->next_row = _pysqlite_fetch_one_row(self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000711 } else if (rc == SQLITE_DONE && !multiple) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000712 pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000713 Py_DECREF(self->statement);
714 self->statement = 0;
715 }
716
717 switch (statement_type) {
718 case STATEMENT_UPDATE:
719 case STATEMENT_DELETE:
720 case STATEMENT_INSERT:
721 case STATEMENT_REPLACE:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000722 rowcount += (long)sqlite3_changes(self->connection->db);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000723 }
724
725 Py_DECREF(self->lastrowid);
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000726 if (!multiple && statement_type == STATEMENT_INSERT) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000727 Py_BEGIN_ALLOW_THREADS
728 lastrowid = sqlite3_last_insert_rowid(self->connection->db);
729 Py_END_ALLOW_THREADS
Christian Heimes217cfd12007-12-02 14:31:20 +0000730 self->lastrowid = PyLong_FromLong((long)lastrowid);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000731 } else {
732 Py_INCREF(Py_None);
733 self->lastrowid = Py_None;
734 }
735
736 if (multiple) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000737 rc = pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000738 }
739 Py_XDECREF(parameters);
740 }
741
742error:
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000743 /* just to be sure (implicit ROLLBACKs with ON CONFLICT ROLLBACK/OR
744 * ROLLBACK could have happened */
745 #ifdef SQLITE_VERSION_NUMBER
746 #if SQLITE_VERSION_NUMBER >= 3002002
747 self->connection->inTransaction = !sqlite3_get_autocommit(self->connection->db);
748 #endif
749 #endif
750
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000751 Py_XDECREF(parameters);
752 Py_XDECREF(parameters_iter);
753 Py_XDECREF(parameters_list);
754
755 if (PyErr_Occurred()) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000756 Py_DECREF(self->rowcount);
757 self->rowcount = PyLong_FromLong(-1L);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000758 return NULL;
759 } else {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000760 Py_DECREF(self->rowcount);
761 self->rowcount = PyLong_FromLong(rowcount);
762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000763 Py_INCREF(self);
764 return (PyObject*)self;
765 }
766}
767
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000768PyObject* pysqlite_cursor_execute(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000769{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000770 return _pysqlite_query_execute(self, 0, args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000771}
772
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000773PyObject* pysqlite_cursor_executemany(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000774{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000775 return _pysqlite_query_execute(self, 1, args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000776}
777
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000778PyObject* pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000779{
780 PyObject* script_obj;
781 PyObject* script_str = NULL;
782 const char* script_cstr;
783 sqlite3_stmt* statement;
784 int rc;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000785 PyObject* result;
786 int statement_completed = 0;
787
788 if (!PyArg_ParseTuple(args, "O", &script_obj)) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000789 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000790 }
791
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000792 if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000793 return NULL;
794 }
795
Gerhard Häring6d214562007-08-10 18:15:11 +0000796 if (PyUnicode_Check(script_obj)) {
797 script_cstr = PyUnicode_AsString(script_obj);
798 if (!script_cstr) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000799 return NULL;
800 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801 } else {
Gerhard Häring6d214562007-08-10 18:15:11 +0000802 PyErr_SetString(PyExc_ValueError, "script argument must be unicode.");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000803 return NULL;
804 }
805
806 /* commit first */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000807 result = pysqlite_connection_commit(self->connection, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000808 if (!result) {
809 goto error;
810 }
811 Py_DECREF(result);
812
813 while (1) {
814 if (!sqlite3_complete(script_cstr)) {
815 break;
816 }
817 statement_completed = 1;
818
819 rc = sqlite3_prepare(self->connection->db,
820 script_cstr,
821 -1,
822 &statement,
823 &script_cstr);
824 if (rc != SQLITE_OK) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000825 _pysqlite_seterror(self->connection->db, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000826 goto error;
827 }
828
829 /* execute statement, and ignore results of SELECT statements */
830 rc = SQLITE_ROW;
831 while (rc == SQLITE_ROW) {
832 rc = _sqlite_step_with_busyhandler(statement, self->connection);
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000833 /* TODO: we probably need more error handling here */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000834 }
835
836 if (rc != SQLITE_DONE) {
837 (void)sqlite3_finalize(statement);
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000838 _pysqlite_seterror(self->connection->db, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000839 goto error;
840 }
841
842 rc = sqlite3_finalize(statement);
843 if (rc != SQLITE_OK) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000844 _pysqlite_seterror(self->connection->db, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000845 goto error;
846 }
847 }
848
849error:
850 Py_XDECREF(script_str);
851
852 if (!statement_completed) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000853 PyErr_SetString(pysqlite_ProgrammingError, "you did not provide a complete SQL statement");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000854 }
855
856 if (PyErr_Occurred()) {
857 return NULL;
858 } else {
859 Py_INCREF(self);
860 return (PyObject*)self;
861 }
862}
863
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000864PyObject* pysqlite_cursor_getiter(pysqlite_Cursor *self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000865{
866 Py_INCREF(self);
867 return (PyObject*)self;
868}
869
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000870PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000871{
872 PyObject* next_row_tuple;
873 PyObject* next_row;
874 int rc;
875
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000876 if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000877 return NULL;
878 }
879
880 if (!self->next_row) {
881 if (self->statement) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000882 (void)pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000883 Py_DECREF(self->statement);
884 self->statement = NULL;
885 }
886 return NULL;
887 }
888
889 next_row_tuple = self->next_row;
890 self->next_row = NULL;
891
892 if (self->row_factory != Py_None) {
893 next_row = PyObject_CallFunction(self->row_factory, "OO", self, next_row_tuple);
894 Py_DECREF(next_row_tuple);
895 } else {
896 next_row = next_row_tuple;
897 }
898
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000899 if (self->statement) {
900 rc = _sqlite_step_with_busyhandler(self->statement->st, self->connection);
901 if (rc != SQLITE_DONE && rc != SQLITE_ROW) {
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000902 (void)pysqlite_statement_reset(self->statement);
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000903 Py_DECREF(next_row);
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000904 _pysqlite_seterror(self->connection->db, NULL);
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000905 return NULL;
906 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000907
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000908 if (rc == SQLITE_ROW) {
909 self->next_row = _pysqlite_fetch_one_row(self);
910 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000911 }
912
913 return next_row;
914}
915
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000916PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000917{
918 PyObject* row;
919
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000920 row = pysqlite_cursor_iternext(self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000921 if (!row && !PyErr_Occurred()) {
922 Py_INCREF(Py_None);
923 return Py_None;
924 }
925
926 return row;
927}
928
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000929PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000930{
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000931 static char *kwlist[] = {"size", NULL, NULL};
932
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000933 PyObject* row;
934 PyObject* list;
935 int maxrows = self->arraysize;
936 int counter = 0;
937
Gerhard Häringe7ea7452008-03-29 00:45:29 +0000938 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:fetchmany", kwlist, &maxrows)) {
939 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000940 }
941
942 list = PyList_New(0);
943 if (!list) {
944 return NULL;
945 }
946
947 /* just make sure we enter the loop */
948 row = Py_None;
949
950 while (row) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000951 row = pysqlite_cursor_iternext(self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000952 if (row) {
953 PyList_Append(list, row);
954 Py_DECREF(row);
955 } else {
956 break;
957 }
958
959 if (++counter == maxrows) {
960 break;
961 }
962 }
963
964 if (PyErr_Occurred()) {
965 Py_DECREF(list);
966 return NULL;
967 } else {
968 return list;
969 }
970}
971
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000972PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000973{
974 PyObject* row;
975 PyObject* list;
976
977 list = PyList_New(0);
978 if (!list) {
979 return NULL;
980 }
981
982 /* just make sure we enter the loop */
983 row = (PyObject*)Py_None;
984
985 while (row) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000986 row = pysqlite_cursor_iternext(self);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000987 if (row) {
988 PyList_Append(list, row);
989 Py_DECREF(row);
990 }
991 }
992
993 if (PyErr_Occurred()) {
994 Py_DECREF(list);
995 return NULL;
996 } else {
997 return list;
998 }
999}
1000
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001001PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001002{
1003 /* don't care, return None */
1004 Py_INCREF(Py_None);
1005 return Py_None;
1006}
1007
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001008PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001009{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001010 if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001011 return NULL;
1012 }
1013
1014 if (self->statement) {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001015 (void)pysqlite_statement_reset(self->statement);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001016 Py_DECREF(self->statement);
1017 self->statement = 0;
1018 }
1019
1020 Py_INCREF(Py_None);
1021 return Py_None;
1022}
1023
1024static PyMethodDef cursor_methods[] = {
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001025 {"execute", (PyCFunction)pysqlite_cursor_execute, METH_VARARGS,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001026 PyDoc_STR("Executes a SQL statement.")},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001027 {"executemany", (PyCFunction)pysqlite_cursor_executemany, METH_VARARGS,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001028 PyDoc_STR("Repeatedly executes a SQL statement.")},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001029 {"executescript", (PyCFunction)pysqlite_cursor_executescript, METH_VARARGS,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001030 PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001031 {"fetchone", (PyCFunction)pysqlite_cursor_fetchone, METH_NOARGS,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001032 PyDoc_STR("Fetches one row from the resultset.")},
Gerhard Häringe7ea7452008-03-29 00:45:29 +00001033 {"fetchmany", (PyCFunction)pysqlite_cursor_fetchmany, METH_VARARGS|METH_KEYWORDS,
Christian Heimesfdab48e2008-01-20 09:06:41 +00001034 PyDoc_STR("Fetches several rows from the resultset.")},
1035 {"fetchall", (PyCFunction)pysqlite_cursor_fetchall, METH_NOARGS,
1036 PyDoc_STR("Fetches all rows from the resultset.")},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001037 {"close", (PyCFunction)pysqlite_cursor_close, METH_NOARGS,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001038 PyDoc_STR("Closes the cursor.")},
1039 {"setinputsizes", (PyCFunction)pysqlite_noop, METH_VARARGS,
1040 PyDoc_STR("Required by DB-API. Does nothing in pysqlite.")},
1041 {"setoutputsize", (PyCFunction)pysqlite_noop, METH_VARARGS,
1042 PyDoc_STR("Required by DB-API. Does nothing in pysqlite.")},
1043 {NULL, NULL}
1044};
1045
1046static struct PyMemberDef cursor_members[] =
1047{
Guido van Rossum10f07c42007-08-11 15:32:55 +00001048 {"connection", T_OBJECT, offsetof(pysqlite_Cursor, connection), READONLY},
1049 {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), READONLY},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001050 {"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0},
Guido van Rossum10f07c42007-08-11 15:32:55 +00001051 {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY},
1052 {"rowcount", T_OBJECT, offsetof(pysqlite_Cursor, rowcount), READONLY},
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001053 {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001054 {NULL}
1055};
1056
Thomas Wouters477c8d52006-05-27 19:21:47 +00001057static char cursor_doc[] =
1058PyDoc_STR("SQLite database cursor class.");
1059
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001060PyTypeObject pysqlite_CursorType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001061 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062 MODULE_NAME ".Cursor", /* tp_name */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001063 sizeof(pysqlite_Cursor), /* tp_basicsize */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 0, /* tp_itemsize */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001065 (destructor)pysqlite_cursor_dealloc, /* tp_dealloc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001066 0, /* tp_print */
1067 0, /* tp_getattr */
1068 0, /* tp_setattr */
1069 0, /* tp_compare */
1070 0, /* tp_repr */
1071 0, /* tp_as_number */
1072 0, /* tp_as_sequence */
1073 0, /* tp_as_mapping */
1074 0, /* tp_hash */
1075 0, /* tp_call */
1076 0, /* tp_str */
1077 0, /* tp_getattro */
1078 0, /* tp_setattro */
1079 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001080 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 cursor_doc, /* tp_doc */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001082 0, /* tp_traverse */
1083 0, /* tp_clear */
1084 0, /* tp_richcompare */
1085 0, /* tp_weaklistoffset */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001086 (getiterfunc)pysqlite_cursor_getiter, /* tp_iter */
1087 (iternextfunc)pysqlite_cursor_iternext, /* tp_iternext */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 cursor_methods, /* tp_methods */
1089 cursor_members, /* tp_members */
1090 0, /* tp_getset */
1091 0, /* tp_base */
1092 0, /* tp_dict */
1093 0, /* tp_descr_get */
1094 0, /* tp_descr_set */
1095 0, /* tp_dictoffset */
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001096 (initproc)pysqlite_cursor_init, /* tp_init */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001097 0, /* tp_alloc */
1098 0, /* tp_new */
1099 0 /* tp_free */
1100};
1101
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001102extern int pysqlite_cursor_setup_types(void)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001103{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001104 pysqlite_CursorType.tp_new = PyType_GenericNew;
1105 return PyType_Ready(&pysqlite_CursorType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001106}