blob: e62e4d912131e73d931db8062485a17850b7b415 [file] [log] [blame]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001/* connection.c - the connection type
2 *
Gerhard Häring3bbb6722010-03-05 09:12:37 +00003 * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de>
Anthony Baxterc51ee692006-04-01 00:57:31 +00004 *
5 * This file is part of pysqlite.
Anthony Baxter72289a62006-04-04 06:29:05 +00006 *
Anthony Baxterc51ee692006-04-01 00:57:31 +00007 * 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 "cache.h"
25#include "module.h"
26#include "connection.h"
27#include "statement.h"
28#include "cursor.h"
29#include "prepare_protocol.h"
30#include "util.h"
Anthony Baxter72289a62006-04-04 06:29:05 +000031#include "sqlitecompat.h"
32
Anthony Baxterc51ee692006-04-01 00:57:31 +000033#include "pythread.h"
34
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000035#define ACTION_FINALIZE 1
36#define ACTION_RESET 2
37
Gerhard Häring3bbb6722010-03-05 09:12:37 +000038#if SQLITE_VERSION_NUMBER >= 3003008
39#ifndef SQLITE_OMIT_LOAD_EXTENSION
40#define HAVE_LOAD_EXTENSION
41#endif
42#endif
43
Gerhard Häring0741a602007-01-14 01:43:50 +000044static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level);
Gerhard Häring3bbb6722010-03-05 09:12:37 +000045static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self);
Anthony Baxterc51ee692006-04-01 00:57:31 +000046
Gerhard Häringb2e88162006-06-14 22:28:37 +000047
Gerhard Häring6e1afcf2008-09-12 18:58:57 +000048static void _sqlite3_result_error(sqlite3_context* ctx, const char* errmsg, int len)
Gerhard Häringb2e88162006-06-14 22:28:37 +000049{
50 /* in older SQLite versions, calling sqlite3_result_error in callbacks
51 * triggers a bug in SQLite that leads either to irritating results or
52 * segfaults, depending on the SQLite version */
53#if SQLITE_VERSION_NUMBER >= 3003003
54 sqlite3_result_error(ctx, errmsg, len);
Neal Norwitzfe7d0c32006-06-15 04:54:29 +000055#else
Gerhard Häring0741a602007-01-14 01:43:50 +000056 PyErr_SetString(pysqlite_OperationalError, errmsg);
Gerhard Häringb2e88162006-06-14 22:28:37 +000057#endif
58}
59
Gerhard Häring0741a602007-01-14 01:43:50 +000060int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Anthony Baxterc51ee692006-04-01 00:57:31 +000061{
62 static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
63
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000064 PyObject* database;
Anthony Baxterc51ee692006-04-01 00:57:31 +000065 int detect_types = 0;
66 PyObject* isolation_level = NULL;
67 PyObject* factory = NULL;
68 int check_same_thread = 1;
69 int cached_statements = 100;
70 double timeout = 5.0;
71 int rc;
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000072 PyObject* class_attr = NULL;
73 PyObject* class_attr_str = NULL;
74 int is_apsw_connection = 0;
75 PyObject* database_utf8;
Anthony Baxterc51ee692006-04-01 00:57:31 +000076
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000077 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist,
Anthony Baxterc51ee692006-04-01 00:57:31 +000078 &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
79 {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000080 return -1;
Anthony Baxterc51ee692006-04-01 00:57:31 +000081 }
82
Gerhard Häring3bbb6722010-03-05 09:12:37 +000083 self->initialized = 1;
84
Anthony Baxterc51ee692006-04-01 00:57:31 +000085 self->begin_statement = NULL;
86
87 self->statement_cache = NULL;
Gerhard Häring3e99c0a2006-04-23 15:24:26 +000088 self->statements = NULL;
Gerhard Häring3bbb6722010-03-05 09:12:37 +000089 self->cursors = NULL;
Anthony Baxterc51ee692006-04-01 00:57:31 +000090
91 Py_INCREF(Py_None);
92 self->row_factory = Py_None;
93
94 Py_INCREF(&PyUnicode_Type);
95 self->text_factory = (PyObject*)&PyUnicode_Type;
96
Gregory P. Smithdd96db62008-06-09 04:58:54 +000097 if (PyString_Check(database) || PyUnicode_Check(database)) {
98 if (PyString_Check(database)) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +000099 database_utf8 = database;
100 Py_INCREF(database_utf8);
101 } else {
102 database_utf8 = PyUnicode_AsUTF8String(database);
103 if (!database_utf8) {
104 return -1;
105 }
106 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000107
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000108 Py_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000109 rc = sqlite3_open(PyString_AsString(database_utf8), &self->db);
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000110 Py_END_ALLOW_THREADS
111
112 Py_DECREF(database_utf8);
113
114 if (rc != SQLITE_OK) {
115 _pysqlite_seterror(self->db, NULL);
116 return -1;
117 }
118 } else {
Martin Panterbf2dca92016-07-11 07:51:37 +0000119 /* Create a pysqlite connection from an APSW connection */
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000120 class_attr = PyObject_GetAttrString(database, "__class__");
121 if (class_attr) {
122 class_attr_str = PyObject_Str(class_attr);
123 if (class_attr_str) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000124 if (strcmp(PyString_AsString(class_attr_str), "<type 'apsw.Connection'>") == 0) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000125 /* In the APSW Connection object, the first entry after
126 * PyObject_HEAD is the sqlite3* we want to get hold of.
127 * Luckily, this is the same layout as we have in our
128 * pysqlite_Connection */
129 self->db = ((pysqlite_Connection*)database)->db;
130
131 Py_INCREF(database);
132 self->apsw_connection = database;
133 is_apsw_connection = 1;
134 }
135 }
136 }
137 Py_XDECREF(class_attr_str);
138 Py_XDECREF(class_attr);
139
140 if (!is_apsw_connection) {
141 PyErr_SetString(PyExc_ValueError, "database parameter must be string or APSW Connection object");
142 return -1;
143 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000144 }
145
146 if (!isolation_level) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000147 isolation_level = PyString_FromString("");
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000148 if (!isolation_level) {
149 return -1;
150 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000151 } else {
152 Py_INCREF(isolation_level);
153 }
154 self->isolation_level = NULL;
Victor Stinner94502192013-12-19 16:44:48 +0100155 if (pysqlite_connection_set_isolation_level(self, isolation_level) < 0) {
156 Py_DECREF(isolation_level);
157 return -1;
158 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000159 Py_DECREF(isolation_level);
160
Gerhard Häring0741a602007-01-14 01:43:50 +0000161 self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000162 if (PyErr_Occurred()) {
163 return -1;
164 }
165
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000166 self->created_statements = 0;
167 self->created_cursors = 0;
168
169 /* Create lists of weak references to statements/cursors */
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000170 self->statements = PyList_New(0);
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000171 self->cursors = PyList_New(0);
172 if (!self->statements || !self->cursors) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000173 return -1;
174 }
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000175
Anthony Baxterc51ee692006-04-01 00:57:31 +0000176 /* By default, the Cache class INCREFs the factory in its initializer, and
177 * decrefs it in its deallocator method. Since this would create a circular
178 * reference here, we're breaking it by decrementing self, and telling the
179 * cache class to not decref the factory (self) in its deallocator.
180 */
181 self->statement_cache->decref_factory = 0;
182 Py_DECREF(self);
183
184 self->inTransaction = 0;
185 self->detect_types = detect_types;
186 self->timeout = timeout;
187 (void)sqlite3_busy_timeout(self->db, (int)(timeout*1000));
Georg Brandld3eaa742009-04-05 11:07:14 +0000188#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000189 self->thread_ident = PyThread_get_thread_ident();
Georg Brandld3eaa742009-04-05 11:07:14 +0000190#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000191 self->check_same_thread = check_same_thread;
192
193 self->function_pinboard = PyDict_New();
Anthony Baxter72289a62006-04-04 06:29:05 +0000194 if (!self->function_pinboard) {
195 return -1;
196 }
197
198 self->collations = PyDict_New();
199 if (!self->collations) {
200 return -1;
201 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000202
Gerhard Häring0741a602007-01-14 01:43:50 +0000203 self->Warning = pysqlite_Warning;
204 self->Error = pysqlite_Error;
205 self->InterfaceError = pysqlite_InterfaceError;
206 self->DatabaseError = pysqlite_DatabaseError;
207 self->DataError = pysqlite_DataError;
208 self->OperationalError = pysqlite_OperationalError;
209 self->IntegrityError = pysqlite_IntegrityError;
210 self->InternalError = pysqlite_InternalError;
211 self->ProgrammingError = pysqlite_ProgrammingError;
212 self->NotSupportedError = pysqlite_NotSupportedError;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000213
214 return 0;
215}
216
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000217/* Empty the entire statement cache of this connection */
Gerhard Häring0741a602007-01-14 01:43:50 +0000218void pysqlite_flush_statement_cache(pysqlite_Connection* self)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000219{
Gerhard Häring0741a602007-01-14 01:43:50 +0000220 pysqlite_Node* node;
221 pysqlite_Statement* statement;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000222
223 node = self->statement_cache->first;
224
225 while (node) {
Gerhard Häring0741a602007-01-14 01:43:50 +0000226 statement = (pysqlite_Statement*)(node->data);
227 (void)pysqlite_statement_finalize(statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000228 node = node->next;
229 }
230
Serhiy Storchaka763a61c2016-04-10 18:05:12 +0300231 Py_SETREF(self->statement_cache,
Serhiy Storchaka5951f232015-12-24 10:35:35 +0200232 (pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self));
Anthony Baxterc51ee692006-04-01 00:57:31 +0000233 Py_DECREF(self);
234 self->statement_cache->decref_factory = 0;
235}
236
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000237/* action in (ACTION_RESET, ACTION_FINALIZE) */
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000238void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset_cursors)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000239{
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000240 int i;
241 PyObject* weakref;
242 PyObject* statement;
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000243 pysqlite_Cursor* cursor;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000244
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000245 for (i = 0; i < PyList_Size(self->statements); i++) {
246 weakref = PyList_GetItem(self->statements, i);
247 statement = PyWeakref_GetObject(weakref);
248 if (statement != Py_None) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000249 if (action == ACTION_RESET) {
250 (void)pysqlite_statement_reset((pysqlite_Statement*)statement);
251 } else {
252 (void)pysqlite_statement_finalize((pysqlite_Statement*)statement);
253 }
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000254 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000255 }
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000256
257 if (reset_cursors) {
258 for (i = 0; i < PyList_Size(self->cursors); i++) {
259 weakref = PyList_GetItem(self->cursors, i);
260 cursor = (pysqlite_Cursor*)PyWeakref_GetObject(weakref);
261 if ((PyObject*)cursor != Py_None) {
262 cursor->reset = 1;
263 }
264 }
265 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000266}
267
Gerhard Häring0741a602007-01-14 01:43:50 +0000268void pysqlite_connection_dealloc(pysqlite_Connection* self)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000269{
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000270 PyObject* ret = NULL;
271
Anthony Baxterc51ee692006-04-01 00:57:31 +0000272 Py_XDECREF(self->statement_cache);
273
274 /* Clean up if user has not called .close() explicitly. */
275 if (self->db) {
276 Py_BEGIN_ALLOW_THREADS
277 sqlite3_close(self->db);
278 Py_END_ALLOW_THREADS
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000279 } else if (self->apsw_connection) {
280 ret = PyObject_CallMethod(self->apsw_connection, "close", "");
281 Py_XDECREF(ret);
282 Py_XDECREF(self->apsw_connection);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000283 }
284
285 if (self->begin_statement) {
286 PyMem_Free(self->begin_statement);
287 }
288 Py_XDECREF(self->isolation_level);
289 Py_XDECREF(self->function_pinboard);
290 Py_XDECREF(self->row_factory);
291 Py_XDECREF(self->text_factory);
Anthony Baxter72289a62006-04-04 06:29:05 +0000292 Py_XDECREF(self->collations);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000293 Py_XDECREF(self->statements);
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000294 Py_XDECREF(self->cursors);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000295
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000296 self->ob_type->tp_free((PyObject*)self);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000297}
298
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000299/*
300 * Registers a cursor with the connection.
301 *
302 * 0 => error; 1 => ok
303 */
304int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor)
305{
306 PyObject* weakref;
307
308 weakref = PyWeakref_NewRef((PyObject*)cursor, NULL);
309 if (!weakref) {
310 goto error;
311 }
312
313 if (PyList_Append(connection->cursors, weakref) != 0) {
314 Py_CLEAR(weakref);
315 goto error;
316 }
317
318 Py_DECREF(weakref);
319
320 return 1;
321error:
322 return 0;
323}
324
Gerhard Häring0741a602007-01-14 01:43:50 +0000325PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000326{
Serhiy Storchakae63af902016-08-29 14:29:55 +0300327 static char *kwlist[] = {"factory", NULL};
Anthony Baxterc51ee692006-04-01 00:57:31 +0000328 PyObject* factory = NULL;
329 PyObject* cursor;
330
Anthony Baxterc51ee692006-04-01 00:57:31 +0000331 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist,
332 &factory)) {
333 return NULL;
334 }
335
Gerhard Häring0741a602007-01-14 01:43:50 +0000336 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000337 return NULL;
338 }
339
340 if (factory == NULL) {
Gerhard Häring0741a602007-01-14 01:43:50 +0000341 factory = (PyObject*)&pysqlite_CursorType;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000342 }
343
Serhiy Storchakae63af902016-08-29 14:29:55 +0300344 cursor = PyObject_CallFunctionObjArgs(factory, (PyObject *)self, NULL);
345 if (cursor == NULL)
346 return NULL;
347 if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) {
348 PyErr_Format(PyExc_TypeError,
349 "factory must return a cursor, not %.100s",
350 Py_TYPE(cursor)->tp_name);
351 Py_DECREF(cursor);
352 return NULL;
353 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000354
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000355 _pysqlite_drop_unused_cursor_references(self);
356
Anthony Baxterc51ee692006-04-01 00:57:31 +0000357 if (cursor && self->row_factory != Py_None) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000358 Py_INCREF(self->row_factory);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300359 Py_XSETREF(((pysqlite_Cursor *)cursor)->row_factory, self->row_factory);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000360 }
361
362 return cursor;
363}
364
Gerhard Häring0741a602007-01-14 01:43:50 +0000365PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000366{
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000367 PyObject* ret;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000368 int rc;
369
Gerhard Häring0741a602007-01-14 01:43:50 +0000370 if (!pysqlite_check_thread(self)) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000371 return NULL;
372 }
373
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000374 pysqlite_do_all_statements(self, ACTION_FINALIZE, 1);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000375
376 if (self->db) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000377 if (self->apsw_connection) {
378 ret = PyObject_CallMethod(self->apsw_connection, "close", "");
379 Py_XDECREF(ret);
Serhiy Storchaka98a97222014-02-09 13:14:04 +0200380 Py_CLEAR(self->apsw_connection);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000381 self->db = NULL;
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000382 } else {
383 Py_BEGIN_ALLOW_THREADS
384 rc = sqlite3_close(self->db);
385 Py_END_ALLOW_THREADS
386
387 if (rc != SQLITE_OK) {
388 _pysqlite_seterror(self->db, NULL);
389 return NULL;
390 } else {
391 self->db = NULL;
392 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000393 }
394 }
395
396 Py_INCREF(Py_None);
397 return Py_None;
398}
399
400/*
401 * Checks if a connection object is usable (i. e. not closed).
402 *
403 * 0 => error; 1 => ok
404 */
Gerhard Häring0741a602007-01-14 01:43:50 +0000405int pysqlite_check_connection(pysqlite_Connection* con)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000406{
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000407 if (!con->initialized) {
408 PyErr_SetString(pysqlite_ProgrammingError, "Base Connection.__init__ not called.");
409 return 0;
410 }
411
Anthony Baxterc51ee692006-04-01 00:57:31 +0000412 if (!con->db) {
Gerhard Häring0741a602007-01-14 01:43:50 +0000413 PyErr_SetString(pysqlite_ProgrammingError, "Cannot operate on a closed database.");
Anthony Baxterc51ee692006-04-01 00:57:31 +0000414 return 0;
415 } else {
416 return 1;
417 }
418}
419
Gerhard Häring0741a602007-01-14 01:43:50 +0000420PyObject* _pysqlite_connection_begin(pysqlite_Connection* self)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000421{
422 int rc;
423 const char* tail;
424 sqlite3_stmt* statement;
425
426 Py_BEGIN_ALLOW_THREADS
427 rc = sqlite3_prepare(self->db, self->begin_statement, -1, &statement, &tail);
428 Py_END_ALLOW_THREADS
429
430 if (rc != SQLITE_OK) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000431 _pysqlite_seterror(self->db, statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000432 goto error;
433 }
434
Gerhard Häring6e1afcf2008-09-12 18:58:57 +0000435 rc = pysqlite_step(statement, self);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000436 if (rc == SQLITE_DONE) {
437 self->inTransaction = 1;
438 } else {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000439 _pysqlite_seterror(self->db, statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000440 }
441
442 Py_BEGIN_ALLOW_THREADS
443 rc = sqlite3_finalize(statement);
444 Py_END_ALLOW_THREADS
445
446 if (rc != SQLITE_OK && !PyErr_Occurred()) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000447 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000448 }
449
450error:
451 if (PyErr_Occurred()) {
452 return NULL;
453 } else {
454 Py_INCREF(Py_None);
455 return Py_None;
456 }
457}
458
Gerhard Häring0741a602007-01-14 01:43:50 +0000459PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000460{
461 int rc;
462 const char* tail;
463 sqlite3_stmt* statement;
464
Gerhard Häring0741a602007-01-14 01:43:50 +0000465 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000466 return NULL;
467 }
468
469 if (self->inTransaction) {
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000470
Anthony Baxterc51ee692006-04-01 00:57:31 +0000471 Py_BEGIN_ALLOW_THREADS
472 rc = sqlite3_prepare(self->db, "COMMIT", -1, &statement, &tail);
473 Py_END_ALLOW_THREADS
474 if (rc != SQLITE_OK) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000475 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000476 goto error;
477 }
478
Gerhard Häring6e1afcf2008-09-12 18:58:57 +0000479 rc = pysqlite_step(statement, self);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000480 if (rc == SQLITE_DONE) {
481 self->inTransaction = 0;
482 } else {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000483 _pysqlite_seterror(self->db, statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000484 }
485
486 Py_BEGIN_ALLOW_THREADS
487 rc = sqlite3_finalize(statement);
488 Py_END_ALLOW_THREADS
489 if (rc != SQLITE_OK && !PyErr_Occurred()) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000490 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000491 }
492
493 }
494
495error:
496 if (PyErr_Occurred()) {
497 return NULL;
498 } else {
499 Py_INCREF(Py_None);
500 return Py_None;
501 }
502}
503
Gerhard Häring0741a602007-01-14 01:43:50 +0000504PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000505{
506 int rc;
507 const char* tail;
508 sqlite3_stmt* statement;
509
Gerhard Häring0741a602007-01-14 01:43:50 +0000510 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000511 return NULL;
512 }
513
514 if (self->inTransaction) {
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000515 pysqlite_do_all_statements(self, ACTION_RESET, 1);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000516
517 Py_BEGIN_ALLOW_THREADS
518 rc = sqlite3_prepare(self->db, "ROLLBACK", -1, &statement, &tail);
519 Py_END_ALLOW_THREADS
520 if (rc != SQLITE_OK) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000521 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000522 goto error;
523 }
524
Gerhard Häring6e1afcf2008-09-12 18:58:57 +0000525 rc = pysqlite_step(statement, self);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000526 if (rc == SQLITE_DONE) {
527 self->inTransaction = 0;
528 } else {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000529 _pysqlite_seterror(self->db, statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000530 }
531
532 Py_BEGIN_ALLOW_THREADS
533 rc = sqlite3_finalize(statement);
534 Py_END_ALLOW_THREADS
535 if (rc != SQLITE_OK && !PyErr_Occurred()) {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000536 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000537 }
538
539 }
540
541error:
542 if (PyErr_Occurred()) {
543 return NULL;
544 } else {
545 Py_INCREF(Py_None);
546 return Py_None;
547 }
548}
549
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200550static int
551_pysqlite_set_result(sqlite3_context* context, PyObject* py_val)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000552{
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200553 if (py_val == Py_None) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000554 sqlite3_result_null(context);
555 } else if (PyInt_Check(py_val)) {
Ned Deily77e77a12012-05-19 23:35:05 -0700556 sqlite3_result_int64(context, (sqlite_int64)PyInt_AsLong(py_val));
Petri Lehtinen4ab701b2012-02-21 13:58:40 +0200557 } else if (PyLong_Check(py_val)) {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200558 sqlite_int64 value = _pysqlite_long_as_int64(py_val);
559 if (value == -1 && PyErr_Occurred())
560 return -1;
561 sqlite3_result_int64(context, value);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000562 } else if (PyFloat_Check(py_val)) {
563 sqlite3_result_double(context, PyFloat_AsDouble(py_val));
564 } else if (PyBuffer_Check(py_val)) {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200565 const char* buffer;
566 Py_ssize_t buflen;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000567 if (PyObject_AsCharBuffer(py_val, &buffer, &buflen) != 0) {
568 PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer");
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200569 return -1;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000570 }
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200571 sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000572 } else if (PyString_Check(py_val)) {
573 sqlite3_result_text(context, PyString_AsString(py_val), -1, SQLITE_TRANSIENT);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000574 } else if (PyUnicode_Check(py_val)) {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200575 PyObject * stringval = PyUnicode_AsUTF8String(py_val);
576 if (!stringval)
577 return -1;
578 sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT);
579 Py_DECREF(stringval);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000580 } else {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200581 return -1;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000582 }
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200583 return 0;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000584}
585
Gerhard Häring0741a602007-01-14 01:43:50 +0000586PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000587{
588 PyObject* args;
589 int i;
590 sqlite3_value* cur_value;
591 PyObject* cur_py_value;
592 const char* val_str;
Neal Norwitz95f0e4c2006-04-01 09:08:06 +0000593 Py_ssize_t buflen;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000594 void* raw_buffer;
595
596 args = PyTuple_New(argc);
Anthony Baxter72289a62006-04-04 06:29:05 +0000597 if (!args) {
598 return NULL;
599 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000600
601 for (i = 0; i < argc; i++) {
602 cur_value = argv[i];
603 switch (sqlite3_value_type(argv[i])) {
604 case SQLITE_INTEGER:
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200605 cur_py_value = _pysqlite_long_from_int64(sqlite3_value_int64(cur_value));
Anthony Baxterc51ee692006-04-01 00:57:31 +0000606 break;
607 case SQLITE_FLOAT:
608 cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));
609 break;
610 case SQLITE_TEXT:
611 val_str = (const char*)sqlite3_value_text(cur_value);
612 cur_py_value = PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL);
613 /* TODO: have a way to show errors here */
614 if (!cur_py_value) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000615 PyErr_Clear();
Anthony Baxterc51ee692006-04-01 00:57:31 +0000616 Py_INCREF(Py_None);
617 cur_py_value = Py_None;
618 }
619 break;
620 case SQLITE_BLOB:
621 buflen = sqlite3_value_bytes(cur_value);
622 cur_py_value = PyBuffer_New(buflen);
623 if (!cur_py_value) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000624 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000625 }
626 if (PyObject_AsWriteBuffer(cur_py_value, &raw_buffer, &buflen)) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000627 Py_DECREF(cur_py_value);
628 cur_py_value = NULL;
629 break;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000630 }
631 memcpy(raw_buffer, sqlite3_value_blob(cur_value), buflen);
632 break;
633 case SQLITE_NULL:
634 default:
635 Py_INCREF(Py_None);
636 cur_py_value = Py_None;
637 }
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000638
639 if (!cur_py_value) {
640 Py_DECREF(args);
641 return NULL;
642 }
643
Anthony Baxterc51ee692006-04-01 00:57:31 +0000644 PyTuple_SetItem(args, i, cur_py_value);
645
646 }
647
648 return args;
649}
650
Gerhard Häring0741a602007-01-14 01:43:50 +0000651void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000652{
653 PyObject* args;
654 PyObject* py_func;
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000655 PyObject* py_retval = NULL;
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200656 int ok;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000657
Georg Brandld3eaa742009-04-05 11:07:14 +0000658#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000659 PyGILState_STATE threadstate;
660
661 threadstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +0000662#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000663
664 py_func = (PyObject*)sqlite3_user_data(context);
665
Gerhard Häring0741a602007-01-14 01:43:50 +0000666 args = _pysqlite_build_py_params(context, argc, argv);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000667 if (args) {
668 py_retval = PyObject_CallObject(py_func, args);
669 Py_DECREF(args);
670 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000671
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200672 ok = 0;
Gerhard Häring1541ef02006-06-13 22:24:47 +0000673 if (py_retval) {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200674 ok = _pysqlite_set_result(context, py_retval) == 0;
Gerhard Häring1541ef02006-06-13 22:24:47 +0000675 Py_DECREF(py_retval);
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200676 }
677 if (!ok) {
Gerhard Häring1541ef02006-06-13 22:24:47 +0000678 if (_enable_callback_tracebacks) {
679 PyErr_Print();
680 } else {
681 PyErr_Clear();
682 }
Gerhard Häringb2e88162006-06-14 22:28:37 +0000683 _sqlite3_result_error(context, "user-defined function raised exception", -1);
Gerhard Häring1541ef02006-06-13 22:24:47 +0000684 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000685
Georg Brandld3eaa742009-04-05 11:07:14 +0000686#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000687 PyGILState_Release(threadstate);
Georg Brandld3eaa742009-04-05 11:07:14 +0000688#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000689}
690
Gerhard Häring0741a602007-01-14 01:43:50 +0000691static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_value** params)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000692{
693 PyObject* args;
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000694 PyObject* function_result = NULL;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000695 PyObject* aggregate_class;
696 PyObject** aggregate_instance;
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000697 PyObject* stepmethod = NULL;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000698
Georg Brandld3eaa742009-04-05 11:07:14 +0000699#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000700 PyGILState_STATE threadstate;
701
702 threadstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +0000703#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000704
705 aggregate_class = (PyObject*)sqlite3_user_data(context);
706
707 aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
708
709 if (*aggregate_instance == 0) {
710 *aggregate_instance = PyObject_CallFunction(aggregate_class, "");
711
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000712 if (PyErr_Occurred()) {
Anthony Baxterc51ee692006-04-01 00:57:31 +0000713 *aggregate_instance = 0;
Gerhard Häring1541ef02006-06-13 22:24:47 +0000714 if (_enable_callback_tracebacks) {
715 PyErr_Print();
716 } else {
717 PyErr_Clear();
718 }
Gerhard Häringb2e88162006-06-14 22:28:37 +0000719 _sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000720 goto error;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000721 }
722 }
723
724 stepmethod = PyObject_GetAttrString(*aggregate_instance, "step");
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000725 if (!stepmethod) {
726 goto error;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000727 }
728
Gerhard Häring0741a602007-01-14 01:43:50 +0000729 args = _pysqlite_build_py_params(context, argc, params);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000730 if (!args) {
731 goto error;
732 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000733
734 function_result = PyObject_CallObject(stepmethod, args);
735 Py_DECREF(args);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000736
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000737 if (!function_result) {
Gerhard Häring1541ef02006-06-13 22:24:47 +0000738 if (_enable_callback_tracebacks) {
739 PyErr_Print();
740 } else {
741 PyErr_Clear();
742 }
Gerhard Häringb2e88162006-06-14 22:28:37 +0000743 _sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000744 }
745
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000746error:
747 Py_XDECREF(stepmethod);
748 Py_XDECREF(function_result);
749
Georg Brandld3eaa742009-04-05 11:07:14 +0000750#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000751 PyGILState_Release(threadstate);
Georg Brandld3eaa742009-04-05 11:07:14 +0000752#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000753}
754
Gerhard Häring0741a602007-01-14 01:43:50 +0000755void _pysqlite_final_callback(sqlite3_context* context)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000756{
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200757 PyObject* function_result;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000758 PyObject** aggregate_instance;
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200759 int ok;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000760
Georg Brandld3eaa742009-04-05 11:07:14 +0000761#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000762 PyGILState_STATE threadstate;
763
764 threadstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +0000765#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000766
Anthony Baxterc51ee692006-04-01 00:57:31 +0000767 aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
768 if (!*aggregate_instance) {
769 /* this branch is executed if there was an exception in the aggregate's
770 * __init__ */
771
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000772 goto error;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000773 }
774
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000775 function_result = PyObject_CallMethod(*aggregate_instance, "finalize", "");
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200776 Py_DECREF(*aggregate_instance);
777
778 ok = 0;
779 if (function_result) {
780 ok = _pysqlite_set_result(context, function_result) == 0;
781 Py_DECREF(function_result);
782 }
783 if (!ok) {
Gerhard Häring1541ef02006-06-13 22:24:47 +0000784 if (_enable_callback_tracebacks) {
785 PyErr_Print();
786 } else {
787 PyErr_Clear();
788 }
Gerhard Häringb2e88162006-06-14 22:28:37 +0000789 _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000790 }
791
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000792error:
Georg Brandld3eaa742009-04-05 11:07:14 +0000793#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +0000794 PyGILState_Release(threadstate);
Georg Brandld3eaa742009-04-05 11:07:14 +0000795#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +0000796}
797
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000798static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self)
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000799{
800 PyObject* new_list;
801 PyObject* weakref;
802 int i;
803
804 /* we only need to do this once in a while */
805 if (self->created_statements++ < 200) {
806 return;
807 }
808
809 self->created_statements = 0;
810
811 new_list = PyList_New(0);
812 if (!new_list) {
813 return;
814 }
815
816 for (i = 0; i < PyList_Size(self->statements); i++) {
817 weakref = PyList_GetItem(self->statements, i);
Gerhard Häringecd20102006-06-19 21:17:35 +0000818 if (PyWeakref_GetObject(weakref) != Py_None) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000819 if (PyList_Append(new_list, weakref) != 0) {
820 Py_DECREF(new_list);
821 return;
822 }
823 }
824 }
825
Serhiy Storchaka763a61c2016-04-10 18:05:12 +0300826 Py_SETREF(self->statements, new_list);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000827}
Anthony Baxterc51ee692006-04-01 00:57:31 +0000828
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000829static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
830{
831 PyObject* new_list;
832 PyObject* weakref;
833 int i;
834
835 /* we only need to do this once in a while */
836 if (self->created_cursors++ < 200) {
837 return;
838 }
839
840 self->created_cursors = 0;
841
842 new_list = PyList_New(0);
843 if (!new_list) {
844 return;
845 }
846
847 for (i = 0; i < PyList_Size(self->cursors); i++) {
848 weakref = PyList_GetItem(self->cursors, i);
849 if (PyWeakref_GetObject(weakref) != Py_None) {
850 if (PyList_Append(new_list, weakref) != 0) {
851 Py_DECREF(new_list);
852 return;
853 }
854 }
855 }
856
Serhiy Storchaka763a61c2016-04-10 18:05:12 +0300857 Py_SETREF(self->cursors, new_list);
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000858}
859
Gerhard Häring0741a602007-01-14 01:43:50 +0000860PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000861{
862 static char *kwlist[] = {"name", "narg", "func", NULL, NULL};
863
864 PyObject* func;
865 char* name;
866 int narg;
867 int rc;
868
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000869 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
870 return NULL;
871 }
872
Anthony Baxterc51ee692006-04-01 00:57:31 +0000873 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO", kwlist,
874 &name, &narg, &func))
875 {
876 return NULL;
877 }
878
Gerhard Häring0741a602007-01-14 01:43:50 +0000879 rc = sqlite3_create_function(self->db, name, narg, SQLITE_UTF8, (void*)func, _pysqlite_func_callback, NULL, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000880
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000881 if (rc != SQLITE_OK) {
882 /* Workaround for SQLite bug: no error code or string is available here */
Gerhard Häring0741a602007-01-14 01:43:50 +0000883 PyErr_SetString(pysqlite_OperationalError, "Error creating function");
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000884 return NULL;
885 } else {
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000886 if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1)
887 return NULL;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000888
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000889 Py_INCREF(Py_None);
890 return Py_None;
891 }
Anthony Baxterc51ee692006-04-01 00:57:31 +0000892}
893
Gerhard Häring0741a602007-01-14 01:43:50 +0000894PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Anthony Baxterc51ee692006-04-01 00:57:31 +0000895{
896 PyObject* aggregate_class;
897
898 int n_arg;
899 char* name;
900 static char *kwlist[] = { "name", "n_arg", "aggregate_class", NULL };
901 int rc;
902
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000903 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
904 return NULL;
905 }
906
Anthony Baxterc51ee692006-04-01 00:57:31 +0000907 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO:create_aggregate",
908 kwlist, &name, &n_arg, &aggregate_class)) {
909 return NULL;
910 }
911
Gerhard Häring0741a602007-01-14 01:43:50 +0000912 rc = sqlite3_create_function(self->db, name, n_arg, SQLITE_UTF8, (void*)aggregate_class, 0, &_pysqlite_step_callback, &_pysqlite_final_callback);
Anthony Baxterc51ee692006-04-01 00:57:31 +0000913 if (rc != SQLITE_OK) {
Gerhard Häring3e99c0a2006-04-23 15:24:26 +0000914 /* Workaround for SQLite bug: no error code or string is available here */
Gerhard Häring0741a602007-01-14 01:43:50 +0000915 PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate");
Anthony Baxterc51ee692006-04-01 00:57:31 +0000916 return NULL;
917 } else {
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000918 if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1)
919 return NULL;
Anthony Baxterc51ee692006-04-01 00:57:31 +0000920
921 Py_INCREF(Py_None);
922 return Py_None;
923 }
924}
925
Gerhard Häring0741a602007-01-14 01:43:50 +0000926static int _authorizer_callback(void* user_arg, int action, const char* arg1, const char* arg2 , const char* dbname, const char* access_attempt_source)
Gerhard Häring1541ef02006-06-13 22:24:47 +0000927{
928 PyObject *ret;
929 int rc;
Georg Brandld3eaa742009-04-05 11:07:14 +0000930#ifdef WITH_THREAD
Gerhard Häring1541ef02006-06-13 22:24:47 +0000931 PyGILState_STATE gilstate;
932
933 gilstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +0000934#endif
Gerhard Häring1541ef02006-06-13 22:24:47 +0000935 ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
936
937 if (!ret) {
938 if (_enable_callback_tracebacks) {
939 PyErr_Print();
940 } else {
941 PyErr_Clear();
942 }
943
944 rc = SQLITE_DENY;
945 } else {
946 if (PyInt_Check(ret)) {
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200947 rc = _PyInt_AsInt(ret);
948 if (rc == -1 && PyErr_Occurred())
949 rc = SQLITE_DENY;
Gerhard Häring1541ef02006-06-13 22:24:47 +0000950 } else {
951 rc = SQLITE_DENY;
952 }
953 Py_DECREF(ret);
954 }
955
Georg Brandld3eaa742009-04-05 11:07:14 +0000956#ifdef WITH_THREAD
Gerhard Häring1541ef02006-06-13 22:24:47 +0000957 PyGILState_Release(gilstate);
Georg Brandld3eaa742009-04-05 11:07:14 +0000958#endif
Gerhard Häring1541ef02006-06-13 22:24:47 +0000959 return rc;
960}
961
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000962static int _progress_handler(void* user_arg)
963{
964 int rc;
965 PyObject *ret;
Georg Brandld3eaa742009-04-05 11:07:14 +0000966#ifdef WITH_THREAD
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000967 PyGILState_STATE gilstate;
968
969 gilstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +0000970#endif
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000971 ret = PyObject_CallFunction((PyObject*)user_arg, "");
972
973 if (!ret) {
974 if (_enable_callback_tracebacks) {
975 PyErr_Print();
976 } else {
977 PyErr_Clear();
978 }
979
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000980 /* abort query if error occurred */
Serhiy Storchaka35c52b62013-02-07 16:59:34 +0200981 rc = 1;
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000982 } else {
983 rc = (int)PyObject_IsTrue(ret);
Neal Norwitzca752f32008-03-03 04:37:45 +0000984 Py_DECREF(ret);
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000985 }
986
Georg Brandld3eaa742009-04-05 11:07:14 +0000987#ifdef WITH_THREAD
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000988 PyGILState_Release(gilstate);
Georg Brandld3eaa742009-04-05 11:07:14 +0000989#endif
Gerhard Häring1cc60ed2008-02-29 22:08:41 +0000990 return rc;
991}
992
Gerhard Häring3bbb6722010-03-05 09:12:37 +0000993static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Gerhard Häring1541ef02006-06-13 22:24:47 +0000994{
995 PyObject* authorizer_cb;
996
997 static char *kwlist[] = { "authorizer_callback", NULL };
998 int rc;
999
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001000 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
1001 return NULL;
1002 }
1003
Gerhard Häring1541ef02006-06-13 22:24:47 +00001004 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_authorizer",
1005 kwlist, &authorizer_cb)) {
1006 return NULL;
1007 }
1008
1009 rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb);
1010
1011 if (rc != SQLITE_OK) {
Gerhard Häring0741a602007-01-14 01:43:50 +00001012 PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback");
Gerhard Häring1541ef02006-06-13 22:24:47 +00001013 return NULL;
1014 } else {
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001015 if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1)
1016 return NULL;
Gerhard Häring1541ef02006-06-13 22:24:47 +00001017
1018 Py_INCREF(Py_None);
1019 return Py_None;
1020 }
1021}
1022
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001023static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001024{
1025 PyObject* progress_handler;
1026 int n;
1027
1028 static char *kwlist[] = { "progress_handler", "n", NULL };
1029
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001030 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
1031 return NULL;
1032 }
1033
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001034 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi:set_progress_handler",
1035 kwlist, &progress_handler, &n)) {
1036 return NULL;
1037 }
1038
1039 if (progress_handler == Py_None) {
1040 /* None clears the progress handler previously set */
1041 sqlite3_progress_handler(self->db, 0, 0, (void*)0);
1042 } else {
1043 sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler);
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001044 if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1)
1045 return NULL;
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001046 }
1047
1048 Py_INCREF(Py_None);
1049 return Py_None;
1050}
1051
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001052#ifdef HAVE_LOAD_EXTENSION
1053static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args)
1054{
1055 int rc;
1056 int onoff;
1057
1058 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
1059 return NULL;
1060 }
1061
1062 if (!PyArg_ParseTuple(args, "i", &onoff)) {
1063 return NULL;
1064 }
1065
1066 rc = sqlite3_enable_load_extension(self->db, onoff);
1067
1068 if (rc != SQLITE_OK) {
1069 PyErr_SetString(pysqlite_OperationalError, "Error enabling load extension");
1070 return NULL;
1071 } else {
1072 Py_INCREF(Py_None);
1073 return Py_None;
1074 }
1075}
1076
1077static PyObject* pysqlite_load_extension(pysqlite_Connection* self, PyObject* args)
1078{
1079 int rc;
1080 char* extension_name;
1081 char* errmsg;
1082
1083 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
1084 return NULL;
1085 }
1086
1087 if (!PyArg_ParseTuple(args, "s", &extension_name)) {
1088 return NULL;
1089 }
1090
1091 rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg);
1092 if (rc != 0) {
1093 PyErr_SetString(pysqlite_OperationalError, errmsg);
1094 return NULL;
1095 } else {
1096 Py_INCREF(Py_None);
1097 return Py_None;
1098 }
1099}
1100#endif
1101
Gerhard Häring0741a602007-01-14 01:43:50 +00001102int pysqlite_check_thread(pysqlite_Connection* self)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001103{
Georg Brandld3eaa742009-04-05 11:07:14 +00001104#ifdef WITH_THREAD
Anthony Baxterc51ee692006-04-01 00:57:31 +00001105 if (self->check_same_thread) {
1106 if (PyThread_get_thread_ident() != self->thread_ident) {
Gerhard Häring0741a602007-01-14 01:43:50 +00001107 PyErr_Format(pysqlite_ProgrammingError,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001108 "SQLite objects created in a thread can only be used in that same thread."
1109 "The object was created in thread id %ld and this is thread id %ld",
1110 self->thread_ident, PyThread_get_thread_ident());
1111 return 0;
1112 }
1113
1114 }
Georg Brandld3eaa742009-04-05 11:07:14 +00001115#endif
Anthony Baxterc51ee692006-04-01 00:57:31 +00001116 return 1;
1117}
1118
Gerhard Häring0741a602007-01-14 01:43:50 +00001119static PyObject* pysqlite_connection_get_isolation_level(pysqlite_Connection* self, void* unused)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001120{
1121 Py_INCREF(self->isolation_level);
1122 return self->isolation_level;
1123}
1124
Gerhard Häring0741a602007-01-14 01:43:50 +00001125static PyObject* pysqlite_connection_get_total_changes(pysqlite_Connection* self, void* unused)
Anthony Baxter72289a62006-04-04 06:29:05 +00001126{
Gerhard Häring0741a602007-01-14 01:43:50 +00001127 if (!pysqlite_check_connection(self)) {
Anthony Baxter72289a62006-04-04 06:29:05 +00001128 return NULL;
1129 } else {
1130 return Py_BuildValue("i", sqlite3_total_changes(self->db));
1131 }
1132}
1133
Gerhard Häring0741a602007-01-14 01:43:50 +00001134static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001135{
Anthony Baxterc51ee692006-04-01 00:57:31 +00001136 PyObject* res;
1137 PyObject* begin_statement;
Georg Brandla24869a2008-07-16 22:33:18 +00001138 char* begin_statement_str;
Anthony Baxterc51ee692006-04-01 00:57:31 +00001139
1140 Py_XDECREF(self->isolation_level);
1141
Neal Norwitz5b030652006-04-16 03:28:17 +00001142 if (self->begin_statement) {
1143 PyMem_Free(self->begin_statement);
1144 self->begin_statement = NULL;
1145 }
1146
Anthony Baxterc51ee692006-04-01 00:57:31 +00001147 if (isolation_level == Py_None) {
1148 Py_INCREF(Py_None);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001149 self->isolation_level = Py_None;
1150
Gerhard Häring0741a602007-01-14 01:43:50 +00001151 res = pysqlite_connection_commit(self, NULL);
Anthony Baxter72289a62006-04-04 06:29:05 +00001152 if (!res) {
1153 return -1;
1154 }
Anthony Baxterc51ee692006-04-01 00:57:31 +00001155 Py_DECREF(res);
1156
1157 self->inTransaction = 0;
1158 } else {
1159 Py_INCREF(isolation_level);
1160 self->isolation_level = isolation_level;
1161
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001162 begin_statement = PyString_FromString("BEGIN ");
Anthony Baxterc51ee692006-04-01 00:57:31 +00001163 if (!begin_statement) {
1164 return -1;
1165 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001166 PyString_Concat(&begin_statement, isolation_level);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001167 if (!begin_statement) {
1168 return -1;
1169 }
1170
Georg Brandla24869a2008-07-16 22:33:18 +00001171 begin_statement_str = PyString_AsString(begin_statement);
1172 if (!begin_statement_str) {
1173 Py_DECREF(begin_statement);
1174 return -1;
1175 }
1176 self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001177 if (!self->begin_statement) {
Georg Brandla24869a2008-07-16 22:33:18 +00001178 Py_DECREF(begin_statement);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001179 return -1;
1180 }
1181
Georg Brandla24869a2008-07-16 22:33:18 +00001182 strcpy(self->begin_statement, begin_statement_str);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001183 Py_DECREF(begin_statement);
1184 }
1185
1186 return 0;
1187}
1188
Gerhard Häring0741a602007-01-14 01:43:50 +00001189PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001190{
1191 PyObject* sql;
Gerhard Häring0741a602007-01-14 01:43:50 +00001192 pysqlite_Statement* statement;
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001193 PyObject* weakref;
Anthony Baxterc51ee692006-04-01 00:57:31 +00001194 int rc;
1195
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001196 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
1197 return NULL;
1198 }
1199
Larry Hastings101b0542015-05-08 09:56:29 -07001200 if (!_PyArg_NoKeywords(MODULE_NAME ".Connection()", kwargs))
1201 return NULL;
1202
Anthony Baxterc51ee692006-04-01 00:57:31 +00001203 if (!PyArg_ParseTuple(args, "O", &sql)) {
1204 return NULL;
1205 }
1206
Gerhard Häring0741a602007-01-14 01:43:50 +00001207 _pysqlite_drop_unused_statement_references(self);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001208
Gerhard Häring0741a602007-01-14 01:43:50 +00001209 statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001210 if (!statement) {
1211 return NULL;
1212 }
1213
Victor Stinner6e055d72010-03-13 03:27:07 +00001214 statement->db = NULL;
1215 statement->st = NULL;
1216 statement->sql = NULL;
1217 statement->in_use = 0;
1218 statement->in_weakreflist = NULL;
1219
Gerhard Häring0741a602007-01-14 01:43:50 +00001220 rc = pysqlite_statement_create(statement, self, sql);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001221
1222 if (rc != SQLITE_OK) {
1223 if (rc == PYSQLITE_TOO_MUCH_SQL) {
Gerhard Häring0741a602007-01-14 01:43:50 +00001224 PyErr_SetString(pysqlite_Warning, "You can only execute one statement at a time.");
Anthony Baxterc51ee692006-04-01 00:57:31 +00001225 } else if (rc == PYSQLITE_SQL_WRONG_TYPE) {
Serhiy Storchaka0aa65622014-09-11 13:27:19 +03001226 if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_TypeError))
1227 PyErr_SetString(pysqlite_Warning, "SQL is of wrong type. Must be string or unicode.");
Anthony Baxterc51ee692006-04-01 00:57:31 +00001228 } else {
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001229 (void)pysqlite_statement_reset(statement);
1230 _pysqlite_seterror(self->db, NULL);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001231 }
1232
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001233 Py_CLEAR(statement);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001234 } else {
1235 weakref = PyWeakref_NewRef((PyObject*)statement, NULL);
1236 if (!weakref) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001237 Py_CLEAR(statement);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001238 goto error;
1239 }
1240
1241 if (PyList_Append(self->statements, weakref) != 0) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001242 Py_CLEAR(weakref);
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001243 goto error;
1244 }
1245
1246 Py_DECREF(weakref);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001247 }
1248
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001249error:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001250 return (PyObject*)statement;
1251}
1252
Larry Hastings101b0542015-05-08 09:56:29 -07001253PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001254{
1255 PyObject* cursor = 0;
1256 PyObject* result = 0;
1257 PyObject* method = 0;
1258
1259 cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
1260 if (!cursor) {
1261 goto error;
1262 }
1263
1264 method = PyObject_GetAttrString(cursor, "execute");
1265 if (!method) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001266 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001267 goto error;
1268 }
1269
1270 result = PyObject_CallObject(method, args);
1271 if (!result) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001272 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001273 }
1274
1275error:
1276 Py_XDECREF(result);
1277 Py_XDECREF(method);
1278
1279 return cursor;
1280}
1281
Larry Hastings101b0542015-05-08 09:56:29 -07001282PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001283{
1284 PyObject* cursor = 0;
1285 PyObject* result = 0;
1286 PyObject* method = 0;
1287
1288 cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
1289 if (!cursor) {
1290 goto error;
1291 }
1292
1293 method = PyObject_GetAttrString(cursor, "executemany");
1294 if (!method) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001295 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001296 goto error;
1297 }
1298
1299 result = PyObject_CallObject(method, args);
1300 if (!result) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001301 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001302 }
1303
1304error:
1305 Py_XDECREF(result);
1306 Py_XDECREF(method);
1307
1308 return cursor;
1309}
1310
Larry Hastings101b0542015-05-08 09:56:29 -07001311PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* args)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001312{
1313 PyObject* cursor = 0;
1314 PyObject* result = 0;
1315 PyObject* method = 0;
1316
1317 cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
1318 if (!cursor) {
1319 goto error;
1320 }
1321
1322 method = PyObject_GetAttrString(cursor, "executescript");
1323 if (!method) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001324 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001325 goto error;
1326 }
1327
1328 result = PyObject_CallObject(method, args);
1329 if (!result) {
Alexandre Vassalottibd704762008-07-13 21:47:59 +00001330 Py_CLEAR(cursor);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001331 }
1332
1333error:
1334 Py_XDECREF(result);
1335 Py_XDECREF(method);
1336
1337 return cursor;
1338}
1339
Anthony Baxter72289a62006-04-04 06:29:05 +00001340/* ------------------------- COLLATION CODE ------------------------ */
1341
1342static int
Gerhard Häring0741a602007-01-14 01:43:50 +00001343pysqlite_collation_callback(
Anthony Baxter72289a62006-04-04 06:29:05 +00001344 void* context,
1345 int text1_length, const void* text1_data,
1346 int text2_length, const void* text2_data)
1347{
1348 PyObject* callback = (PyObject*)context;
1349 PyObject* string1 = 0;
1350 PyObject* string2 = 0;
Georg Brandld3eaa742009-04-05 11:07:14 +00001351#ifdef WITH_THREAD
Anthony Baxter72289a62006-04-04 06:29:05 +00001352 PyGILState_STATE gilstate;
Georg Brandld3eaa742009-04-05 11:07:14 +00001353#endif
Anthony Baxter72289a62006-04-04 06:29:05 +00001354 PyObject* retval = NULL;
Serhiy Storchaka35c52b62013-02-07 16:59:34 +02001355 long longval;
Anthony Baxter72289a62006-04-04 06:29:05 +00001356 int result = 0;
Georg Brandld3eaa742009-04-05 11:07:14 +00001357#ifdef WITH_THREAD
Anthony Baxter72289a62006-04-04 06:29:05 +00001358 gilstate = PyGILState_Ensure();
Georg Brandld3eaa742009-04-05 11:07:14 +00001359#endif
Anthony Baxter72289a62006-04-04 06:29:05 +00001360
1361 if (PyErr_Occurred()) {
1362 goto finally;
1363 }
1364
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001365 string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length);
1366 string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length);
Anthony Baxter72289a62006-04-04 06:29:05 +00001367
1368 if (!string1 || !string2) {
1369 goto finally; /* failed to allocate strings */
1370 }
1371
1372 retval = PyObject_CallFunctionObjArgs(callback, string1, string2, NULL);
1373
1374 if (!retval) {
1375 /* execution failed */
1376 goto finally;
1377 }
1378
Serhiy Storchaka35c52b62013-02-07 16:59:34 +02001379 longval = PyLong_AsLongAndOverflow(retval, &result);
1380 if (longval == -1 && PyErr_Occurred()) {
1381 PyErr_Clear();
Anthony Baxter72289a62006-04-04 06:29:05 +00001382 result = 0;
1383 }
Serhiy Storchaka35c52b62013-02-07 16:59:34 +02001384 else if (!result) {
1385 if (longval > 0)
1386 result = 1;
1387 else if (longval < 0)
1388 result = -1;
1389 }
Anthony Baxter72289a62006-04-04 06:29:05 +00001390
1391finally:
1392 Py_XDECREF(string1);
1393 Py_XDECREF(string2);
1394 Py_XDECREF(retval);
Georg Brandld3eaa742009-04-05 11:07:14 +00001395#ifdef WITH_THREAD
Anthony Baxter72289a62006-04-04 06:29:05 +00001396 PyGILState_Release(gilstate);
Georg Brandld3eaa742009-04-05 11:07:14 +00001397#endif
Anthony Baxter72289a62006-04-04 06:29:05 +00001398 return result;
1399}
1400
1401static PyObject *
Gerhard Häring0741a602007-01-14 01:43:50 +00001402pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args)
Gerhard Häring1541ef02006-06-13 22:24:47 +00001403{
1404 PyObject* retval = NULL;
1405
Gerhard Häring0741a602007-01-14 01:43:50 +00001406 if (!pysqlite_check_connection(self)) {
Gerhard Häring1541ef02006-06-13 22:24:47 +00001407 goto finally;
1408 }
1409
1410 sqlite3_interrupt(self->db);
1411
1412 Py_INCREF(Py_None);
1413 retval = Py_None;
1414
1415finally:
1416 return retval;
1417}
1418
Gregory P. Smithb9803422008-03-28 08:32:09 +00001419/* Function author: Paul Kippes <kippesp@gmail.com>
1420 * Class method of Connection to call the Python function _iterdump
1421 * of the sqlite3 module.
1422 */
1423static PyObject *
1424pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args)
1425{
1426 PyObject* retval = NULL;
1427 PyObject* module = NULL;
1428 PyObject* module_dict;
1429 PyObject* pyfn_iterdump;
1430
1431 if (!pysqlite_check_connection(self)) {
1432 goto finally;
1433 }
1434
1435 module = PyImport_ImportModule(MODULE_NAME ".dump");
1436 if (!module) {
1437 goto finally;
1438 }
1439
1440 module_dict = PyModule_GetDict(module);
1441 if (!module_dict) {
1442 goto finally;
1443 }
1444
1445 pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump");
1446 if (!pyfn_iterdump) {
1447 PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference");
1448 goto finally;
1449 }
1450
1451 args = PyTuple_New(1);
1452 if (!args) {
1453 goto finally;
1454 }
1455 Py_INCREF(self);
1456 PyTuple_SetItem(args, 0, (PyObject*)self);
1457 retval = PyObject_CallObject(pyfn_iterdump, args);
1458
1459finally:
1460 Py_XDECREF(args);
1461 Py_XDECREF(module);
1462 return retval;
1463}
1464
Gerhard Häring1541ef02006-06-13 22:24:47 +00001465static PyObject *
Gerhard Häring0741a602007-01-14 01:43:50 +00001466pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
Anthony Baxter72289a62006-04-04 06:29:05 +00001467{
1468 PyObject* callable;
1469 PyObject* uppercase_name = 0;
1470 PyObject* name;
1471 PyObject* retval;
1472 char* chk;
1473 int rc;
1474
Gerhard Häring0741a602007-01-14 01:43:50 +00001475 if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
Anthony Baxter72289a62006-04-04 06:29:05 +00001476 goto finally;
1477 }
1478
Serhiy Storchaka5170c162016-10-01 08:24:55 +03001479 if (!PyArg_ParseTuple(args, "SO:create_collation(name, callback)",
1480 &name, &callable)) {
Anthony Baxter72289a62006-04-04 06:29:05 +00001481 goto finally;
1482 }
1483
Serhiy Storchaka5170c162016-10-01 08:24:55 +03001484 uppercase_name = PyObject_CallMethod((PyObject *)&PyString_Type,
1485 "upper", "O", name);
Anthony Baxter72289a62006-04-04 06:29:05 +00001486 if (!uppercase_name) {
1487 goto finally;
1488 }
1489
Serhiy Storchaka5170c162016-10-01 08:24:55 +03001490 chk = PyString_AS_STRING(uppercase_name);
Anthony Baxter72289a62006-04-04 06:29:05 +00001491 while (*chk) {
1492 if ((*chk >= '0' && *chk <= '9')
1493 || (*chk >= 'A' && *chk <= 'Z')
1494 || (*chk == '_'))
1495 {
1496 chk++;
1497 } else {
Gerhard Häring0741a602007-01-14 01:43:50 +00001498 PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name");
Anthony Baxter72289a62006-04-04 06:29:05 +00001499 goto finally;
1500 }
1501 }
1502
1503 if (callable != Py_None && !PyCallable_Check(callable)) {
1504 PyErr_SetString(PyExc_TypeError, "parameter must be callable");
1505 goto finally;
1506 }
1507
1508 if (callable != Py_None) {
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001509 if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1)
1510 goto finally;
Anthony Baxter72289a62006-04-04 06:29:05 +00001511 } else {
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001512 if (PyDict_DelItem(self->collations, uppercase_name) == -1)
1513 goto finally;
Anthony Baxter72289a62006-04-04 06:29:05 +00001514 }
1515
1516 rc = sqlite3_create_collation(self->db,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001517 PyString_AsString(uppercase_name),
Anthony Baxter72289a62006-04-04 06:29:05 +00001518 SQLITE_UTF8,
1519 (callable != Py_None) ? callable : NULL,
Gerhard Häring0741a602007-01-14 01:43:50 +00001520 (callable != Py_None) ? pysqlite_collation_callback : NULL);
Anthony Baxter72289a62006-04-04 06:29:05 +00001521 if (rc != SQLITE_OK) {
1522 PyDict_DelItem(self->collations, uppercase_name);
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001523 _pysqlite_seterror(self->db, NULL);
Anthony Baxter72289a62006-04-04 06:29:05 +00001524 goto finally;
1525 }
1526
1527finally:
1528 Py_XDECREF(uppercase_name);
1529
1530 if (PyErr_Occurred()) {
1531 retval = NULL;
1532 } else {
1533 Py_INCREF(Py_None);
1534 retval = Py_None;
1535 }
1536
1537 return retval;
1538}
1539
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001540/* Called when the connection is used as a context manager. Returns itself as a
1541 * convenience to the caller. */
1542static PyObject *
1543pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args)
1544{
1545 Py_INCREF(self);
1546 return (PyObject*)self;
1547}
1548
1549/** Called when the connection is used as a context manager. If there was any
1550 * exception, a rollback takes place; otherwise we commit. */
1551static PyObject *
1552pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args)
1553{
1554 PyObject* exc_type, *exc_value, *exc_tb;
1555 char* method_name;
1556 PyObject* result;
1557
1558 if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) {
1559 return NULL;
1560 }
1561
1562 if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) {
1563 method_name = "commit";
1564 } else {
1565 method_name = "rollback";
1566 }
1567
1568 result = PyObject_CallMethod((PyObject*)self, method_name, "");
1569 if (!result) {
1570 return NULL;
1571 }
1572 Py_DECREF(result);
1573
1574 Py_INCREF(Py_False);
1575 return Py_False;
1576}
1577
Anthony Baxterc51ee692006-04-01 00:57:31 +00001578static char connection_doc[] =
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001579PyDoc_STR("SQLite database connection object.");
Anthony Baxterc51ee692006-04-01 00:57:31 +00001580
1581static PyGetSetDef connection_getset[] = {
Gerhard Häring0741a602007-01-14 01:43:50 +00001582 {"isolation_level", (getter)pysqlite_connection_get_isolation_level, (setter)pysqlite_connection_set_isolation_level},
1583 {"total_changes", (getter)pysqlite_connection_get_total_changes, (setter)0},
Anthony Baxterc51ee692006-04-01 00:57:31 +00001584 {NULL}
1585};
1586
1587static PyMethodDef connection_methods[] = {
Gerhard Häring0741a602007-01-14 01:43:50 +00001588 {"cursor", (PyCFunction)pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001589 PyDoc_STR("Return a cursor for the connection.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001590 {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001591 PyDoc_STR("Closes the connection.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001592 {"commit", (PyCFunction)pysqlite_connection_commit, METH_NOARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001593 PyDoc_STR("Commit the current transaction.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001594 {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001595 PyDoc_STR("Roll back the current transaction.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001596 {"create_function", (PyCFunction)pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001597 PyDoc_STR("Creates a new function. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001598 {"create_aggregate", (PyCFunction)pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001599 PyDoc_STR("Creates a new aggregate. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001600 {"set_authorizer", (PyCFunction)pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS,
Gerhard Häring1541ef02006-06-13 22:24:47 +00001601 PyDoc_STR("Sets authorizer callback. Non-standard.")},
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001602 #ifdef HAVE_LOAD_EXTENSION
1603 {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS,
1604 PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")},
1605 {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS,
1606 PyDoc_STR("Load SQLite extension module. Non-standard.")},
1607 #endif
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001608 {"set_progress_handler", (PyCFunction)pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS,
1609 PyDoc_STR("Sets progress handler callback. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001610 {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001611 PyDoc_STR("Executes a SQL statement. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001612 {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001613 PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001614 {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001615 PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001616 {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS,
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001617 PyDoc_STR("Creates a collation function. Non-standard.")},
Gerhard Häring0741a602007-01-14 01:43:50 +00001618 {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
Gerhard Häring1541ef02006-06-13 22:24:47 +00001619 PyDoc_STR("Abort any pending database operation. Non-standard.")},
Gregory P. Smithb9803422008-03-28 08:32:09 +00001620 {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
Gerhard Häringef2276b2008-09-12 13:54:06 +00001621 PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")},
Gerhard Häring1cc60ed2008-02-29 22:08:41 +00001622 {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
1623 PyDoc_STR("For context manager. Non-standard.")},
1624 {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,
1625 PyDoc_STR("For context manager. Non-standard.")},
Anthony Baxterc51ee692006-04-01 00:57:31 +00001626 {NULL, NULL}
1627};
1628
1629static struct PyMemberDef connection_members[] =
1630{
Gerhard Häring0741a602007-01-14 01:43:50 +00001631 {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), RO},
1632 {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), RO},
1633 {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), RO},
1634 {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), RO},
1635 {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), RO},
1636 {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), RO},
1637 {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), RO},
1638 {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), RO},
1639 {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), RO},
1640 {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), RO},
1641 {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)},
1642 {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)},
Anthony Baxterc51ee692006-04-01 00:57:31 +00001643 {NULL}
1644};
1645
Gerhard Häring0741a602007-01-14 01:43:50 +00001646PyTypeObject pysqlite_ConnectionType = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001647 PyVarObject_HEAD_INIT(NULL, 0)
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001648 MODULE_NAME ".Connection", /* tp_name */
Gerhard Häring0741a602007-01-14 01:43:50 +00001649 sizeof(pysqlite_Connection), /* tp_basicsize */
Anthony Baxterc51ee692006-04-01 00:57:31 +00001650 0, /* tp_itemsize */
Gerhard Häring0741a602007-01-14 01:43:50 +00001651 (destructor)pysqlite_connection_dealloc, /* tp_dealloc */
Anthony Baxterc51ee692006-04-01 00:57:31 +00001652 0, /* tp_print */
1653 0, /* tp_getattr */
1654 0, /* tp_setattr */
1655 0, /* tp_compare */
1656 0, /* tp_repr */
1657 0, /* tp_as_number */
1658 0, /* tp_as_sequence */
1659 0, /* tp_as_mapping */
1660 0, /* tp_hash */
Gerhard Häring0741a602007-01-14 01:43:50 +00001661 (ternaryfunc)pysqlite_connection_call, /* tp_call */
Anthony Baxterc51ee692006-04-01 00:57:31 +00001662 0, /* tp_str */
1663 0, /* tp_getattro */
1664 0, /* tp_setattro */
1665 0, /* tp_as_buffer */
1666 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
1667 connection_doc, /* tp_doc */
1668 0, /* tp_traverse */
1669 0, /* tp_clear */
1670 0, /* tp_richcompare */
1671 0, /* tp_weaklistoffset */
1672 0, /* tp_iter */
1673 0, /* tp_iternext */
1674 connection_methods, /* tp_methods */
1675 connection_members, /* tp_members */
1676 connection_getset, /* tp_getset */
1677 0, /* tp_base */
1678 0, /* tp_dict */
1679 0, /* tp_descr_get */
1680 0, /* tp_descr_set */
1681 0, /* tp_dictoffset */
Gerhard Häring0741a602007-01-14 01:43:50 +00001682 (initproc)pysqlite_connection_init, /* tp_init */
Anthony Baxterc51ee692006-04-01 00:57:31 +00001683 0, /* tp_alloc */
1684 0, /* tp_new */
1685 0 /* tp_free */
1686};
1687
Gerhard Häring0741a602007-01-14 01:43:50 +00001688extern int pysqlite_connection_setup_types(void)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001689{
Gerhard Häring0741a602007-01-14 01:43:50 +00001690 pysqlite_ConnectionType.tp_new = PyType_GenericNew;
1691 return PyType_Ready(&pysqlite_ConnectionType);
Anthony Baxterc51ee692006-04-01 00:57:31 +00001692}