• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* module.c - the module itself
2  *
3  * Copyright (C) 2004-2010 Gerhard H�ring <gh@ghaering.de>
4  *
5  * This file is part of pysqlite.
6  *
7  * This software is provided 'as-is', without any express or implied
8  * warranty.  In no event will the authors be held liable for any damages
9  * arising from the use of this software.
10  *
11  * Permission is granted to anyone to use this software for any purpose,
12  * including commercial applications, and to alter it and redistribute it
13  * freely, subject to the following restrictions:
14  *
15  * 1. The origin of this software must not be misrepresented; you must not
16  *    claim that you wrote the original software. If you use this software
17  *    in a product, an acknowledgment in the product documentation would be
18  *    appreciated but is not required.
19  * 2. Altered source versions must be plainly marked as such, and must not be
20  *    misrepresented as being the original software.
21  * 3. This notice may not be removed or altered from any source distribution.
22  */
23 
24 #include "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 
module_connect(PyObject * self,PyObject * args,PyObject * kwargs)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 
module_complete(PyObject * self,PyObject * args,PyObject * kwargs)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
module_enable_shared_cache(PyObject * self,PyObject * args,PyObject * kwargs)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 
module_register_adapter(PyObject * self,PyObject * args)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 
module_register_converter(PyObject * self,PyObject * args)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 
enable_callback_tracebacks(PyObject * self,PyObject * args)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 
converters_init(PyObject * dict)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 
init_sqlite3(void)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@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