1 | /* connection.c - the connection type
|
---|
2 | *
|
---|
3 | * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de>
|
---|
4 | *
|
---|
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 "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"
|
---|
31 | #include "sqlitecompat.h"
|
---|
32 |
|
---|
33 | #include "pythread.h"
|
---|
34 |
|
---|
35 | #define ACTION_FINALIZE 1
|
---|
36 | #define ACTION_RESET 2
|
---|
37 |
|
---|
38 | #if SQLITE_VERSION_NUMBER >= 3003008
|
---|
39 | #ifndef SQLITE_OMIT_LOAD_EXTENSION
|
---|
40 | #define HAVE_LOAD_EXTENSION
|
---|
41 | #endif
|
---|
42 | #endif
|
---|
43 |
|
---|
44 | static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level);
|
---|
45 | static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self);
|
---|
46 |
|
---|
47 |
|
---|
48 | static void _sqlite3_result_error(sqlite3_context* ctx, const char* errmsg, int len)
|
---|
49 | {
|
---|
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);
|
---|
55 | #else
|
---|
56 | PyErr_SetString(pysqlite_OperationalError, errmsg);
|
---|
57 | #endif
|
---|
58 | }
|
---|
59 |
|
---|
60 | int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
61 | {
|
---|
62 | static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
|
---|
63 |
|
---|
64 | PyObject* database;
|
---|
65 | 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;
|
---|
72 | PyObject* class_attr = NULL;
|
---|
73 | PyObject* class_attr_str = NULL;
|
---|
74 | int is_apsw_connection = 0;
|
---|
75 | PyObject* database_utf8;
|
---|
76 |
|
---|
77 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist,
|
---|
78 | &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
|
---|
79 | {
|
---|
80 | return -1;
|
---|
81 | }
|
---|
82 |
|
---|
83 | self->initialized = 1;
|
---|
84 |
|
---|
85 | self->begin_statement = NULL;
|
---|
86 |
|
---|
87 | self->statement_cache = NULL;
|
---|
88 | self->statements = NULL;
|
---|
89 | self->cursors = NULL;
|
---|
90 |
|
---|
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 |
|
---|
97 | if (PyString_Check(database) || PyUnicode_Check(database)) {
|
---|
98 | if (PyString_Check(database)) {
|
---|
99 | 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 | }
|
---|
107 |
|
---|
108 | Py_BEGIN_ALLOW_THREADS
|
---|
109 | rc = sqlite3_open(PyString_AsString(database_utf8), &self->db);
|
---|
110 | 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 {
|
---|
119 | /* Create a pysqlite connection from a APSW connection */
|
---|
120 | class_attr = PyObject_GetAttrString(database, "__class__");
|
---|
121 | if (class_attr) {
|
---|
122 | class_attr_str = PyObject_Str(class_attr);
|
---|
123 | if (class_attr_str) {
|
---|
124 | if (strcmp(PyString_AsString(class_attr_str), "<type 'apsw.Connection'>") == 0) {
|
---|
125 | /* 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 | }
|
---|
144 | }
|
---|
145 |
|
---|
146 | if (!isolation_level) {
|
---|
147 | isolation_level = PyString_FromString("");
|
---|
148 | if (!isolation_level) {
|
---|
149 | return -1;
|
---|
150 | }
|
---|
151 | } else {
|
---|
152 | Py_INCREF(isolation_level);
|
---|
153 | }
|
---|
154 | self->isolation_level = NULL;
|
---|
155 | pysqlite_connection_set_isolation_level(self, isolation_level);
|
---|
156 | Py_DECREF(isolation_level);
|
---|
157 |
|
---|
158 | self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements);
|
---|
159 | if (PyErr_Occurred()) {
|
---|
160 | return -1;
|
---|
161 | }
|
---|
162 |
|
---|
163 | self->created_statements = 0;
|
---|
164 | self->created_cursors = 0;
|
---|
165 |
|
---|
166 | /* Create lists of weak references to statements/cursors */
|
---|
167 | self->statements = PyList_New(0);
|
---|
168 | self->cursors = PyList_New(0);
|
---|
169 | if (!self->statements || !self->cursors) {
|
---|
170 | return -1;
|
---|
171 | }
|
---|
172 |
|
---|
173 | /* By default, the Cache class INCREFs the factory in its initializer, and
|
---|
174 | * decrefs it in its deallocator method. Since this would create a circular
|
---|
175 | * reference here, we're breaking it by decrementing self, and telling the
|
---|
176 | * cache class to not decref the factory (self) in its deallocator.
|
---|
177 | */
|
---|
178 | self->statement_cache->decref_factory = 0;
|
---|
179 | Py_DECREF(self);
|
---|
180 |
|
---|
181 | self->inTransaction = 0;
|
---|
182 | self->detect_types = detect_types;
|
---|
183 | self->timeout = timeout;
|
---|
184 | (void)sqlite3_busy_timeout(self->db, (int)(timeout*1000));
|
---|
185 | #ifdef WITH_THREAD
|
---|
186 | self->thread_ident = PyThread_get_thread_ident();
|
---|
187 | #endif
|
---|
188 | self->check_same_thread = check_same_thread;
|
---|
189 |
|
---|
190 | self->function_pinboard = PyDict_New();
|
---|
191 | if (!self->function_pinboard) {
|
---|
192 | return -1;
|
---|
193 | }
|
---|
194 |
|
---|
195 | self->collations = PyDict_New();
|
---|
196 | if (!self->collations) {
|
---|
197 | return -1;
|
---|
198 | }
|
---|
199 |
|
---|
200 | self->Warning = pysqlite_Warning;
|
---|
201 | self->Error = pysqlite_Error;
|
---|
202 | self->InterfaceError = pysqlite_InterfaceError;
|
---|
203 | self->DatabaseError = pysqlite_DatabaseError;
|
---|
204 | self->DataError = pysqlite_DataError;
|
---|
205 | self->OperationalError = pysqlite_OperationalError;
|
---|
206 | self->IntegrityError = pysqlite_IntegrityError;
|
---|
207 | self->InternalError = pysqlite_InternalError;
|
---|
208 | self->ProgrammingError = pysqlite_ProgrammingError;
|
---|
209 | self->NotSupportedError = pysqlite_NotSupportedError;
|
---|
210 |
|
---|
211 | return 0;
|
---|
212 | }
|
---|
213 |
|
---|
214 | /* Empty the entire statement cache of this connection */
|
---|
215 | void pysqlite_flush_statement_cache(pysqlite_Connection* self)
|
---|
216 | {
|
---|
217 | pysqlite_Node* node;
|
---|
218 | pysqlite_Statement* statement;
|
---|
219 |
|
---|
220 | node = self->statement_cache->first;
|
---|
221 |
|
---|
222 | while (node) {
|
---|
223 | statement = (pysqlite_Statement*)(node->data);
|
---|
224 | (void)pysqlite_statement_finalize(statement);
|
---|
225 | node = node->next;
|
---|
226 | }
|
---|
227 |
|
---|
228 | Py_DECREF(self->statement_cache);
|
---|
229 | self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "O", self);
|
---|
230 | Py_DECREF(self);
|
---|
231 | self->statement_cache->decref_factory = 0;
|
---|
232 | }
|
---|
233 |
|
---|
234 | /* action in (ACTION_RESET, ACTION_FINALIZE) */
|
---|
235 | void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset_cursors)
|
---|
236 | {
|
---|
237 | int i;
|
---|
238 | PyObject* weakref;
|
---|
239 | PyObject* statement;
|
---|
240 | pysqlite_Cursor* cursor;
|
---|
241 |
|
---|
242 | for (i = 0; i < PyList_Size(self->statements); i++) {
|
---|
243 | weakref = PyList_GetItem(self->statements, i);
|
---|
244 | statement = PyWeakref_GetObject(weakref);
|
---|
245 | if (statement != Py_None) {
|
---|
246 | if (action == ACTION_RESET) {
|
---|
247 | (void)pysqlite_statement_reset((pysqlite_Statement*)statement);
|
---|
248 | } else {
|
---|
249 | (void)pysqlite_statement_finalize((pysqlite_Statement*)statement);
|
---|
250 | }
|
---|
251 | }
|
---|
252 | }
|
---|
253 |
|
---|
254 | if (reset_cursors) {
|
---|
255 | for (i = 0; i < PyList_Size(self->cursors); i++) {
|
---|
256 | weakref = PyList_GetItem(self->cursors, i);
|
---|
257 | cursor = (pysqlite_Cursor*)PyWeakref_GetObject(weakref);
|
---|
258 | if ((PyObject*)cursor != Py_None) {
|
---|
259 | cursor->reset = 1;
|
---|
260 | }
|
---|
261 | }
|
---|
262 | }
|
---|
263 | }
|
---|
264 |
|
---|
265 | void pysqlite_connection_dealloc(pysqlite_Connection* self)
|
---|
266 | {
|
---|
267 | PyObject* ret = NULL;
|
---|
268 |
|
---|
269 | Py_XDECREF(self->statement_cache);
|
---|
270 |
|
---|
271 | /* Clean up if user has not called .close() explicitly. */
|
---|
272 | if (self->db) {
|
---|
273 | Py_BEGIN_ALLOW_THREADS
|
---|
274 | sqlite3_close(self->db);
|
---|
275 | Py_END_ALLOW_THREADS
|
---|
276 | } else if (self->apsw_connection) {
|
---|
277 | ret = PyObject_CallMethod(self->apsw_connection, "close", "");
|
---|
278 | Py_XDECREF(ret);
|
---|
279 | Py_XDECREF(self->apsw_connection);
|
---|
280 | }
|
---|
281 |
|
---|
282 | if (self->begin_statement) {
|
---|
283 | PyMem_Free(self->begin_statement);
|
---|
284 | }
|
---|
285 | Py_XDECREF(self->isolation_level);
|
---|
286 | Py_XDECREF(self->function_pinboard);
|
---|
287 | Py_XDECREF(self->row_factory);
|
---|
288 | Py_XDECREF(self->text_factory);
|
---|
289 | Py_XDECREF(self->collations);
|
---|
290 | Py_XDECREF(self->statements);
|
---|
291 | Py_XDECREF(self->cursors);
|
---|
292 |
|
---|
293 | self->ob_type->tp_free((PyObject*)self);
|
---|
294 | }
|
---|
295 |
|
---|
296 | /*
|
---|
297 | * Registers a cursor with the connection.
|
---|
298 | *
|
---|
299 | * 0 => error; 1 => ok
|
---|
300 | */
|
---|
301 | int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor)
|
---|
302 | {
|
---|
303 | PyObject* weakref;
|
---|
304 |
|
---|
305 | weakref = PyWeakref_NewRef((PyObject*)cursor, NULL);
|
---|
306 | if (!weakref) {
|
---|
307 | goto error;
|
---|
308 | }
|
---|
309 |
|
---|
310 | if (PyList_Append(connection->cursors, weakref) != 0) {
|
---|
311 | Py_CLEAR(weakref);
|
---|
312 | goto error;
|
---|
313 | }
|
---|
314 |
|
---|
315 | Py_DECREF(weakref);
|
---|
316 |
|
---|
317 | return 1;
|
---|
318 | error:
|
---|
319 | return 0;
|
---|
320 | }
|
---|
321 |
|
---|
322 | PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
323 | {
|
---|
324 | static char *kwlist[] = {"factory", NULL, NULL};
|
---|
325 | PyObject* factory = NULL;
|
---|
326 | PyObject* cursor;
|
---|
327 |
|
---|
328 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist,
|
---|
329 | &factory)) {
|
---|
330 | return NULL;
|
---|
331 | }
|
---|
332 |
|
---|
333 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
334 | return NULL;
|
---|
335 | }
|
---|
336 |
|
---|
337 | if (factory == NULL) {
|
---|
338 | factory = (PyObject*)&pysqlite_CursorType;
|
---|
339 | }
|
---|
340 |
|
---|
341 | cursor = PyObject_CallFunction(factory, "O", self);
|
---|
342 |
|
---|
343 | _pysqlite_drop_unused_cursor_references(self);
|
---|
344 |
|
---|
345 | if (cursor && self->row_factory != Py_None) {
|
---|
346 | Py_XDECREF(((pysqlite_Cursor*)cursor)->row_factory);
|
---|
347 | Py_INCREF(self->row_factory);
|
---|
348 | ((pysqlite_Cursor*)cursor)->row_factory = self->row_factory;
|
---|
349 | }
|
---|
350 |
|
---|
351 | return cursor;
|
---|
352 | }
|
---|
353 |
|
---|
354 | PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args)
|
---|
355 | {
|
---|
356 | PyObject* ret;
|
---|
357 | int rc;
|
---|
358 |
|
---|
359 | if (!pysqlite_check_thread(self)) {
|
---|
360 | return NULL;
|
---|
361 | }
|
---|
362 |
|
---|
363 | pysqlite_do_all_statements(self, ACTION_FINALIZE, 1);
|
---|
364 |
|
---|
365 | if (self->db) {
|
---|
366 | if (self->apsw_connection) {
|
---|
367 | ret = PyObject_CallMethod(self->apsw_connection, "close", "");
|
---|
368 | Py_XDECREF(ret);
|
---|
369 | Py_XDECREF(self->apsw_connection);
|
---|
370 | self->apsw_connection = NULL;
|
---|
371 | self->db = NULL;
|
---|
372 | } else {
|
---|
373 | Py_BEGIN_ALLOW_THREADS
|
---|
374 | rc = sqlite3_close(self->db);
|
---|
375 | Py_END_ALLOW_THREADS
|
---|
376 |
|
---|
377 | if (rc != SQLITE_OK) {
|
---|
378 | _pysqlite_seterror(self->db, NULL);
|
---|
379 | return NULL;
|
---|
380 | } else {
|
---|
381 | self->db = NULL;
|
---|
382 | }
|
---|
383 | }
|
---|
384 | }
|
---|
385 |
|
---|
386 | Py_INCREF(Py_None);
|
---|
387 | return Py_None;
|
---|
388 | }
|
---|
389 |
|
---|
390 | /*
|
---|
391 | * Checks if a connection object is usable (i. e. not closed).
|
---|
392 | *
|
---|
393 | * 0 => error; 1 => ok
|
---|
394 | */
|
---|
395 | int pysqlite_check_connection(pysqlite_Connection* con)
|
---|
396 | {
|
---|
397 | if (!con->initialized) {
|
---|
398 | PyErr_SetString(pysqlite_ProgrammingError, "Base Connection.__init__ not called.");
|
---|
399 | return 0;
|
---|
400 | }
|
---|
401 |
|
---|
402 | if (!con->db) {
|
---|
403 | PyErr_SetString(pysqlite_ProgrammingError, "Cannot operate on a closed database.");
|
---|
404 | return 0;
|
---|
405 | } else {
|
---|
406 | return 1;
|
---|
407 | }
|
---|
408 | }
|
---|
409 |
|
---|
410 | PyObject* _pysqlite_connection_begin(pysqlite_Connection* self)
|
---|
411 | {
|
---|
412 | int rc;
|
---|
413 | const char* tail;
|
---|
414 | sqlite3_stmt* statement;
|
---|
415 |
|
---|
416 | Py_BEGIN_ALLOW_THREADS
|
---|
417 | rc = sqlite3_prepare(self->db, self->begin_statement, -1, &statement, &tail);
|
---|
418 | Py_END_ALLOW_THREADS
|
---|
419 |
|
---|
420 | if (rc != SQLITE_OK) {
|
---|
421 | _pysqlite_seterror(self->db, statement);
|
---|
422 | goto error;
|
---|
423 | }
|
---|
424 |
|
---|
425 | rc = pysqlite_step(statement, self);
|
---|
426 | if (rc == SQLITE_DONE) {
|
---|
427 | self->inTransaction = 1;
|
---|
428 | } else {
|
---|
429 | _pysqlite_seterror(self->db, statement);
|
---|
430 | }
|
---|
431 |
|
---|
432 | Py_BEGIN_ALLOW_THREADS
|
---|
433 | rc = sqlite3_finalize(statement);
|
---|
434 | Py_END_ALLOW_THREADS
|
---|
435 |
|
---|
436 | if (rc != SQLITE_OK && !PyErr_Occurred()) {
|
---|
437 | _pysqlite_seterror(self->db, NULL);
|
---|
438 | }
|
---|
439 |
|
---|
440 | error:
|
---|
441 | if (PyErr_Occurred()) {
|
---|
442 | return NULL;
|
---|
443 | } else {
|
---|
444 | Py_INCREF(Py_None);
|
---|
445 | return Py_None;
|
---|
446 | }
|
---|
447 | }
|
---|
448 |
|
---|
449 | PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args)
|
---|
450 | {
|
---|
451 | int rc;
|
---|
452 | const char* tail;
|
---|
453 | sqlite3_stmt* statement;
|
---|
454 |
|
---|
455 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
456 | return NULL;
|
---|
457 | }
|
---|
458 |
|
---|
459 | if (self->inTransaction) {
|
---|
460 | pysqlite_do_all_statements(self, ACTION_RESET, 0);
|
---|
461 |
|
---|
462 | Py_BEGIN_ALLOW_THREADS
|
---|
463 | rc = sqlite3_prepare(self->db, "COMMIT", -1, &statement, &tail);
|
---|
464 | Py_END_ALLOW_THREADS
|
---|
465 | if (rc != SQLITE_OK) {
|
---|
466 | _pysqlite_seterror(self->db, NULL);
|
---|
467 | goto error;
|
---|
468 | }
|
---|
469 |
|
---|
470 | rc = pysqlite_step(statement, self);
|
---|
471 | if (rc == SQLITE_DONE) {
|
---|
472 | self->inTransaction = 0;
|
---|
473 | } else {
|
---|
474 | _pysqlite_seterror(self->db, statement);
|
---|
475 | }
|
---|
476 |
|
---|
477 | Py_BEGIN_ALLOW_THREADS
|
---|
478 | rc = sqlite3_finalize(statement);
|
---|
479 | Py_END_ALLOW_THREADS
|
---|
480 | if (rc != SQLITE_OK && !PyErr_Occurred()) {
|
---|
481 | _pysqlite_seterror(self->db, NULL);
|
---|
482 | }
|
---|
483 |
|
---|
484 | }
|
---|
485 |
|
---|
486 | error:
|
---|
487 | if (PyErr_Occurred()) {
|
---|
488 | return NULL;
|
---|
489 | } else {
|
---|
490 | Py_INCREF(Py_None);
|
---|
491 | return Py_None;
|
---|
492 | }
|
---|
493 | }
|
---|
494 |
|
---|
495 | PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args)
|
---|
496 | {
|
---|
497 | int rc;
|
---|
498 | const char* tail;
|
---|
499 | sqlite3_stmt* statement;
|
---|
500 |
|
---|
501 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
502 | return NULL;
|
---|
503 | }
|
---|
504 |
|
---|
505 | if (self->inTransaction) {
|
---|
506 | pysqlite_do_all_statements(self, ACTION_RESET, 1);
|
---|
507 |
|
---|
508 | Py_BEGIN_ALLOW_THREADS
|
---|
509 | rc = sqlite3_prepare(self->db, "ROLLBACK", -1, &statement, &tail);
|
---|
510 | Py_END_ALLOW_THREADS
|
---|
511 | if (rc != SQLITE_OK) {
|
---|
512 | _pysqlite_seterror(self->db, NULL);
|
---|
513 | goto error;
|
---|
514 | }
|
---|
515 |
|
---|
516 | rc = pysqlite_step(statement, self);
|
---|
517 | if (rc == SQLITE_DONE) {
|
---|
518 | self->inTransaction = 0;
|
---|
519 | } else {
|
---|
520 | _pysqlite_seterror(self->db, statement);
|
---|
521 | }
|
---|
522 |
|
---|
523 | Py_BEGIN_ALLOW_THREADS
|
---|
524 | rc = sqlite3_finalize(statement);
|
---|
525 | Py_END_ALLOW_THREADS
|
---|
526 | if (rc != SQLITE_OK && !PyErr_Occurred()) {
|
---|
527 | _pysqlite_seterror(self->db, NULL);
|
---|
528 | }
|
---|
529 |
|
---|
530 | }
|
---|
531 |
|
---|
532 | error:
|
---|
533 | if (PyErr_Occurred()) {
|
---|
534 | return NULL;
|
---|
535 | } else {
|
---|
536 | Py_INCREF(Py_None);
|
---|
537 | return Py_None;
|
---|
538 | }
|
---|
539 | }
|
---|
540 |
|
---|
541 | static int
|
---|
542 | _pysqlite_set_result(sqlite3_context* context, PyObject* py_val)
|
---|
543 | {
|
---|
544 | if (py_val == Py_None) {
|
---|
545 | sqlite3_result_null(context);
|
---|
546 | } else if (PyInt_Check(py_val)) {
|
---|
547 | sqlite3_result_int64(context, (sqlite_int64)PyInt_AsLong(py_val));
|
---|
548 | } else if (PyLong_Check(py_val)) {
|
---|
549 | sqlite_int64 value = _pysqlite_long_as_int64(py_val);
|
---|
550 | if (value == -1 && PyErr_Occurred())
|
---|
551 | return -1;
|
---|
552 | sqlite3_result_int64(context, value);
|
---|
553 | } else if (PyFloat_Check(py_val)) {
|
---|
554 | sqlite3_result_double(context, PyFloat_AsDouble(py_val));
|
---|
555 | } else if (PyBuffer_Check(py_val)) {
|
---|
556 | const char* buffer;
|
---|
557 | Py_ssize_t buflen;
|
---|
558 | if (PyObject_AsCharBuffer(py_val, &buffer, &buflen) != 0) {
|
---|
559 | PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer");
|
---|
560 | return -1;
|
---|
561 | }
|
---|
562 | sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT);
|
---|
563 | } else if (PyString_Check(py_val)) {
|
---|
564 | sqlite3_result_text(context, PyString_AsString(py_val), -1, SQLITE_TRANSIENT);
|
---|
565 | } else if (PyUnicode_Check(py_val)) {
|
---|
566 | PyObject * stringval = PyUnicode_AsUTF8String(py_val);
|
---|
567 | if (!stringval)
|
---|
568 | return -1;
|
---|
569 | sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT);
|
---|
570 | Py_DECREF(stringval);
|
---|
571 | } else {
|
---|
572 | return -1;
|
---|
573 | }
|
---|
574 | return 0;
|
---|
575 | }
|
---|
576 |
|
---|
577 | PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv)
|
---|
578 | {
|
---|
579 | PyObject* args;
|
---|
580 | int i;
|
---|
581 | sqlite3_value* cur_value;
|
---|
582 | PyObject* cur_py_value;
|
---|
583 | const char* val_str;
|
---|
584 | Py_ssize_t buflen;
|
---|
585 | void* raw_buffer;
|
---|
586 |
|
---|
587 | args = PyTuple_New(argc);
|
---|
588 | if (!args) {
|
---|
589 | return NULL;
|
---|
590 | }
|
---|
591 |
|
---|
592 | for (i = 0; i < argc; i++) {
|
---|
593 | cur_value = argv[i];
|
---|
594 | switch (sqlite3_value_type(argv[i])) {
|
---|
595 | case SQLITE_INTEGER:
|
---|
596 | cur_py_value = _pysqlite_long_from_int64(sqlite3_value_int64(cur_value));
|
---|
597 | break;
|
---|
598 | case SQLITE_FLOAT:
|
---|
599 | cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));
|
---|
600 | break;
|
---|
601 | case SQLITE_TEXT:
|
---|
602 | val_str = (const char*)sqlite3_value_text(cur_value);
|
---|
603 | cur_py_value = PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL);
|
---|
604 | /* TODO: have a way to show errors here */
|
---|
605 | if (!cur_py_value) {
|
---|
606 | PyErr_Clear();
|
---|
607 | Py_INCREF(Py_None);
|
---|
608 | cur_py_value = Py_None;
|
---|
609 | }
|
---|
610 | break;
|
---|
611 | case SQLITE_BLOB:
|
---|
612 | buflen = sqlite3_value_bytes(cur_value);
|
---|
613 | cur_py_value = PyBuffer_New(buflen);
|
---|
614 | if (!cur_py_value) {
|
---|
615 | break;
|
---|
616 | }
|
---|
617 | if (PyObject_AsWriteBuffer(cur_py_value, &raw_buffer, &buflen)) {
|
---|
618 | Py_DECREF(cur_py_value);
|
---|
619 | cur_py_value = NULL;
|
---|
620 | break;
|
---|
621 | }
|
---|
622 | memcpy(raw_buffer, sqlite3_value_blob(cur_value), buflen);
|
---|
623 | break;
|
---|
624 | case SQLITE_NULL:
|
---|
625 | default:
|
---|
626 | Py_INCREF(Py_None);
|
---|
627 | cur_py_value = Py_None;
|
---|
628 | }
|
---|
629 |
|
---|
630 | if (!cur_py_value) {
|
---|
631 | Py_DECREF(args);
|
---|
632 | return NULL;
|
---|
633 | }
|
---|
634 |
|
---|
635 | PyTuple_SetItem(args, i, cur_py_value);
|
---|
636 |
|
---|
637 | }
|
---|
638 |
|
---|
639 | return args;
|
---|
640 | }
|
---|
641 |
|
---|
642 | void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv)
|
---|
643 | {
|
---|
644 | PyObject* args;
|
---|
645 | PyObject* py_func;
|
---|
646 | PyObject* py_retval = NULL;
|
---|
647 | int ok;
|
---|
648 |
|
---|
649 | #ifdef WITH_THREAD
|
---|
650 | PyGILState_STATE threadstate;
|
---|
651 |
|
---|
652 | threadstate = PyGILState_Ensure();
|
---|
653 | #endif
|
---|
654 |
|
---|
655 | py_func = (PyObject*)sqlite3_user_data(context);
|
---|
656 |
|
---|
657 | args = _pysqlite_build_py_params(context, argc, argv);
|
---|
658 | if (args) {
|
---|
659 | py_retval = PyObject_CallObject(py_func, args);
|
---|
660 | Py_DECREF(args);
|
---|
661 | }
|
---|
662 |
|
---|
663 | ok = 0;
|
---|
664 | if (py_retval) {
|
---|
665 | ok = _pysqlite_set_result(context, py_retval) == 0;
|
---|
666 | Py_DECREF(py_retval);
|
---|
667 | }
|
---|
668 | if (!ok) {
|
---|
669 | if (_enable_callback_tracebacks) {
|
---|
670 | PyErr_Print();
|
---|
671 | } else {
|
---|
672 | PyErr_Clear();
|
---|
673 | }
|
---|
674 | _sqlite3_result_error(context, "user-defined function raised exception", -1);
|
---|
675 | }
|
---|
676 |
|
---|
677 | #ifdef WITH_THREAD
|
---|
678 | PyGILState_Release(threadstate);
|
---|
679 | #endif
|
---|
680 | }
|
---|
681 |
|
---|
682 | static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_value** params)
|
---|
683 | {
|
---|
684 | PyObject* args;
|
---|
685 | PyObject* function_result = NULL;
|
---|
686 | PyObject* aggregate_class;
|
---|
687 | PyObject** aggregate_instance;
|
---|
688 | PyObject* stepmethod = NULL;
|
---|
689 |
|
---|
690 | #ifdef WITH_THREAD
|
---|
691 | PyGILState_STATE threadstate;
|
---|
692 |
|
---|
693 | threadstate = PyGILState_Ensure();
|
---|
694 | #endif
|
---|
695 |
|
---|
696 | aggregate_class = (PyObject*)sqlite3_user_data(context);
|
---|
697 |
|
---|
698 | aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
|
---|
699 |
|
---|
700 | if (*aggregate_instance == 0) {
|
---|
701 | *aggregate_instance = PyObject_CallFunction(aggregate_class, "");
|
---|
702 |
|
---|
703 | if (PyErr_Occurred()) {
|
---|
704 | *aggregate_instance = 0;
|
---|
705 | if (_enable_callback_tracebacks) {
|
---|
706 | PyErr_Print();
|
---|
707 | } else {
|
---|
708 | PyErr_Clear();
|
---|
709 | }
|
---|
710 | _sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1);
|
---|
711 | goto error;
|
---|
712 | }
|
---|
713 | }
|
---|
714 |
|
---|
715 | stepmethod = PyObject_GetAttrString(*aggregate_instance, "step");
|
---|
716 | if (!stepmethod) {
|
---|
717 | goto error;
|
---|
718 | }
|
---|
719 |
|
---|
720 | args = _pysqlite_build_py_params(context, argc, params);
|
---|
721 | if (!args) {
|
---|
722 | goto error;
|
---|
723 | }
|
---|
724 |
|
---|
725 | function_result = PyObject_CallObject(stepmethod, args);
|
---|
726 | Py_DECREF(args);
|
---|
727 |
|
---|
728 | if (!function_result) {
|
---|
729 | if (_enable_callback_tracebacks) {
|
---|
730 | PyErr_Print();
|
---|
731 | } else {
|
---|
732 | PyErr_Clear();
|
---|
733 | }
|
---|
734 | _sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1);
|
---|
735 | }
|
---|
736 |
|
---|
737 | error:
|
---|
738 | Py_XDECREF(stepmethod);
|
---|
739 | Py_XDECREF(function_result);
|
---|
740 |
|
---|
741 | #ifdef WITH_THREAD
|
---|
742 | PyGILState_Release(threadstate);
|
---|
743 | #endif
|
---|
744 | }
|
---|
745 |
|
---|
746 | void _pysqlite_final_callback(sqlite3_context* context)
|
---|
747 | {
|
---|
748 | PyObject* function_result;
|
---|
749 | PyObject** aggregate_instance;
|
---|
750 | int ok;
|
---|
751 |
|
---|
752 | #ifdef WITH_THREAD
|
---|
753 | PyGILState_STATE threadstate;
|
---|
754 |
|
---|
755 | threadstate = PyGILState_Ensure();
|
---|
756 | #endif
|
---|
757 |
|
---|
758 | aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
|
---|
759 | if (!*aggregate_instance) {
|
---|
760 | /* this branch is executed if there was an exception in the aggregate's
|
---|
761 | * __init__ */
|
---|
762 |
|
---|
763 | goto error;
|
---|
764 | }
|
---|
765 |
|
---|
766 | function_result = PyObject_CallMethod(*aggregate_instance, "finalize", "");
|
---|
767 | Py_DECREF(*aggregate_instance);
|
---|
768 |
|
---|
769 | ok = 0;
|
---|
770 | if (function_result) {
|
---|
771 | ok = _pysqlite_set_result(context, function_result) == 0;
|
---|
772 | Py_DECREF(function_result);
|
---|
773 | }
|
---|
774 | if (!ok) {
|
---|
775 | if (_enable_callback_tracebacks) {
|
---|
776 | PyErr_Print();
|
---|
777 | } else {
|
---|
778 | PyErr_Clear();
|
---|
779 | }
|
---|
780 | _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
|
---|
781 | }
|
---|
782 |
|
---|
783 | error:
|
---|
784 | #ifdef WITH_THREAD
|
---|
785 | PyGILState_Release(threadstate);
|
---|
786 | #endif
|
---|
787 | }
|
---|
788 |
|
---|
789 | static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self)
|
---|
790 | {
|
---|
791 | PyObject* new_list;
|
---|
792 | PyObject* weakref;
|
---|
793 | int i;
|
---|
794 |
|
---|
795 | /* we only need to do this once in a while */
|
---|
796 | if (self->created_statements++ < 200) {
|
---|
797 | return;
|
---|
798 | }
|
---|
799 |
|
---|
800 | self->created_statements = 0;
|
---|
801 |
|
---|
802 | new_list = PyList_New(0);
|
---|
803 | if (!new_list) {
|
---|
804 | return;
|
---|
805 | }
|
---|
806 |
|
---|
807 | for (i = 0; i < PyList_Size(self->statements); i++) {
|
---|
808 | weakref = PyList_GetItem(self->statements, i);
|
---|
809 | if (PyWeakref_GetObject(weakref) != Py_None) {
|
---|
810 | if (PyList_Append(new_list, weakref) != 0) {
|
---|
811 | Py_DECREF(new_list);
|
---|
812 | return;
|
---|
813 | }
|
---|
814 | }
|
---|
815 | }
|
---|
816 |
|
---|
817 | Py_DECREF(self->statements);
|
---|
818 | self->statements = new_list;
|
---|
819 | }
|
---|
820 |
|
---|
821 | static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
|
---|
822 | {
|
---|
823 | PyObject* new_list;
|
---|
824 | PyObject* weakref;
|
---|
825 | int i;
|
---|
826 |
|
---|
827 | /* we only need to do this once in a while */
|
---|
828 | if (self->created_cursors++ < 200) {
|
---|
829 | return;
|
---|
830 | }
|
---|
831 |
|
---|
832 | self->created_cursors = 0;
|
---|
833 |
|
---|
834 | new_list = PyList_New(0);
|
---|
835 | if (!new_list) {
|
---|
836 | return;
|
---|
837 | }
|
---|
838 |
|
---|
839 | for (i = 0; i < PyList_Size(self->cursors); i++) {
|
---|
840 | weakref = PyList_GetItem(self->cursors, i);
|
---|
841 | if (PyWeakref_GetObject(weakref) != Py_None) {
|
---|
842 | if (PyList_Append(new_list, weakref) != 0) {
|
---|
843 | Py_DECREF(new_list);
|
---|
844 | return;
|
---|
845 | }
|
---|
846 | }
|
---|
847 | }
|
---|
848 |
|
---|
849 | Py_DECREF(self->cursors);
|
---|
850 | self->cursors = new_list;
|
---|
851 | }
|
---|
852 |
|
---|
853 | PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
854 | {
|
---|
855 | static char *kwlist[] = {"name", "narg", "func", NULL, NULL};
|
---|
856 |
|
---|
857 | PyObject* func;
|
---|
858 | char* name;
|
---|
859 | int narg;
|
---|
860 | int rc;
|
---|
861 |
|
---|
862 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
863 | return NULL;
|
---|
864 | }
|
---|
865 |
|
---|
866 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO", kwlist,
|
---|
867 | &name, &narg, &func))
|
---|
868 | {
|
---|
869 | return NULL;
|
---|
870 | }
|
---|
871 |
|
---|
872 | rc = sqlite3_create_function(self->db, name, narg, SQLITE_UTF8, (void*)func, _pysqlite_func_callback, NULL, NULL);
|
---|
873 |
|
---|
874 | if (rc != SQLITE_OK) {
|
---|
875 | /* Workaround for SQLite bug: no error code or string is available here */
|
---|
876 | PyErr_SetString(pysqlite_OperationalError, "Error creating function");
|
---|
877 | return NULL;
|
---|
878 | } else {
|
---|
879 | if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1)
|
---|
880 | return NULL;
|
---|
881 |
|
---|
882 | Py_INCREF(Py_None);
|
---|
883 | return Py_None;
|
---|
884 | }
|
---|
885 | }
|
---|
886 |
|
---|
887 | PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
888 | {
|
---|
889 | PyObject* aggregate_class;
|
---|
890 |
|
---|
891 | int n_arg;
|
---|
892 | char* name;
|
---|
893 | static char *kwlist[] = { "name", "n_arg", "aggregate_class", NULL };
|
---|
894 | int rc;
|
---|
895 |
|
---|
896 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
897 | return NULL;
|
---|
898 | }
|
---|
899 |
|
---|
900 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO:create_aggregate",
|
---|
901 | kwlist, &name, &n_arg, &aggregate_class)) {
|
---|
902 | return NULL;
|
---|
903 | }
|
---|
904 |
|
---|
905 | rc = sqlite3_create_function(self->db, name, n_arg, SQLITE_UTF8, (void*)aggregate_class, 0, &_pysqlite_step_callback, &_pysqlite_final_callback);
|
---|
906 | if (rc != SQLITE_OK) {
|
---|
907 | /* Workaround for SQLite bug: no error code or string is available here */
|
---|
908 | PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate");
|
---|
909 | return NULL;
|
---|
910 | } else {
|
---|
911 | if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1)
|
---|
912 | return NULL;
|
---|
913 |
|
---|
914 | Py_INCREF(Py_None);
|
---|
915 | return Py_None;
|
---|
916 | }
|
---|
917 | }
|
---|
918 |
|
---|
919 | static int _authorizer_callback(void* user_arg, int action, const char* arg1, const char* arg2 , const char* dbname, const char* access_attempt_source)
|
---|
920 | {
|
---|
921 | PyObject *ret;
|
---|
922 | int rc;
|
---|
923 | #ifdef WITH_THREAD
|
---|
924 | PyGILState_STATE gilstate;
|
---|
925 |
|
---|
926 | gilstate = PyGILState_Ensure();
|
---|
927 | #endif
|
---|
928 | ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
|
---|
929 |
|
---|
930 | if (!ret) {
|
---|
931 | if (_enable_callback_tracebacks) {
|
---|
932 | PyErr_Print();
|
---|
933 | } else {
|
---|
934 | PyErr_Clear();
|
---|
935 | }
|
---|
936 |
|
---|
937 | rc = SQLITE_DENY;
|
---|
938 | } else {
|
---|
939 | if (PyInt_Check(ret)) {
|
---|
940 | rc = _PyInt_AsInt(ret);
|
---|
941 | if (rc == -1 && PyErr_Occurred())
|
---|
942 | rc = SQLITE_DENY;
|
---|
943 | } else {
|
---|
944 | rc = SQLITE_DENY;
|
---|
945 | }
|
---|
946 | Py_DECREF(ret);
|
---|
947 | }
|
---|
948 |
|
---|
949 | #ifdef WITH_THREAD
|
---|
950 | PyGILState_Release(gilstate);
|
---|
951 | #endif
|
---|
952 | return rc;
|
---|
953 | }
|
---|
954 |
|
---|
955 | static int _progress_handler(void* user_arg)
|
---|
956 | {
|
---|
957 | int rc;
|
---|
958 | PyObject *ret;
|
---|
959 | #ifdef WITH_THREAD
|
---|
960 | PyGILState_STATE gilstate;
|
---|
961 |
|
---|
962 | gilstate = PyGILState_Ensure();
|
---|
963 | #endif
|
---|
964 | ret = PyObject_CallFunction((PyObject*)user_arg, "");
|
---|
965 |
|
---|
966 | if (!ret) {
|
---|
967 | if (_enable_callback_tracebacks) {
|
---|
968 | PyErr_Print();
|
---|
969 | } else {
|
---|
970 | PyErr_Clear();
|
---|
971 | }
|
---|
972 |
|
---|
973 | /* abort query if error occurred */
|
---|
974 | rc = 1;
|
---|
975 | } else {
|
---|
976 | rc = (int)PyObject_IsTrue(ret);
|
---|
977 | Py_DECREF(ret);
|
---|
978 | }
|
---|
979 |
|
---|
980 | #ifdef WITH_THREAD
|
---|
981 | PyGILState_Release(gilstate);
|
---|
982 | #endif
|
---|
983 | return rc;
|
---|
984 | }
|
---|
985 |
|
---|
986 | static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
987 | {
|
---|
988 | PyObject* authorizer_cb;
|
---|
989 |
|
---|
990 | static char *kwlist[] = { "authorizer_callback", NULL };
|
---|
991 | int rc;
|
---|
992 |
|
---|
993 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
994 | return NULL;
|
---|
995 | }
|
---|
996 |
|
---|
997 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_authorizer",
|
---|
998 | kwlist, &authorizer_cb)) {
|
---|
999 | return NULL;
|
---|
1000 | }
|
---|
1001 |
|
---|
1002 | rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb);
|
---|
1003 |
|
---|
1004 | if (rc != SQLITE_OK) {
|
---|
1005 | PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback");
|
---|
1006 | return NULL;
|
---|
1007 | } else {
|
---|
1008 | if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1)
|
---|
1009 | return NULL;
|
---|
1010 |
|
---|
1011 | Py_INCREF(Py_None);
|
---|
1012 | return Py_None;
|
---|
1013 | }
|
---|
1014 | }
|
---|
1015 |
|
---|
1016 | static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
1017 | {
|
---|
1018 | PyObject* progress_handler;
|
---|
1019 | int n;
|
---|
1020 |
|
---|
1021 | static char *kwlist[] = { "progress_handler", "n", NULL };
|
---|
1022 |
|
---|
1023 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
1024 | return NULL;
|
---|
1025 | }
|
---|
1026 |
|
---|
1027 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi:set_progress_handler",
|
---|
1028 | kwlist, &progress_handler, &n)) {
|
---|
1029 | return NULL;
|
---|
1030 | }
|
---|
1031 |
|
---|
1032 | if (progress_handler == Py_None) {
|
---|
1033 | /* None clears the progress handler previously set */
|
---|
1034 | sqlite3_progress_handler(self->db, 0, 0, (void*)0);
|
---|
1035 | } else {
|
---|
1036 | sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler);
|
---|
1037 | if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1)
|
---|
1038 | return NULL;
|
---|
1039 | }
|
---|
1040 |
|
---|
1041 | Py_INCREF(Py_None);
|
---|
1042 | return Py_None;
|
---|
1043 | }
|
---|
1044 |
|
---|
1045 | #ifdef HAVE_LOAD_EXTENSION
|
---|
1046 | static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args)
|
---|
1047 | {
|
---|
1048 | int rc;
|
---|
1049 | int onoff;
|
---|
1050 |
|
---|
1051 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
1052 | return NULL;
|
---|
1053 | }
|
---|
1054 |
|
---|
1055 | if (!PyArg_ParseTuple(args, "i", &onoff)) {
|
---|
1056 | return NULL;
|
---|
1057 | }
|
---|
1058 |
|
---|
1059 | rc = sqlite3_enable_load_extension(self->db, onoff);
|
---|
1060 |
|
---|
1061 | if (rc != SQLITE_OK) {
|
---|
1062 | PyErr_SetString(pysqlite_OperationalError, "Error enabling load extension");
|
---|
1063 | return NULL;
|
---|
1064 | } else {
|
---|
1065 | Py_INCREF(Py_None);
|
---|
1066 | return Py_None;
|
---|
1067 | }
|
---|
1068 | }
|
---|
1069 |
|
---|
1070 | static PyObject* pysqlite_load_extension(pysqlite_Connection* self, PyObject* args)
|
---|
1071 | {
|
---|
1072 | int rc;
|
---|
1073 | char* extension_name;
|
---|
1074 | char* errmsg;
|
---|
1075 |
|
---|
1076 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
1077 | return NULL;
|
---|
1078 | }
|
---|
1079 |
|
---|
1080 | if (!PyArg_ParseTuple(args, "s", &extension_name)) {
|
---|
1081 | return NULL;
|
---|
1082 | }
|
---|
1083 |
|
---|
1084 | rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg);
|
---|
1085 | if (rc != 0) {
|
---|
1086 | PyErr_SetString(pysqlite_OperationalError, errmsg);
|
---|
1087 | return NULL;
|
---|
1088 | } else {
|
---|
1089 | Py_INCREF(Py_None);
|
---|
1090 | return Py_None;
|
---|
1091 | }
|
---|
1092 | }
|
---|
1093 | #endif
|
---|
1094 |
|
---|
1095 | int pysqlite_check_thread(pysqlite_Connection* self)
|
---|
1096 | {
|
---|
1097 | #ifdef WITH_THREAD
|
---|
1098 | if (self->check_same_thread) {
|
---|
1099 | if (PyThread_get_thread_ident() != self->thread_ident) {
|
---|
1100 | PyErr_Format(pysqlite_ProgrammingError,
|
---|
1101 | "SQLite objects created in a thread can only be used in that same thread."
|
---|
1102 | "The object was created in thread id %ld and this is thread id %ld",
|
---|
1103 | self->thread_ident, PyThread_get_thread_ident());
|
---|
1104 | return 0;
|
---|
1105 | }
|
---|
1106 |
|
---|
1107 | }
|
---|
1108 | #endif
|
---|
1109 | return 1;
|
---|
1110 | }
|
---|
1111 |
|
---|
1112 | static PyObject* pysqlite_connection_get_isolation_level(pysqlite_Connection* self, void* unused)
|
---|
1113 | {
|
---|
1114 | Py_INCREF(self->isolation_level);
|
---|
1115 | return self->isolation_level;
|
---|
1116 | }
|
---|
1117 |
|
---|
1118 | static PyObject* pysqlite_connection_get_total_changes(pysqlite_Connection* self, void* unused)
|
---|
1119 | {
|
---|
1120 | if (!pysqlite_check_connection(self)) {
|
---|
1121 | return NULL;
|
---|
1122 | } else {
|
---|
1123 | return Py_BuildValue("i", sqlite3_total_changes(self->db));
|
---|
1124 | }
|
---|
1125 | }
|
---|
1126 |
|
---|
1127 | static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level)
|
---|
1128 | {
|
---|
1129 | PyObject* res;
|
---|
1130 | PyObject* begin_statement;
|
---|
1131 | char* begin_statement_str;
|
---|
1132 |
|
---|
1133 | Py_XDECREF(self->isolation_level);
|
---|
1134 |
|
---|
1135 | if (self->begin_statement) {
|
---|
1136 | PyMem_Free(self->begin_statement);
|
---|
1137 | self->begin_statement = NULL;
|
---|
1138 | }
|
---|
1139 |
|
---|
1140 | if (isolation_level == Py_None) {
|
---|
1141 | Py_INCREF(Py_None);
|
---|
1142 | self->isolation_level = Py_None;
|
---|
1143 |
|
---|
1144 | res = pysqlite_connection_commit(self, NULL);
|
---|
1145 | if (!res) {
|
---|
1146 | return -1;
|
---|
1147 | }
|
---|
1148 | Py_DECREF(res);
|
---|
1149 |
|
---|
1150 | self->inTransaction = 0;
|
---|
1151 | } else {
|
---|
1152 | Py_INCREF(isolation_level);
|
---|
1153 | self->isolation_level = isolation_level;
|
---|
1154 |
|
---|
1155 | begin_statement = PyString_FromString("BEGIN ");
|
---|
1156 | if (!begin_statement) {
|
---|
1157 | return -1;
|
---|
1158 | }
|
---|
1159 | PyString_Concat(&begin_statement, isolation_level);
|
---|
1160 | if (!begin_statement) {
|
---|
1161 | return -1;
|
---|
1162 | }
|
---|
1163 |
|
---|
1164 | begin_statement_str = PyString_AsString(begin_statement);
|
---|
1165 | if (!begin_statement_str) {
|
---|
1166 | Py_DECREF(begin_statement);
|
---|
1167 | return -1;
|
---|
1168 | }
|
---|
1169 | self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2);
|
---|
1170 | if (!self->begin_statement) {
|
---|
1171 | Py_DECREF(begin_statement);
|
---|
1172 | return -1;
|
---|
1173 | }
|
---|
1174 |
|
---|
1175 | strcpy(self->begin_statement, begin_statement_str);
|
---|
1176 | Py_DECREF(begin_statement);
|
---|
1177 | }
|
---|
1178 |
|
---|
1179 | return 0;
|
---|
1180 | }
|
---|
1181 |
|
---|
1182 | PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
1183 | {
|
---|
1184 | PyObject* sql;
|
---|
1185 | pysqlite_Statement* statement;
|
---|
1186 | PyObject* weakref;
|
---|
1187 | int rc;
|
---|
1188 |
|
---|
1189 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
1190 | return NULL;
|
---|
1191 | }
|
---|
1192 |
|
---|
1193 | if (!PyArg_ParseTuple(args, "O", &sql)) {
|
---|
1194 | return NULL;
|
---|
1195 | }
|
---|
1196 |
|
---|
1197 | _pysqlite_drop_unused_statement_references(self);
|
---|
1198 |
|
---|
1199 | statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
|
---|
1200 | if (!statement) {
|
---|
1201 | return NULL;
|
---|
1202 | }
|
---|
1203 |
|
---|
1204 | statement->db = NULL;
|
---|
1205 | statement->st = NULL;
|
---|
1206 | statement->sql = NULL;
|
---|
1207 | statement->in_use = 0;
|
---|
1208 | statement->in_weakreflist = NULL;
|
---|
1209 |
|
---|
1210 | rc = pysqlite_statement_create(statement, self, sql);
|
---|
1211 |
|
---|
1212 | if (rc != SQLITE_OK) {
|
---|
1213 | if (rc == PYSQLITE_TOO_MUCH_SQL) {
|
---|
1214 | PyErr_SetString(pysqlite_Warning, "You can only execute one statement at a time.");
|
---|
1215 | } else if (rc == PYSQLITE_SQL_WRONG_TYPE) {
|
---|
1216 | PyErr_SetString(pysqlite_Warning, "SQL is of wrong type. Must be string or unicode.");
|
---|
1217 | } else {
|
---|
1218 | (void)pysqlite_statement_reset(statement);
|
---|
1219 | _pysqlite_seterror(self->db, NULL);
|
---|
1220 | }
|
---|
1221 |
|
---|
1222 | Py_CLEAR(statement);
|
---|
1223 | } else {
|
---|
1224 | weakref = PyWeakref_NewRef((PyObject*)statement, NULL);
|
---|
1225 | if (!weakref) {
|
---|
1226 | Py_CLEAR(statement);
|
---|
1227 | goto error;
|
---|
1228 | }
|
---|
1229 |
|
---|
1230 | if (PyList_Append(self->statements, weakref) != 0) {
|
---|
1231 | Py_CLEAR(weakref);
|
---|
1232 | goto error;
|
---|
1233 | }
|
---|
1234 |
|
---|
1235 | Py_DECREF(weakref);
|
---|
1236 | }
|
---|
1237 |
|
---|
1238 | error:
|
---|
1239 | return (PyObject*)statement;
|
---|
1240 | }
|
---|
1241 |
|
---|
1242 | PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
1243 | {
|
---|
1244 | PyObject* cursor = 0;
|
---|
1245 | PyObject* result = 0;
|
---|
1246 | PyObject* method = 0;
|
---|
1247 |
|
---|
1248 | cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
|
---|
1249 | if (!cursor) {
|
---|
1250 | goto error;
|
---|
1251 | }
|
---|
1252 |
|
---|
1253 | method = PyObject_GetAttrString(cursor, "execute");
|
---|
1254 | if (!method) {
|
---|
1255 | Py_CLEAR(cursor);
|
---|
1256 | goto error;
|
---|
1257 | }
|
---|
1258 |
|
---|
1259 | result = PyObject_CallObject(method, args);
|
---|
1260 | if (!result) {
|
---|
1261 | Py_CLEAR(cursor);
|
---|
1262 | }
|
---|
1263 |
|
---|
1264 | error:
|
---|
1265 | Py_XDECREF(result);
|
---|
1266 | Py_XDECREF(method);
|
---|
1267 |
|
---|
1268 | return cursor;
|
---|
1269 | }
|
---|
1270 |
|
---|
1271 | PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
1272 | {
|
---|
1273 | PyObject* cursor = 0;
|
---|
1274 | PyObject* result = 0;
|
---|
1275 | PyObject* method = 0;
|
---|
1276 |
|
---|
1277 | cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
|
---|
1278 | if (!cursor) {
|
---|
1279 | goto error;
|
---|
1280 | }
|
---|
1281 |
|
---|
1282 | method = PyObject_GetAttrString(cursor, "executemany");
|
---|
1283 | if (!method) {
|
---|
1284 | Py_CLEAR(cursor);
|
---|
1285 | goto error;
|
---|
1286 | }
|
---|
1287 |
|
---|
1288 | result = PyObject_CallObject(method, args);
|
---|
1289 | if (!result) {
|
---|
1290 | Py_CLEAR(cursor);
|
---|
1291 | }
|
---|
1292 |
|
---|
1293 | error:
|
---|
1294 | Py_XDECREF(result);
|
---|
1295 | Py_XDECREF(method);
|
---|
1296 |
|
---|
1297 | return cursor;
|
---|
1298 | }
|
---|
1299 |
|
---|
1300 | PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
|
---|
1301 | {
|
---|
1302 | PyObject* cursor = 0;
|
---|
1303 | PyObject* result = 0;
|
---|
1304 | PyObject* method = 0;
|
---|
1305 |
|
---|
1306 | cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
|
---|
1307 | if (!cursor) {
|
---|
1308 | goto error;
|
---|
1309 | }
|
---|
1310 |
|
---|
1311 | method = PyObject_GetAttrString(cursor, "executescript");
|
---|
1312 | if (!method) {
|
---|
1313 | Py_CLEAR(cursor);
|
---|
1314 | goto error;
|
---|
1315 | }
|
---|
1316 |
|
---|
1317 | result = PyObject_CallObject(method, args);
|
---|
1318 | if (!result) {
|
---|
1319 | Py_CLEAR(cursor);
|
---|
1320 | }
|
---|
1321 |
|
---|
1322 | error:
|
---|
1323 | Py_XDECREF(result);
|
---|
1324 | Py_XDECREF(method);
|
---|
1325 |
|
---|
1326 | return cursor;
|
---|
1327 | }
|
---|
1328 |
|
---|
1329 | /* ------------------------- COLLATION CODE ------------------------ */
|
---|
1330 |
|
---|
1331 | static int
|
---|
1332 | pysqlite_collation_callback(
|
---|
1333 | void* context,
|
---|
1334 | int text1_length, const void* text1_data,
|
---|
1335 | int text2_length, const void* text2_data)
|
---|
1336 | {
|
---|
1337 | PyObject* callback = (PyObject*)context;
|
---|
1338 | PyObject* string1 = 0;
|
---|
1339 | PyObject* string2 = 0;
|
---|
1340 | #ifdef WITH_THREAD
|
---|
1341 | PyGILState_STATE gilstate;
|
---|
1342 | #endif
|
---|
1343 | PyObject* retval = NULL;
|
---|
1344 | long longval;
|
---|
1345 | int result = 0;
|
---|
1346 | #ifdef WITH_THREAD
|
---|
1347 | gilstate = PyGILState_Ensure();
|
---|
1348 | #endif
|
---|
1349 |
|
---|
1350 | if (PyErr_Occurred()) {
|
---|
1351 | goto finally;
|
---|
1352 | }
|
---|
1353 |
|
---|
1354 | string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length);
|
---|
1355 | string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length);
|
---|
1356 |
|
---|
1357 | if (!string1 || !string2) {
|
---|
1358 | goto finally; /* failed to allocate strings */
|
---|
1359 | }
|
---|
1360 |
|
---|
1361 | retval = PyObject_CallFunctionObjArgs(callback, string1, string2, NULL);
|
---|
1362 |
|
---|
1363 | if (!retval) {
|
---|
1364 | /* execution failed */
|
---|
1365 | goto finally;
|
---|
1366 | }
|
---|
1367 |
|
---|
1368 | longval = PyLong_AsLongAndOverflow(retval, &result);
|
---|
1369 | if (longval == -1 && PyErr_Occurred()) {
|
---|
1370 | PyErr_Clear();
|
---|
1371 | result = 0;
|
---|
1372 | }
|
---|
1373 | else if (!result) {
|
---|
1374 | if (longval > 0)
|
---|
1375 | result = 1;
|
---|
1376 | else if (longval < 0)
|
---|
1377 | result = -1;
|
---|
1378 | }
|
---|
1379 |
|
---|
1380 | finally:
|
---|
1381 | Py_XDECREF(string1);
|
---|
1382 | Py_XDECREF(string2);
|
---|
1383 | Py_XDECREF(retval);
|
---|
1384 | #ifdef WITH_THREAD
|
---|
1385 | PyGILState_Release(gilstate);
|
---|
1386 | #endif
|
---|
1387 | return result;
|
---|
1388 | }
|
---|
1389 |
|
---|
1390 | static PyObject *
|
---|
1391 | pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args)
|
---|
1392 | {
|
---|
1393 | PyObject* retval = NULL;
|
---|
1394 |
|
---|
1395 | if (!pysqlite_check_connection(self)) {
|
---|
1396 | goto finally;
|
---|
1397 | }
|
---|
1398 |
|
---|
1399 | sqlite3_interrupt(self->db);
|
---|
1400 |
|
---|
1401 | Py_INCREF(Py_None);
|
---|
1402 | retval = Py_None;
|
---|
1403 |
|
---|
1404 | finally:
|
---|
1405 | return retval;
|
---|
1406 | }
|
---|
1407 |
|
---|
1408 | /* Function author: Paul Kippes <kippesp@gmail.com>
|
---|
1409 | * Class method of Connection to call the Python function _iterdump
|
---|
1410 | * of the sqlite3 module.
|
---|
1411 | */
|
---|
1412 | static PyObject *
|
---|
1413 | pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args)
|
---|
1414 | {
|
---|
1415 | PyObject* retval = NULL;
|
---|
1416 | PyObject* module = NULL;
|
---|
1417 | PyObject* module_dict;
|
---|
1418 | PyObject* pyfn_iterdump;
|
---|
1419 |
|
---|
1420 | if (!pysqlite_check_connection(self)) {
|
---|
1421 | goto finally;
|
---|
1422 | }
|
---|
1423 |
|
---|
1424 | module = PyImport_ImportModule(MODULE_NAME ".dump");
|
---|
1425 | if (!module) {
|
---|
1426 | goto finally;
|
---|
1427 | }
|
---|
1428 |
|
---|
1429 | module_dict = PyModule_GetDict(module);
|
---|
1430 | if (!module_dict) {
|
---|
1431 | goto finally;
|
---|
1432 | }
|
---|
1433 |
|
---|
1434 | pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump");
|
---|
1435 | if (!pyfn_iterdump) {
|
---|
1436 | PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference");
|
---|
1437 | goto finally;
|
---|
1438 | }
|
---|
1439 |
|
---|
1440 | args = PyTuple_New(1);
|
---|
1441 | if (!args) {
|
---|
1442 | goto finally;
|
---|
1443 | }
|
---|
1444 | Py_INCREF(self);
|
---|
1445 | PyTuple_SetItem(args, 0, (PyObject*)self);
|
---|
1446 | retval = PyObject_CallObject(pyfn_iterdump, args);
|
---|
1447 |
|
---|
1448 | finally:
|
---|
1449 | Py_XDECREF(args);
|
---|
1450 | Py_XDECREF(module);
|
---|
1451 | return retval;
|
---|
1452 | }
|
---|
1453 |
|
---|
1454 | static PyObject *
|
---|
1455 | pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
|
---|
1456 | {
|
---|
1457 | PyObject* callable;
|
---|
1458 | PyObject* uppercase_name = 0;
|
---|
1459 | PyObject* name;
|
---|
1460 | PyObject* retval;
|
---|
1461 | char* chk;
|
---|
1462 | int rc;
|
---|
1463 |
|
---|
1464 | if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
---|
1465 | goto finally;
|
---|
1466 | }
|
---|
1467 |
|
---|
1468 | if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyString_Type, &name, &callable)) {
|
---|
1469 | goto finally;
|
---|
1470 | }
|
---|
1471 |
|
---|
1472 | uppercase_name = PyObject_CallMethod(name, "upper", "");
|
---|
1473 | if (!uppercase_name) {
|
---|
1474 | goto finally;
|
---|
1475 | }
|
---|
1476 |
|
---|
1477 | chk = PyString_AsString(uppercase_name);
|
---|
1478 | while (*chk) {
|
---|
1479 | if ((*chk >= '0' && *chk <= '9')
|
---|
1480 | || (*chk >= 'A' && *chk <= 'Z')
|
---|
1481 | || (*chk == '_'))
|
---|
1482 | {
|
---|
1483 | chk++;
|
---|
1484 | } else {
|
---|
1485 | PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name");
|
---|
1486 | goto finally;
|
---|
1487 | }
|
---|
1488 | }
|
---|
1489 |
|
---|
1490 | if (callable != Py_None && !PyCallable_Check(callable)) {
|
---|
1491 | PyErr_SetString(PyExc_TypeError, "parameter must be callable");
|
---|
1492 | goto finally;
|
---|
1493 | }
|
---|
1494 |
|
---|
1495 | if (callable != Py_None) {
|
---|
1496 | if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1)
|
---|
1497 | goto finally;
|
---|
1498 | } else {
|
---|
1499 | if (PyDict_DelItem(self->collations, uppercase_name) == -1)
|
---|
1500 | goto finally;
|
---|
1501 | }
|
---|
1502 |
|
---|
1503 | rc = sqlite3_create_collation(self->db,
|
---|
1504 | PyString_AsString(uppercase_name),
|
---|
1505 | SQLITE_UTF8,
|
---|
1506 | (callable != Py_None) ? callable : NULL,
|
---|
1507 | (callable != Py_None) ? pysqlite_collation_callback : NULL);
|
---|
1508 | if (rc != SQLITE_OK) {
|
---|
1509 | PyDict_DelItem(self->collations, uppercase_name);
|
---|
1510 | _pysqlite_seterror(self->db, NULL);
|
---|
1511 | goto finally;
|
---|
1512 | }
|
---|
1513 |
|
---|
1514 | finally:
|
---|
1515 | Py_XDECREF(uppercase_name);
|
---|
1516 |
|
---|
1517 | if (PyErr_Occurred()) {
|
---|
1518 | retval = NULL;
|
---|
1519 | } else {
|
---|
1520 | Py_INCREF(Py_None);
|
---|
1521 | retval = Py_None;
|
---|
1522 | }
|
---|
1523 |
|
---|
1524 | return retval;
|
---|
1525 | }
|
---|
1526 |
|
---|
1527 | /* Called when the connection is used as a context manager. Returns itself as a
|
---|
1528 | * convenience to the caller. */
|
---|
1529 | static PyObject *
|
---|
1530 | pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args)
|
---|
1531 | {
|
---|
1532 | Py_INCREF(self);
|
---|
1533 | return (PyObject*)self;
|
---|
1534 | }
|
---|
1535 |
|
---|
1536 | /** Called when the connection is used as a context manager. If there was any
|
---|
1537 | * exception, a rollback takes place; otherwise we commit. */
|
---|
1538 | static PyObject *
|
---|
1539 | pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args)
|
---|
1540 | {
|
---|
1541 | PyObject* exc_type, *exc_value, *exc_tb;
|
---|
1542 | char* method_name;
|
---|
1543 | PyObject* result;
|
---|
1544 |
|
---|
1545 | if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) {
|
---|
1546 | return NULL;
|
---|
1547 | }
|
---|
1548 |
|
---|
1549 | if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) {
|
---|
1550 | method_name = "commit";
|
---|
1551 | } else {
|
---|
1552 | method_name = "rollback";
|
---|
1553 | }
|
---|
1554 |
|
---|
1555 | result = PyObject_CallMethod((PyObject*)self, method_name, "");
|
---|
1556 | if (!result) {
|
---|
1557 | return NULL;
|
---|
1558 | }
|
---|
1559 | Py_DECREF(result);
|
---|
1560 |
|
---|
1561 | Py_INCREF(Py_False);
|
---|
1562 | return Py_False;
|
---|
1563 | }
|
---|
1564 |
|
---|
1565 | static char connection_doc[] =
|
---|
1566 | PyDoc_STR("SQLite database connection object.");
|
---|
1567 |
|
---|
1568 | static PyGetSetDef connection_getset[] = {
|
---|
1569 | {"isolation_level", (getter)pysqlite_connection_get_isolation_level, (setter)pysqlite_connection_set_isolation_level},
|
---|
1570 | {"total_changes", (getter)pysqlite_connection_get_total_changes, (setter)0},
|
---|
1571 | {NULL}
|
---|
1572 | };
|
---|
1573 |
|
---|
1574 | static PyMethodDef connection_methods[] = {
|
---|
1575 | {"cursor", (PyCFunction)pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS,
|
---|
1576 | PyDoc_STR("Return a cursor for the connection.")},
|
---|
1577 | {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS,
|
---|
1578 | PyDoc_STR("Closes the connection.")},
|
---|
1579 | {"commit", (PyCFunction)pysqlite_connection_commit, METH_NOARGS,
|
---|
1580 | PyDoc_STR("Commit the current transaction.")},
|
---|
1581 | {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS,
|
---|
1582 | PyDoc_STR("Roll back the current transaction.")},
|
---|
1583 | {"create_function", (PyCFunction)pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS,
|
---|
1584 | PyDoc_STR("Creates a new function. Non-standard.")},
|
---|
1585 | {"create_aggregate", (PyCFunction)pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS,
|
---|
1586 | PyDoc_STR("Creates a new aggregate. Non-standard.")},
|
---|
1587 | {"set_authorizer", (PyCFunction)pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS,
|
---|
1588 | PyDoc_STR("Sets authorizer callback. Non-standard.")},
|
---|
1589 | #ifdef HAVE_LOAD_EXTENSION
|
---|
1590 | {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS,
|
---|
1591 | PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")},
|
---|
1592 | {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS,
|
---|
1593 | PyDoc_STR("Load SQLite extension module. Non-standard.")},
|
---|
1594 | #endif
|
---|
1595 | {"set_progress_handler", (PyCFunction)pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS,
|
---|
1596 | PyDoc_STR("Sets progress handler callback. Non-standard.")},
|
---|
1597 | {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS,
|
---|
1598 | PyDoc_STR("Executes a SQL statement. Non-standard.")},
|
---|
1599 | {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS,
|
---|
1600 | PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")},
|
---|
1601 | {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS,
|
---|
1602 | PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
|
---|
1603 | {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS,
|
---|
1604 | PyDoc_STR("Creates a collation function. Non-standard.")},
|
---|
1605 | {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
|
---|
1606 | PyDoc_STR("Abort any pending database operation. Non-standard.")},
|
---|
1607 | {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
|
---|
1608 | PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")},
|
---|
1609 | {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
|
---|
1610 | PyDoc_STR("For context manager. Non-standard.")},
|
---|
1611 | {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,
|
---|
1612 | PyDoc_STR("For context manager. Non-standard.")},
|
---|
1613 | {NULL, NULL}
|
---|
1614 | };
|
---|
1615 |
|
---|
1616 | static struct PyMemberDef connection_members[] =
|
---|
1617 | {
|
---|
1618 | {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), RO},
|
---|
1619 | {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), RO},
|
---|
1620 | {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), RO},
|
---|
1621 | {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), RO},
|
---|
1622 | {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), RO},
|
---|
1623 | {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), RO},
|
---|
1624 | {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), RO},
|
---|
1625 | {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), RO},
|
---|
1626 | {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), RO},
|
---|
1627 | {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), RO},
|
---|
1628 | {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)},
|
---|
1629 | {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)},
|
---|
1630 | {NULL}
|
---|
1631 | };
|
---|
1632 |
|
---|
1633 | PyTypeObject pysqlite_ConnectionType = {
|
---|
1634 | PyVarObject_HEAD_INIT(NULL, 0)
|
---|
1635 | MODULE_NAME ".Connection", /* tp_name */
|
---|
1636 | sizeof(pysqlite_Connection), /* tp_basicsize */
|
---|
1637 | 0, /* tp_itemsize */
|
---|
1638 | (destructor)pysqlite_connection_dealloc, /* tp_dealloc */
|
---|
1639 | 0, /* tp_print */
|
---|
1640 | 0, /* tp_getattr */
|
---|
1641 | 0, /* tp_setattr */
|
---|
1642 | 0, /* tp_compare */
|
---|
1643 | 0, /* tp_repr */
|
---|
1644 | 0, /* tp_as_number */
|
---|
1645 | 0, /* tp_as_sequence */
|
---|
1646 | 0, /* tp_as_mapping */
|
---|
1647 | 0, /* tp_hash */
|
---|
1648 | (ternaryfunc)pysqlite_connection_call, /* tp_call */
|
---|
1649 | 0, /* tp_str */
|
---|
1650 | 0, /* tp_getattro */
|
---|
1651 | 0, /* tp_setattro */
|
---|
1652 | 0, /* tp_as_buffer */
|
---|
1653 | Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
|
---|
1654 | connection_doc, /* tp_doc */
|
---|
1655 | 0, /* tp_traverse */
|
---|
1656 | 0, /* tp_clear */
|
---|
1657 | 0, /* tp_richcompare */
|
---|
1658 | 0, /* tp_weaklistoffset */
|
---|
1659 | 0, /* tp_iter */
|
---|
1660 | 0, /* tp_iternext */
|
---|
1661 | connection_methods, /* tp_methods */
|
---|
1662 | connection_members, /* tp_members */
|
---|
1663 | connection_getset, /* tp_getset */
|
---|
1664 | 0, /* tp_base */
|
---|
1665 | 0, /* tp_dict */
|
---|
1666 | 0, /* tp_descr_get */
|
---|
1667 | 0, /* tp_descr_set */
|
---|
1668 | 0, /* tp_dictoffset */
|
---|
1669 | (initproc)pysqlite_connection_init, /* tp_init */
|
---|
1670 | 0, /* tp_alloc */
|
---|
1671 | 0, /* tp_new */
|
---|
1672 | 0 /* tp_free */
|
---|
1673 | };
|
---|
1674 |
|
---|
1675 | extern int pysqlite_connection_setup_types(void)
|
---|
1676 | {
|
---|
1677 | pysqlite_ConnectionType.tp_new = PyType_GenericNew;
|
---|
1678 | return PyType_Ready(&pysqlite_ConnectionType);
|
---|
1679 | }
|
---|