Home | History | Annotate | Download | only in _sqlite
      1 /* module.c - the module itself
      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 "connection.h"
     25 #include "statement.h"
     26 #include "cursor.h"
     27 #include "cache.h"
     28 #include "prepare_protocol.h"
     29 #include "microprotocols.h"
     30 #include "row.h"
     31 
     32 #if SQLITE_VERSION_NUMBER >= 3003003
     33 #define HAVE_SHARED_CACHE
     34 #endif
     35 
     36 /* static objects at module-level */
     37 
     38 PyObject* pysqlite_Error, *pysqlite_Warning, *pysqlite_InterfaceError, *pysqlite_DatabaseError,
     39     *pysqlite_InternalError, *pysqlite_OperationalError, *pysqlite_ProgrammingError,
     40     *pysqlite_IntegrityError, *pysqlite_DataError, *pysqlite_NotSupportedError, *pysqlite_OptimizedUnicode;
     41 
     42 PyObject* converters;
     43 int _enable_callback_tracebacks;
     44 int pysqlite_BaseTypeAdapted;
     45 
     46 static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
     47         kwargs)
     48 {
     49     /* Python seems to have no way of extracting a single keyword-arg at
     50      * C-level, so this code is redundant with the one in connection_init in
     51      * connection.c and must always be copied from there ... */
     52 
     53     static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
     54     PyObject* database;
     55     int detect_types = 0;
     56     PyObject* isolation_level;
     57     PyObject* factory = NULL;
     58     int check_same_thread = 1;
     59     int cached_statements;
     60     double timeout = 5.0;
     61 
     62     PyObject* result;
     63 
     64     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist,
     65                                      &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
     66     {
     67         return NULL;
     68     }
     69 
     70     if (factory == NULL) {
     71         factory = (PyObject*)&pysqlite_ConnectionType;
     72     }
     73 
     74     result = PyObject_Call(factory, args, kwargs);
     75 
     76     return result;
     77 }
     78 
     79 PyDoc_STRVAR(module_connect_doc,
     80 "connect(database[, timeout, isolation_level, detect_types, factory])\n\
     81 \n\
     82 Opens a connection to the SQLite database file *database*. You can use\n\
     83 \":memory:\" to open a database connection to a database that resides in\n\
     84 RAM instead of on disk.");
     85 
     86 static PyObject* module_complete(PyObject* self, PyObject* args, PyObject*
     87         kwargs)
     88 {
     89     static char *kwlist[] = {"statement", NULL, NULL};
     90     char* statement;
     91 
     92     PyObject* result;
     93 
     94     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &statement))
     95     {
     96         return NULL;
     97     }
     98 
     99     if (sqlite3_complete(statement)) {
    100         result = Py_True;
    101     } else {
    102         result = Py_False;
    103     }
    104 
    105     Py_INCREF(result);
    106 
    107     return result;
    108 }
    109 
    110 PyDoc_STRVAR(module_complete_doc,
    111 "complete_statement(sql)\n\
    112 \n\
    113 Checks if a string contains a complete SQL statement. Non-standard.");
    114 
    115 #ifdef HAVE_SHARED_CACHE
    116 static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject*
    117         kwargs)
    118 {
    119     static char *kwlist[] = {"do_enable", NULL, NULL};
    120     int do_enable;
    121     int rc;
    122 
    123     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &do_enable))
    124     {
    125         return NULL;
    126     }
    127 
    128     rc = sqlite3_enable_shared_cache(do_enable);
    129 
    130     if (rc != SQLITE_OK) {
    131         PyErr_SetString(pysqlite_OperationalError, "Changing the shared_cache flag failed");
    132         return NULL;
    133     } else {
    134         Py_INCREF(Py_None);
    135         return Py_None;
    136     }
    137 }
    138 
    139 PyDoc_STRVAR(module_enable_shared_cache_doc,
    140 "enable_shared_cache(do_enable)\n\
    141 \n\
    142 Enable or disable shared cache mode for the calling thread.\n\
    143 Experimental/Non-standard.");
    144 #endif /* HAVE_SHARED_CACHE */
    145 
    146 static PyObject* module_register_adapter(PyObject* self, PyObject* args)
    147 {
    148     PyTypeObject* type;
    149     PyObject* caster;
    150     int rc;
    151 
    152     if (!PyArg_ParseTuple(args, "OO", &type, &caster)) {
    153         return NULL;
    154     }
    155 
    156     /* a basic type is adapted; there's a performance optimization if that's not the case
    157      * (99 % of all usages) */
    158     if (type == &PyInt_Type || type == &PyLong_Type || type == &PyFloat_Type
    159             || type == &PyString_Type || type == &PyUnicode_Type || type == &PyBuffer_Type) {
    160         pysqlite_BaseTypeAdapted = 1;
    161     }
    162 
    163     rc = pysqlite_microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
    164     if (rc == -1)
    165         return NULL;
    166 
    167     Py_INCREF(Py_None);
    168     return Py_None;
    169 }
    170 
    171 PyDoc_STRVAR(module_register_adapter_doc,
    172 "register_adapter(type, callable)\n\
    173 \n\
    174 Registers an adapter with pysqlite's adapter registry. Non-standard.");
    175 
    176 static PyObject* module_register_converter(PyObject* self, PyObject* args)
    177 {
    178     PyObject* orig_name;
    179     PyObject* name = NULL;
    180     PyObject* callable;
    181     PyObject* retval = NULL;
    182 
    183     if (!PyArg_ParseTuple(args, "SO", &orig_name, &callable)) {
    184         return NULL;
    185     }
    186 
    187     /* convert the name to upper case */
    188     name = PyObject_CallMethod(orig_name, "upper", "");
    189     if (!name) {
    190         goto error;
    191     }
    192 
    193     if (PyDict_SetItem(converters, name, callable) != 0) {
    194         goto error;
    195     }
    196 
    197     Py_INCREF(Py_None);
    198     retval = Py_None;
    199 error:
    200     Py_XDECREF(name);
    201     return retval;
    202 }
    203 
    204 PyDoc_STRVAR(module_register_converter_doc,
    205 "register_converter(typename, callable)\n\
    206 \n\
    207 Registers a converter with pysqlite. Non-standard.");
    208 
    209 static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args)
    210 {
    211     if (!PyArg_ParseTuple(args, "i", &_enable_callback_tracebacks)) {
    212         return NULL;
    213     }
    214 
    215     Py_INCREF(Py_None);
    216     return Py_None;
    217 }
    218 
    219 PyDoc_STRVAR(enable_callback_tracebacks_doc,
    220 "enable_callback_tracebacks(flag)\n\
    221 \n\
    222 Enable or disable callback functions throwing errors to stderr.");
    223 
    224 static void converters_init(PyObject* dict)
    225 {
    226     converters = PyDict_New();
    227     if (!converters) {
    228         return;
    229     }
    230 
    231     PyDict_SetItemString(dict, "converters", converters);
    232 }
    233 
    234 static PyMethodDef module_methods[] = {
    235     {"connect",  (PyCFunction)module_connect,
    236      METH_VARARGS | METH_KEYWORDS, module_connect_doc},
    237     {"complete_statement",  (PyCFunction)module_complete,
    238      METH_VARARGS | METH_KEYWORDS, module_complete_doc},
    239 #ifdef HAVE_SHARED_CACHE
    240     {"enable_shared_cache",  (PyCFunction)module_enable_shared_cache,
    241      METH_VARARGS | METH_KEYWORDS, module_enable_shared_cache_doc},
    242 #endif
    243     {"register_adapter", (PyCFunction)module_register_adapter,
    244      METH_VARARGS, module_register_adapter_doc},
    245     {"register_converter", (PyCFunction)module_register_converter,
    246      METH_VARARGS, module_register_converter_doc},
    247     {"adapt",  (PyCFunction)pysqlite_adapt, METH_VARARGS,
    248      pysqlite_adapt_doc},
    249     {"enable_callback_tracebacks",  (PyCFunction)enable_callback_tracebacks,
    250      METH_VARARGS, enable_callback_tracebacks_doc},
    251     {NULL, NULL}
    252 };
    253 
    254 struct _IntConstantPair {
    255     char* constant_name;
    256     int constant_value;
    257 };
    258 
    259 typedef struct _IntConstantPair IntConstantPair;
    260 
    261 static IntConstantPair _int_constants[] = {
    262     {"PARSE_DECLTYPES", PARSE_DECLTYPES},
    263     {"PARSE_COLNAMES", PARSE_COLNAMES},
    264 
    265     {"SQLITE_OK", SQLITE_OK},
    266     {"SQLITE_DENY", SQLITE_DENY},
    267     {"SQLITE_IGNORE", SQLITE_IGNORE},
    268     {"SQLITE_CREATE_INDEX", SQLITE_CREATE_INDEX},
    269     {"SQLITE_CREATE_TABLE", SQLITE_CREATE_TABLE},
    270     {"SQLITE_CREATE_TEMP_INDEX", SQLITE_CREATE_TEMP_INDEX},
    271     {"SQLITE_CREATE_TEMP_TABLE", SQLITE_CREATE_TEMP_TABLE},
    272     {"SQLITE_CREATE_TEMP_TRIGGER", SQLITE_CREATE_TEMP_TRIGGER},
    273     {"SQLITE_CREATE_TEMP_VIEW", SQLITE_CREATE_TEMP_VIEW},
    274     {"SQLITE_CREATE_TRIGGER", SQLITE_CREATE_TRIGGER},
    275     {"SQLITE_CREATE_VIEW", SQLITE_CREATE_VIEW},
    276     {"SQLITE_DELETE", SQLITE_DELETE},
    277     {"SQLITE_DROP_INDEX", SQLITE_DROP_INDEX},
    278     {"SQLITE_DROP_TABLE", SQLITE_DROP_TABLE},
    279     {"SQLITE_DROP_TEMP_INDEX", SQLITE_DROP_TEMP_INDEX},
    280     {"SQLITE_DROP_TEMP_TABLE", SQLITE_DROP_TEMP_TABLE},
    281     {"SQLITE_DROP_TEMP_TRIGGER", SQLITE_DROP_TEMP_TRIGGER},
    282     {"SQLITE_DROP_TEMP_VIEW", SQLITE_DROP_TEMP_VIEW},
    283     {"SQLITE_DROP_TRIGGER", SQLITE_DROP_TRIGGER},
    284     {"SQLITE_DROP_VIEW", SQLITE_DROP_VIEW},
    285     {"SQLITE_INSERT", SQLITE_INSERT},
    286     {"SQLITE_PRAGMA", SQLITE_PRAGMA},
    287     {"SQLITE_READ", SQLITE_READ},
    288     {"SQLITE_SELECT", SQLITE_SELECT},
    289     {"SQLITE_TRANSACTION", SQLITE_TRANSACTION},
    290     {"SQLITE_UPDATE", SQLITE_UPDATE},
    291     {"SQLITE_ATTACH", SQLITE_ATTACH},
    292     {"SQLITE_DETACH", SQLITE_DETACH},
    293 #if SQLITE_VERSION_NUMBER >= 3002001
    294     {"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE},
    295     {"SQLITE_REINDEX", SQLITE_REINDEX},
    296 #endif
    297 #if SQLITE_VERSION_NUMBER >= 3003000
    298     {"SQLITE_ANALYZE", SQLITE_ANALYZE},
    299 #endif
    300     {(char*)NULL, 0}
    301 };
    302 
    303 PyMODINIT_FUNC init_sqlite3(void)
    304 {
    305     PyObject *module, *dict;
    306     PyObject *tmp_obj;
    307     int i;
    308 
    309     module = Py_InitModule("_sqlite3", module_methods);
    310 
    311     if (!module ||
    312         (pysqlite_row_setup_types() < 0) ||
    313         (pysqlite_cursor_setup_types() < 0) ||
    314         (pysqlite_connection_setup_types() < 0) ||
    315         (pysqlite_cache_setup_types() < 0) ||
    316         (pysqlite_statement_setup_types() < 0) ||
    317         (pysqlite_prepare_protocol_setup_types() < 0)
    318        ) {
    319         return;
    320     }
    321 
    322     Py_INCREF(&pysqlite_ConnectionType);
    323     PyModule_AddObject(module, "Connection", (PyObject*) &pysqlite_ConnectionType);
    324     Py_INCREF(&pysqlite_CursorType);
    325     PyModule_AddObject(module, "Cursor", (PyObject*) &pysqlite_CursorType);
    326     Py_INCREF(&pysqlite_CacheType);
    327     PyModule_AddObject(module, "Statement", (PyObject*)&pysqlite_StatementType);
    328     Py_INCREF(&pysqlite_StatementType);
    329     PyModule_AddObject(module, "Cache", (PyObject*) &pysqlite_CacheType);
    330     Py_INCREF(&pysqlite_PrepareProtocolType);
    331     PyModule_AddObject(module, "PrepareProtocol", (PyObject*) &pysqlite_PrepareProtocolType);
    332     Py_INCREF(&pysqlite_RowType);
    333     PyModule_AddObject(module, "Row", (PyObject*) &pysqlite_RowType);
    334 
    335     if (!(dict = PyModule_GetDict(module))) {
    336         goto error;
    337     }
    338 
    339     /*** Create DB-API Exception hierarchy */
    340 
    341     if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_StandardError, NULL))) {
    342         goto error;
    343     }
    344     PyDict_SetItemString(dict, "Error", pysqlite_Error);
    345 
    346     if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_StandardError, NULL))) {
    347         goto error;
    348     }
    349     PyDict_SetItemString(dict, "Warning", pysqlite_Warning);
    350 
    351     /* Error subclasses */
    352 
    353     if (!(pysqlite_InterfaceError = PyErr_NewException(MODULE_NAME ".InterfaceError", pysqlite_Error, NULL))) {
    354         goto error;
    355     }
    356     PyDict_SetItemString(dict, "InterfaceError", pysqlite_InterfaceError);
    357 
    358     if (!(pysqlite_DatabaseError = PyErr_NewException(MODULE_NAME ".DatabaseError", pysqlite_Error, NULL))) {
    359         goto error;
    360     }
    361     PyDict_SetItemString(dict, "DatabaseError", pysqlite_DatabaseError);
    362 
    363     /* pysqlite_DatabaseError subclasses */
    364 
    365     if (!(pysqlite_InternalError = PyErr_NewException(MODULE_NAME ".InternalError", pysqlite_DatabaseError, NULL))) {
    366         goto error;
    367     }
    368     PyDict_SetItemString(dict, "InternalError", pysqlite_InternalError);
    369 
    370     if (!(pysqlite_OperationalError = PyErr_NewException(MODULE_NAME ".OperationalError", pysqlite_DatabaseError, NULL))) {
    371         goto error;
    372     }
    373     PyDict_SetItemString(dict, "OperationalError", pysqlite_OperationalError);
    374 
    375     if (!(pysqlite_ProgrammingError = PyErr_NewException(MODULE_NAME ".ProgrammingError", pysqlite_DatabaseError, NULL))) {
    376         goto error;
    377     }
    378     PyDict_SetItemString(dict, "ProgrammingError", pysqlite_ProgrammingError);
    379 
    380     if (!(pysqlite_IntegrityError = PyErr_NewException(MODULE_NAME ".IntegrityError", pysqlite_DatabaseError,NULL))) {
    381         goto error;
    382     }
    383     PyDict_SetItemString(dict, "IntegrityError", pysqlite_IntegrityError);
    384 
    385     if (!(pysqlite_DataError = PyErr_NewException(MODULE_NAME ".DataError", pysqlite_DatabaseError, NULL))) {
    386         goto error;
    387     }
    388     PyDict_SetItemString(dict, "DataError", pysqlite_DataError);
    389 
    390     if (!(pysqlite_NotSupportedError = PyErr_NewException(MODULE_NAME ".NotSupportedError", pysqlite_DatabaseError, NULL))) {
    391         goto error;
    392     }
    393     PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError);
    394 
    395     /* We just need "something" unique for pysqlite_OptimizedUnicode. It does not really
    396      * need to be a string subclass. Just anything that can act as a special
    397      * marker for us. So I pulled PyCell_Type out of my magic hat.
    398      */
    399     Py_INCREF((PyObject*)&PyCell_Type);
    400     pysqlite_OptimizedUnicode = (PyObject*)&PyCell_Type;
    401     PyDict_SetItemString(dict, "OptimizedUnicode", pysqlite_OptimizedUnicode);
    402 
    403     /* Set integer constants */
    404     for (i = 0; _int_constants[i].constant_name != 0; i++) {
    405         tmp_obj = PyInt_FromLong(_int_constants[i].constant_value);
    406         if (!tmp_obj) {
    407             goto error;
    408         }
    409         PyDict_SetItemString(dict, _int_constants[i].constant_name, tmp_obj);
    410         Py_DECREF(tmp_obj);
    411     }
    412 
    413     if (!(tmp_obj = PyString_FromString(PYSQLITE_VERSION))) {
    414         goto error;
    415     }
    416     PyDict_SetItemString(dict, "version", tmp_obj);
    417     Py_DECREF(tmp_obj);
    418 
    419     if (!(tmp_obj = PyString_FromString(sqlite3_libversion()))) {
    420         goto error;
    421     }
    422     PyDict_SetItemString(dict, "sqlite_version", tmp_obj);
    423     Py_DECREF(tmp_obj);
    424 
    425     /* initialize microprotocols layer */
    426     pysqlite_microprotocols_init(dict);
    427 
    428     /* initialize the default converters */
    429     converters_init(dict);
    430 
    431     _enable_callback_tracebacks = 0;
    432 
    433     pysqlite_BaseTypeAdapted = 0;
    434 
    435     /* Original comment from _bsddb.c in the Python core. This is also still
    436      * needed nowadays for Python 2.3/2.4.
    437      *
    438      * PyEval_InitThreads is called here due to a quirk in python 1.5
    439      * - 2.2.1 (at least) according to Russell Williamson <merel (at) wt.net>:
    440      * The global interpreter lock is not initialized until the first
    441      * thread is created using thread.start_new_thread() or fork() is
    442      * called.  that would cause the ALLOW_THREADS here to segfault due
    443      * to a null pointer reference if no threads or child processes
    444      * have been created.  This works around that and is a no-op if
    445      * threads have already been initialized.
    446      *  (see pybsddb-users mailing list post on 2002-08-07)
    447      */
    448 #ifdef WITH_THREAD
    449     PyEval_InitThreads();
    450 #endif
    451 
    452 error:
    453     if (PyErr_Occurred())
    454     {
    455         PyErr_SetString(PyExc_ImportError, MODULE_NAME ": init failed");
    456     }
    457 }
    458