Home | History | Annotate | Download | only in _sqlite
      1 /* connection.c - the connection type
      2  *
      3  * Copyright (C) 2004-2010 Gerhard Hring <gh (at) 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 void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val)
    542 {
    543     long longval;
    544     const char* buffer;
    545     Py_ssize_t buflen;
    546     PyObject* stringval;
    547 
    548     if ((!py_val) || PyErr_Occurred()) {
    549         sqlite3_result_null(context);
    550     } else if (py_val == Py_None) {
    551         sqlite3_result_null(context);
    552     } else if (PyInt_Check(py_val)) {
    553         longval = PyInt_AsLong(py_val);
    554         sqlite3_result_int64(context, (PY_LONG_LONG)longval);
    555     } else if (PyFloat_Check(py_val)) {
    556         sqlite3_result_double(context, PyFloat_AsDouble(py_val));
    557     } else if (PyBuffer_Check(py_val)) {
    558         if (PyObject_AsCharBuffer(py_val, &buffer, &buflen) != 0) {
    559             PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer");
    560         } else {
    561             sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT);
    562         }
    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         stringval = PyUnicode_AsUTF8String(py_val);
    567         if (stringval) {
    568             sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT);
    569             Py_DECREF(stringval);
    570         }
    571     } else {
    572         /* TODO: raise error */
    573     }
    574 }
    575 
    576 PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv)
    577 {
    578     PyObject* args;
    579     int i;
    580     sqlite3_value* cur_value;
    581     PyObject* cur_py_value;
    582     const char* val_str;
    583     PY_LONG_LONG val_int;
    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                 val_int = sqlite3_value_int64(cur_value);
    597                 cur_py_value = PyInt_FromLong((long)val_int);
    598                 break;
    599             case SQLITE_FLOAT:
    600                 cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value));
    601                 break;
    602             case SQLITE_TEXT:
    603                 val_str = (const char*)sqlite3_value_text(cur_value);
    604                 cur_py_value = PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL);
    605                 /* TODO: have a way to show errors here */
    606                 if (!cur_py_value) {
    607                     PyErr_Clear();
    608                     Py_INCREF(Py_None);
    609                     cur_py_value = Py_None;
    610                 }
    611                 break;
    612             case SQLITE_BLOB:
    613                 buflen = sqlite3_value_bytes(cur_value);
    614                 cur_py_value = PyBuffer_New(buflen);
    615                 if (!cur_py_value) {
    616                     break;
    617                 }
    618                 if (PyObject_AsWriteBuffer(cur_py_value, &raw_buffer, &buflen)) {
    619                     Py_DECREF(cur_py_value);
    620                     cur_py_value = NULL;
    621                     break;
    622                 }
    623                 memcpy(raw_buffer, sqlite3_value_blob(cur_value), buflen);
    624                 break;
    625             case SQLITE_NULL:
    626             default:
    627                 Py_INCREF(Py_None);
    628                 cur_py_value = Py_None;
    629         }
    630 
    631         if (!cur_py_value) {
    632             Py_DECREF(args);
    633             return NULL;
    634         }
    635 
    636         PyTuple_SetItem(args, i, cur_py_value);
    637 
    638     }
    639 
    640     return args;
    641 }
    642 
    643 void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv)
    644 {
    645     PyObject* args;
    646     PyObject* py_func;
    647     PyObject* py_retval = NULL;
    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     if (py_retval) {
    664         _pysqlite_set_result(context, py_retval);
    665         Py_DECREF(py_retval);
    666     } else {
    667         if (_enable_callback_tracebacks) {
    668             PyErr_Print();
    669         } else {
    670             PyErr_Clear();
    671         }
    672         _sqlite3_result_error(context, "user-defined function raised exception", -1);
    673     }
    674 
    675 #ifdef WITH_THREAD
    676     PyGILState_Release(threadstate);
    677 #endif
    678 }
    679 
    680 static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_value** params)
    681 {
    682     PyObject* args;
    683     PyObject* function_result = NULL;
    684     PyObject* aggregate_class;
    685     PyObject** aggregate_instance;
    686     PyObject* stepmethod = NULL;
    687 
    688 #ifdef WITH_THREAD
    689     PyGILState_STATE threadstate;
    690 
    691     threadstate = PyGILState_Ensure();
    692 #endif
    693 
    694     aggregate_class = (PyObject*)sqlite3_user_data(context);
    695 
    696     aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
    697 
    698     if (*aggregate_instance == 0) {
    699         *aggregate_instance = PyObject_CallFunction(aggregate_class, "");
    700 
    701         if (PyErr_Occurred()) {
    702             *aggregate_instance = 0;
    703             if (_enable_callback_tracebacks) {
    704                 PyErr_Print();
    705             } else {
    706                 PyErr_Clear();
    707             }
    708             _sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1);
    709             goto error;
    710         }
    711     }
    712 
    713     stepmethod = PyObject_GetAttrString(*aggregate_instance, "step");
    714     if (!stepmethod) {
    715         goto error;
    716     }
    717 
    718     args = _pysqlite_build_py_params(context, argc, params);
    719     if (!args) {
    720         goto error;
    721     }
    722 
    723     function_result = PyObject_CallObject(stepmethod, args);
    724     Py_DECREF(args);
    725 
    726     if (!function_result) {
    727         if (_enable_callback_tracebacks) {
    728             PyErr_Print();
    729         } else {
    730             PyErr_Clear();
    731         }
    732         _sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1);
    733     }
    734 
    735 error:
    736     Py_XDECREF(stepmethod);
    737     Py_XDECREF(function_result);
    738 
    739 #ifdef WITH_THREAD
    740     PyGILState_Release(threadstate);
    741 #endif
    742 }
    743 
    744 void _pysqlite_final_callback(sqlite3_context* context)
    745 {
    746     PyObject* function_result = NULL;
    747     PyObject** aggregate_instance;
    748 
    749 #ifdef WITH_THREAD
    750     PyGILState_STATE threadstate;
    751 
    752     threadstate = PyGILState_Ensure();
    753 #endif
    754 
    755     aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
    756     if (!*aggregate_instance) {
    757         /* this branch is executed if there was an exception in the aggregate's
    758          * __init__ */
    759 
    760         goto error;
    761     }
    762 
    763     function_result = PyObject_CallMethod(*aggregate_instance, "finalize", "");
    764     if (!function_result) {
    765         if (_enable_callback_tracebacks) {
    766             PyErr_Print();
    767         } else {
    768             PyErr_Clear();
    769         }
    770         _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
    771     } else {
    772         _pysqlite_set_result(context, function_result);
    773     }
    774 
    775 error:
    776     Py_XDECREF(*aggregate_instance);
    777     Py_XDECREF(function_result);
    778 
    779 #ifdef WITH_THREAD
    780     PyGILState_Release(threadstate);
    781 #endif
    782 }
    783 
    784 static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self)
    785 {
    786     PyObject* new_list;
    787     PyObject* weakref;
    788     int i;
    789 
    790     /* we only need to do this once in a while */
    791     if (self->created_statements++ < 200) {
    792         return;
    793     }
    794 
    795     self->created_statements = 0;
    796 
    797     new_list = PyList_New(0);
    798     if (!new_list) {
    799         return;
    800     }
    801 
    802     for (i = 0; i < PyList_Size(self->statements); i++) {
    803         weakref = PyList_GetItem(self->statements, i);
    804         if (PyWeakref_GetObject(weakref) != Py_None) {
    805             if (PyList_Append(new_list, weakref) != 0) {
    806                 Py_DECREF(new_list);
    807                 return;
    808             }
    809         }
    810     }
    811 
    812     Py_DECREF(self->statements);
    813     self->statements = new_list;
    814 }
    815 
    816 static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
    817 {
    818     PyObject* new_list;
    819     PyObject* weakref;
    820     int i;
    821 
    822     /* we only need to do this once in a while */
    823     if (self->created_cursors++ < 200) {
    824         return;
    825     }
    826 
    827     self->created_cursors = 0;
    828 
    829     new_list = PyList_New(0);
    830     if (!new_list) {
    831         return;
    832     }
    833 
    834     for (i = 0; i < PyList_Size(self->cursors); i++) {
    835         weakref = PyList_GetItem(self->cursors, i);
    836         if (PyWeakref_GetObject(weakref) != Py_None) {
    837             if (PyList_Append(new_list, weakref) != 0) {
    838                 Py_DECREF(new_list);
    839                 return;
    840             }
    841         }
    842     }
    843 
    844     Py_DECREF(self->cursors);
    845     self->cursors = new_list;
    846 }
    847 
    848 PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
    849 {
    850     static char *kwlist[] = {"name", "narg", "func", NULL, NULL};
    851 
    852     PyObject* func;
    853     char* name;
    854     int narg;
    855     int rc;
    856 
    857     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    858         return NULL;
    859     }
    860 
    861     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO", kwlist,
    862                                      &name, &narg, &func))
    863     {
    864         return NULL;
    865     }
    866 
    867     rc = sqlite3_create_function(self->db, name, narg, SQLITE_UTF8, (void*)func, _pysqlite_func_callback, NULL, NULL);
    868 
    869     if (rc != SQLITE_OK) {
    870         /* Workaround for SQLite bug: no error code or string is available here */
    871         PyErr_SetString(pysqlite_OperationalError, "Error creating function");
    872         return NULL;
    873     } else {
    874         if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1)
    875             return NULL;
    876 
    877         Py_INCREF(Py_None);
    878         return Py_None;
    879     }
    880 }
    881 
    882 PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
    883 {
    884     PyObject* aggregate_class;
    885 
    886     int n_arg;
    887     char* name;
    888     static char *kwlist[] = { "name", "n_arg", "aggregate_class", NULL };
    889     int rc;
    890 
    891     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    892         return NULL;
    893     }
    894 
    895     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO:create_aggregate",
    896                                       kwlist, &name, &n_arg, &aggregate_class)) {
    897         return NULL;
    898     }
    899 
    900     rc = sqlite3_create_function(self->db, name, n_arg, SQLITE_UTF8, (void*)aggregate_class, 0, &_pysqlite_step_callback, &_pysqlite_final_callback);
    901     if (rc != SQLITE_OK) {
    902         /* Workaround for SQLite bug: no error code or string is available here */
    903         PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate");
    904         return NULL;
    905     } else {
    906         if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1)
    907             return NULL;
    908 
    909         Py_INCREF(Py_None);
    910         return Py_None;
    911     }
    912 }
    913 
    914 static int _authorizer_callback(void* user_arg, int action, const char* arg1, const char* arg2 , const char* dbname, const char* access_attempt_source)
    915 {
    916     PyObject *ret;
    917     int rc;
    918 #ifdef WITH_THREAD
    919     PyGILState_STATE gilstate;
    920 
    921     gilstate = PyGILState_Ensure();
    922 #endif
    923     ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
    924 
    925     if (!ret) {
    926         if (_enable_callback_tracebacks) {
    927             PyErr_Print();
    928         } else {
    929             PyErr_Clear();
    930         }
    931 
    932         rc = SQLITE_DENY;
    933     } else {
    934         if (PyInt_Check(ret)) {
    935             rc = (int)PyInt_AsLong(ret);
    936         } else {
    937             rc = SQLITE_DENY;
    938         }
    939         Py_DECREF(ret);
    940     }
    941 
    942 #ifdef WITH_THREAD
    943     PyGILState_Release(gilstate);
    944 #endif
    945     return rc;
    946 }
    947 
    948 static int _progress_handler(void* user_arg)
    949 {
    950     int rc;
    951     PyObject *ret;
    952 #ifdef WITH_THREAD
    953     PyGILState_STATE gilstate;
    954 
    955     gilstate = PyGILState_Ensure();
    956 #endif
    957     ret = PyObject_CallFunction((PyObject*)user_arg, "");
    958 
    959     if (!ret) {
    960         if (_enable_callback_tracebacks) {
    961             PyErr_Print();
    962         } else {
    963             PyErr_Clear();
    964         }
    965 
    966         /* abort query if error occurred */
    967         rc = 1;
    968     } else {
    969         rc = (int)PyObject_IsTrue(ret);
    970         Py_DECREF(ret);
    971     }
    972 
    973 #ifdef WITH_THREAD
    974     PyGILState_Release(gilstate);
    975 #endif
    976     return rc;
    977 }
    978 
    979 static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
    980 {
    981     PyObject* authorizer_cb;
    982 
    983     static char *kwlist[] = { "authorizer_callback", NULL };
    984     int rc;
    985 
    986     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
    987         return NULL;
    988     }
    989 
    990     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_authorizer",
    991                                       kwlist, &authorizer_cb)) {
    992         return NULL;
    993     }
    994 
    995     rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb);
    996 
    997     if (rc != SQLITE_OK) {
    998         PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback");
    999         return NULL;
   1000     } else {
   1001         if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1)
   1002             return NULL;
   1003 
   1004         Py_INCREF(Py_None);
   1005         return Py_None;
   1006     }
   1007 }
   1008 
   1009 static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
   1010 {
   1011     PyObject* progress_handler;
   1012     int n;
   1013 
   1014     static char *kwlist[] = { "progress_handler", "n", NULL };
   1015 
   1016     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
   1017         return NULL;
   1018     }
   1019 
   1020     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi:set_progress_handler",
   1021                                       kwlist, &progress_handler, &n)) {
   1022         return NULL;
   1023     }
   1024 
   1025     if (progress_handler == Py_None) {
   1026         /* None clears the progress handler previously set */
   1027         sqlite3_progress_handler(self->db, 0, 0, (void*)0);
   1028     } else {
   1029         sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler);
   1030         if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1)
   1031             return NULL;
   1032     }
   1033 
   1034     Py_INCREF(Py_None);
   1035     return Py_None;
   1036 }
   1037 
   1038 #ifdef HAVE_LOAD_EXTENSION
   1039 static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args)
   1040 {
   1041     int rc;
   1042     int onoff;
   1043 
   1044     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
   1045         return NULL;
   1046     }
   1047 
   1048     if (!PyArg_ParseTuple(args, "i", &onoff)) {
   1049         return NULL;
   1050     }
   1051 
   1052     rc = sqlite3_enable_load_extension(self->db, onoff);
   1053 
   1054     if (rc != SQLITE_OK) {
   1055         PyErr_SetString(pysqlite_OperationalError, "Error enabling load extension");
   1056         return NULL;
   1057     } else {
   1058         Py_INCREF(Py_None);
   1059         return Py_None;
   1060     }
   1061 }
   1062 
   1063 static PyObject* pysqlite_load_extension(pysqlite_Connection* self, PyObject* args)
   1064 {
   1065     int rc;
   1066     char* extension_name;
   1067     char* errmsg;
   1068 
   1069     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
   1070         return NULL;
   1071     }
   1072 
   1073     if (!PyArg_ParseTuple(args, "s", &extension_name)) {
   1074         return NULL;
   1075     }
   1076 
   1077     rc = sqlite3_load_extension(self->db, extension_name, 0, &errmsg);
   1078     if (rc != 0) {
   1079         PyErr_SetString(pysqlite_OperationalError, errmsg);
   1080         return NULL;
   1081     } else {
   1082         Py_INCREF(Py_None);
   1083         return Py_None;
   1084     }
   1085 }
   1086 #endif
   1087 
   1088 int pysqlite_check_thread(pysqlite_Connection* self)
   1089 {
   1090 #ifdef WITH_THREAD
   1091     if (self->check_same_thread) {
   1092         if (PyThread_get_thread_ident() != self->thread_ident) {
   1093             PyErr_Format(pysqlite_ProgrammingError,
   1094                         "SQLite objects created in a thread can only be used in that same thread."
   1095                         "The object was created in thread id %ld and this is thread id %ld",
   1096                         self->thread_ident, PyThread_get_thread_ident());
   1097             return 0;
   1098         }
   1099 
   1100     }
   1101 #endif
   1102     return 1;
   1103 }
   1104 
   1105 static PyObject* pysqlite_connection_get_isolation_level(pysqlite_Connection* self, void* unused)
   1106 {
   1107     Py_INCREF(self->isolation_level);
   1108     return self->isolation_level;
   1109 }
   1110 
   1111 static PyObject* pysqlite_connection_get_total_changes(pysqlite_Connection* self, void* unused)
   1112 {
   1113     if (!pysqlite_check_connection(self)) {
   1114         return NULL;
   1115     } else {
   1116         return Py_BuildValue("i", sqlite3_total_changes(self->db));
   1117     }
   1118 }
   1119 
   1120 static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level)
   1121 {
   1122     PyObject* res;
   1123     PyObject* begin_statement;
   1124     char* begin_statement_str;
   1125 
   1126     Py_XDECREF(self->isolation_level);
   1127 
   1128     if (self->begin_statement) {
   1129         PyMem_Free(self->begin_statement);
   1130         self->begin_statement = NULL;
   1131     }
   1132 
   1133     if (isolation_level == Py_None) {
   1134         Py_INCREF(Py_None);
   1135         self->isolation_level = Py_None;
   1136 
   1137         res = pysqlite_connection_commit(self, NULL);
   1138         if (!res) {
   1139             return -1;
   1140         }
   1141         Py_DECREF(res);
   1142 
   1143         self->inTransaction = 0;
   1144     } else {
   1145         Py_INCREF(isolation_level);
   1146         self->isolation_level = isolation_level;
   1147 
   1148         begin_statement = PyString_FromString("BEGIN ");
   1149         if (!begin_statement) {
   1150             return -1;
   1151         }
   1152         PyString_Concat(&begin_statement, isolation_level);
   1153         if (!begin_statement) {
   1154             return -1;
   1155         }
   1156 
   1157         begin_statement_str = PyString_AsString(begin_statement);
   1158         if (!begin_statement_str) {
   1159             Py_DECREF(begin_statement);
   1160             return -1;
   1161         }
   1162         self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2);
   1163         if (!self->begin_statement) {
   1164             Py_DECREF(begin_statement);
   1165             return -1;
   1166         }
   1167 
   1168         strcpy(self->begin_statement, begin_statement_str);
   1169         Py_DECREF(begin_statement);
   1170     }
   1171 
   1172     return 0;
   1173 }
   1174 
   1175 PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
   1176 {
   1177     PyObject* sql;
   1178     pysqlite_Statement* statement;
   1179     PyObject* weakref;
   1180     int rc;
   1181 
   1182     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
   1183         return NULL;
   1184     }
   1185 
   1186     if (!PyArg_ParseTuple(args, "O", &sql)) {
   1187         return NULL;
   1188     }
   1189 
   1190     _pysqlite_drop_unused_statement_references(self);
   1191 
   1192     statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
   1193     if (!statement) {
   1194         return NULL;
   1195     }
   1196 
   1197     statement->db = NULL;
   1198     statement->st = NULL;
   1199     statement->sql = NULL;
   1200     statement->in_use = 0;
   1201     statement->in_weakreflist = NULL;
   1202 
   1203     rc = pysqlite_statement_create(statement, self, sql);
   1204 
   1205     if (rc != SQLITE_OK) {
   1206         if (rc == PYSQLITE_TOO_MUCH_SQL) {
   1207             PyErr_SetString(pysqlite_Warning, "You can only execute one statement at a time.");
   1208         } else if (rc == PYSQLITE_SQL_WRONG_TYPE) {
   1209             PyErr_SetString(pysqlite_Warning, "SQL is of wrong type. Must be string or unicode.");
   1210         } else {
   1211             (void)pysqlite_statement_reset(statement);
   1212             _pysqlite_seterror(self->db, NULL);
   1213         }
   1214 
   1215         Py_CLEAR(statement);
   1216     } else {
   1217         weakref = PyWeakref_NewRef((PyObject*)statement, NULL);
   1218         if (!weakref) {
   1219             Py_CLEAR(statement);
   1220             goto error;
   1221         }
   1222 
   1223         if (PyList_Append(self->statements, weakref) != 0) {
   1224             Py_CLEAR(weakref);
   1225             goto error;
   1226         }
   1227 
   1228         Py_DECREF(weakref);
   1229     }
   1230 
   1231 error:
   1232     return (PyObject*)statement;
   1233 }
   1234 
   1235 PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
   1236 {
   1237     PyObject* cursor = 0;
   1238     PyObject* result = 0;
   1239     PyObject* method = 0;
   1240 
   1241     cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
   1242     if (!cursor) {
   1243         goto error;
   1244     }
   1245 
   1246     method = PyObject_GetAttrString(cursor, "execute");
   1247     if (!method) {
   1248         Py_CLEAR(cursor);
   1249         goto error;
   1250     }
   1251 
   1252     result = PyObject_CallObject(method, args);
   1253     if (!result) {
   1254         Py_CLEAR(cursor);
   1255     }
   1256 
   1257 error:
   1258     Py_XDECREF(result);
   1259     Py_XDECREF(method);
   1260 
   1261     return cursor;
   1262 }
   1263 
   1264 PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
   1265 {
   1266     PyObject* cursor = 0;
   1267     PyObject* result = 0;
   1268     PyObject* method = 0;
   1269 
   1270     cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
   1271     if (!cursor) {
   1272         goto error;
   1273     }
   1274 
   1275     method = PyObject_GetAttrString(cursor, "executemany");
   1276     if (!method) {
   1277         Py_CLEAR(cursor);
   1278         goto error;
   1279     }
   1280 
   1281     result = PyObject_CallObject(method, args);
   1282     if (!result) {
   1283         Py_CLEAR(cursor);
   1284     }
   1285 
   1286 error:
   1287     Py_XDECREF(result);
   1288     Py_XDECREF(method);
   1289 
   1290     return cursor;
   1291 }
   1292 
   1293 PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
   1294 {
   1295     PyObject* cursor = 0;
   1296     PyObject* result = 0;
   1297     PyObject* method = 0;
   1298 
   1299     cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
   1300     if (!cursor) {
   1301         goto error;
   1302     }
   1303 
   1304     method = PyObject_GetAttrString(cursor, "executescript");
   1305     if (!method) {
   1306         Py_CLEAR(cursor);
   1307         goto error;
   1308     }
   1309 
   1310     result = PyObject_CallObject(method, args);
   1311     if (!result) {
   1312         Py_CLEAR(cursor);
   1313     }
   1314 
   1315 error:
   1316     Py_XDECREF(result);
   1317     Py_XDECREF(method);
   1318 
   1319     return cursor;
   1320 }
   1321 
   1322 /* ------------------------- COLLATION CODE ------------------------ */
   1323 
   1324 static int
   1325 pysqlite_collation_callback(
   1326         void* context,
   1327         int text1_length, const void* text1_data,
   1328         int text2_length, const void* text2_data)
   1329 {
   1330     PyObject* callback = (PyObject*)context;
   1331     PyObject* string1 = 0;
   1332     PyObject* string2 = 0;
   1333 #ifdef WITH_THREAD
   1334     PyGILState_STATE gilstate;
   1335 #endif
   1336     PyObject* retval = NULL;
   1337     int result = 0;
   1338 #ifdef WITH_THREAD
   1339     gilstate = PyGILState_Ensure();
   1340 #endif
   1341 
   1342     if (PyErr_Occurred()) {
   1343         goto finally;
   1344     }
   1345 
   1346     string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length);
   1347     string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length);
   1348 
   1349     if (!string1 || !string2) {
   1350         goto finally; /* failed to allocate strings */
   1351     }
   1352 
   1353     retval = PyObject_CallFunctionObjArgs(callback, string1, string2, NULL);
   1354 
   1355     if (!retval) {
   1356         /* execution failed */
   1357         goto finally;
   1358     }
   1359 
   1360     result = PyInt_AsLong(retval);
   1361     if (PyErr_Occurred()) {
   1362         result = 0;
   1363     }
   1364 
   1365 finally:
   1366     Py_XDECREF(string1);
   1367     Py_XDECREF(string2);
   1368     Py_XDECREF(retval);
   1369 #ifdef WITH_THREAD
   1370     PyGILState_Release(gilstate);
   1371 #endif
   1372     return result;
   1373 }
   1374 
   1375 static PyObject *
   1376 pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args)
   1377 {
   1378     PyObject* retval = NULL;
   1379 
   1380     if (!pysqlite_check_connection(self)) {
   1381         goto finally;
   1382     }
   1383 
   1384     sqlite3_interrupt(self->db);
   1385 
   1386     Py_INCREF(Py_None);
   1387     retval = Py_None;
   1388 
   1389 finally:
   1390     return retval;
   1391 }
   1392 
   1393 /* Function author: Paul Kippes <kippesp (at) gmail.com>
   1394  * Class method of Connection to call the Python function _iterdump
   1395  * of the sqlite3 module.
   1396  */
   1397 static PyObject *
   1398 pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args)
   1399 {
   1400     PyObject* retval = NULL;
   1401     PyObject* module = NULL;
   1402     PyObject* module_dict;
   1403     PyObject* pyfn_iterdump;
   1404 
   1405     if (!pysqlite_check_connection(self)) {
   1406         goto finally;
   1407     }
   1408 
   1409     module = PyImport_ImportModule(MODULE_NAME ".dump");
   1410     if (!module) {
   1411         goto finally;
   1412     }
   1413 
   1414     module_dict = PyModule_GetDict(module);
   1415     if (!module_dict) {
   1416         goto finally;
   1417     }
   1418 
   1419     pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump");
   1420     if (!pyfn_iterdump) {
   1421         PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference");
   1422         goto finally;
   1423     }
   1424 
   1425     args = PyTuple_New(1);
   1426     if (!args) {
   1427         goto finally;
   1428     }
   1429     Py_INCREF(self);
   1430     PyTuple_SetItem(args, 0, (PyObject*)self);
   1431     retval = PyObject_CallObject(pyfn_iterdump, args);
   1432 
   1433 finally:
   1434     Py_XDECREF(args);
   1435     Py_XDECREF(module);
   1436     return retval;
   1437 }
   1438 
   1439 static PyObject *
   1440 pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
   1441 {
   1442     PyObject* callable;
   1443     PyObject* uppercase_name = 0;
   1444     PyObject* name;
   1445     PyObject* retval;
   1446     char* chk;
   1447     int rc;
   1448 
   1449     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
   1450         goto finally;
   1451     }
   1452 
   1453     if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyString_Type, &name, &callable)) {
   1454         goto finally;
   1455     }
   1456 
   1457     uppercase_name = PyObject_CallMethod(name, "upper", "");
   1458     if (!uppercase_name) {
   1459         goto finally;
   1460     }
   1461 
   1462     chk = PyString_AsString(uppercase_name);
   1463     while (*chk) {
   1464         if ((*chk >= '0' && *chk <= '9')
   1465          || (*chk >= 'A' && *chk <= 'Z')
   1466          || (*chk == '_'))
   1467         {
   1468             chk++;
   1469         } else {
   1470             PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name");
   1471             goto finally;
   1472         }
   1473     }
   1474 
   1475     if (callable != Py_None && !PyCallable_Check(callable)) {
   1476         PyErr_SetString(PyExc_TypeError, "parameter must be callable");
   1477         goto finally;
   1478     }
   1479 
   1480     if (callable != Py_None) {
   1481         if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1)
   1482             goto finally;
   1483     } else {
   1484         if (PyDict_DelItem(self->collations, uppercase_name) == -1)
   1485             goto finally;
   1486     }
   1487 
   1488     rc = sqlite3_create_collation(self->db,
   1489                                   PyString_AsString(uppercase_name),
   1490                                   SQLITE_UTF8,
   1491                                   (callable != Py_None) ? callable : NULL,
   1492                                   (callable != Py_None) ? pysqlite_collation_callback : NULL);
   1493     if (rc != SQLITE_OK) {
   1494         PyDict_DelItem(self->collations, uppercase_name);
   1495         _pysqlite_seterror(self->db, NULL);
   1496         goto finally;
   1497     }
   1498 
   1499 finally:
   1500     Py_XDECREF(uppercase_name);
   1501 
   1502     if (PyErr_Occurred()) {
   1503         retval = NULL;
   1504     } else {
   1505         Py_INCREF(Py_None);
   1506         retval = Py_None;
   1507     }
   1508 
   1509     return retval;
   1510 }
   1511 
   1512 /* Called when the connection is used as a context manager. Returns itself as a
   1513  * convenience to the caller. */
   1514 static PyObject *
   1515 pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args)
   1516 {
   1517     Py_INCREF(self);
   1518     return (PyObject*)self;
   1519 }
   1520 
   1521 /** Called when the connection is used as a context manager. If there was any
   1522  * exception, a rollback takes place; otherwise we commit. */
   1523 static PyObject *
   1524 pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args)
   1525 {
   1526     PyObject* exc_type, *exc_value, *exc_tb;
   1527     char* method_name;
   1528     PyObject* result;
   1529 
   1530     if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) {
   1531         return NULL;
   1532     }
   1533 
   1534     if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) {
   1535         method_name = "commit";
   1536     } else {
   1537         method_name = "rollback";
   1538     }
   1539 
   1540     result = PyObject_CallMethod((PyObject*)self, method_name, "");
   1541     if (!result) {
   1542         return NULL;
   1543     }
   1544     Py_DECREF(result);
   1545 
   1546     Py_INCREF(Py_False);
   1547     return Py_False;
   1548 }
   1549 
   1550 static char connection_doc[] =
   1551 PyDoc_STR("SQLite database connection object.");
   1552 
   1553 static PyGetSetDef connection_getset[] = {
   1554     {"isolation_level",  (getter)pysqlite_connection_get_isolation_level, (setter)pysqlite_connection_set_isolation_level},
   1555     {"total_changes",  (getter)pysqlite_connection_get_total_changes, (setter)0},
   1556     {NULL}
   1557 };
   1558 
   1559 static PyMethodDef connection_methods[] = {
   1560     {"cursor", (PyCFunction)pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS,
   1561         PyDoc_STR("Return a cursor for the connection.")},
   1562     {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS,
   1563         PyDoc_STR("Closes the connection.")},
   1564     {"commit", (PyCFunction)pysqlite_connection_commit, METH_NOARGS,
   1565         PyDoc_STR("Commit the current transaction.")},
   1566     {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS,
   1567         PyDoc_STR("Roll back the current transaction.")},
   1568     {"create_function", (PyCFunction)pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS,
   1569         PyDoc_STR("Creates a new function. Non-standard.")},
   1570     {"create_aggregate", (PyCFunction)pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS,
   1571         PyDoc_STR("Creates a new aggregate. Non-standard.")},
   1572     {"set_authorizer", (PyCFunction)pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS,
   1573         PyDoc_STR("Sets authorizer callback. Non-standard.")},
   1574     #ifdef HAVE_LOAD_EXTENSION
   1575     {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS,
   1576         PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")},
   1577     {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS,
   1578         PyDoc_STR("Load SQLite extension module. Non-standard.")},
   1579     #endif
   1580     {"set_progress_handler", (PyCFunction)pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS,
   1581         PyDoc_STR("Sets progress handler callback. Non-standard.")},
   1582     {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS,
   1583         PyDoc_STR("Executes a SQL statement. Non-standard.")},
   1584     {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS,
   1585         PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")},
   1586     {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS,
   1587         PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
   1588     {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS,
   1589         PyDoc_STR("Creates a collation function. Non-standard.")},
   1590     {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
   1591         PyDoc_STR("Abort any pending database operation. Non-standard.")},
   1592     {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
   1593         PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")},
   1594     {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
   1595         PyDoc_STR("For context manager. Non-standard.")},
   1596     {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,
   1597         PyDoc_STR("For context manager. Non-standard.")},
   1598     {NULL, NULL}
   1599 };
   1600 
   1601 static struct PyMemberDef connection_members[] =
   1602 {
   1603     {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), RO},
   1604     {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), RO},
   1605     {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), RO},
   1606     {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), RO},
   1607     {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), RO},
   1608     {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), RO},
   1609     {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), RO},
   1610     {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), RO},
   1611     {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), RO},
   1612     {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), RO},
   1613     {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)},
   1614     {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)},
   1615     {NULL}
   1616 };
   1617 
   1618 PyTypeObject pysqlite_ConnectionType = {
   1619         PyVarObject_HEAD_INIT(NULL, 0)
   1620         MODULE_NAME ".Connection",                      /* tp_name */
   1621         sizeof(pysqlite_Connection),                    /* tp_basicsize */
   1622         0,                                              /* tp_itemsize */
   1623         (destructor)pysqlite_connection_dealloc,        /* tp_dealloc */
   1624         0,                                              /* tp_print */
   1625         0,                                              /* tp_getattr */
   1626         0,                                              /* tp_setattr */
   1627         0,                                              /* tp_compare */
   1628         0,                                              /* tp_repr */
   1629         0,                                              /* tp_as_number */
   1630         0,                                              /* tp_as_sequence */
   1631         0,                                              /* tp_as_mapping */
   1632         0,                                              /* tp_hash */
   1633         (ternaryfunc)pysqlite_connection_call,          /* tp_call */
   1634         0,                                              /* tp_str */
   1635         0,                                              /* tp_getattro */
   1636         0,                                              /* tp_setattro */
   1637         0,                                              /* tp_as_buffer */
   1638         Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,         /* tp_flags */
   1639         connection_doc,                                 /* tp_doc */
   1640         0,                                              /* tp_traverse */
   1641         0,                                              /* tp_clear */
   1642         0,                                              /* tp_richcompare */
   1643         0,                                              /* tp_weaklistoffset */
   1644         0,                                              /* tp_iter */
   1645         0,                                              /* tp_iternext */
   1646         connection_methods,                             /* tp_methods */
   1647         connection_members,                             /* tp_members */
   1648         connection_getset,                              /* tp_getset */
   1649         0,                                              /* tp_base */
   1650         0,                                              /* tp_dict */
   1651         0,                                              /* tp_descr_get */
   1652         0,                                              /* tp_descr_set */
   1653         0,                                              /* tp_dictoffset */
   1654         (initproc)pysqlite_connection_init,             /* tp_init */
   1655         0,                                              /* tp_alloc */
   1656         0,                                              /* tp_new */
   1657         0                                               /* tp_free */
   1658 };
   1659 
   1660 extern int pysqlite_connection_setup_types(void)
   1661 {
   1662     pysqlite_ConnectionType.tp_new = PyType_GenericNew;
   1663     return PyType_Ready(&pysqlite_ConnectionType);
   1664 }
   1665