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