With this, all sqlite3 static globals have been moved to the global state.
There are a couple of global static strings left, but there should be no need for adding them to the state.
https://bugs.python.org/issue42064
Py_DECREF(py_retval);
}
if (!ok) {
- if (_pysqlite_enable_callback_tracebacks) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
sqlite3_result_error(context, "user-defined function raised exception", -1);
if (PyErr_Occurred()) {
*aggregate_instance = 0;
- if (_pysqlite_enable_callback_tracebacks) {
+
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
sqlite3_result_error(context, "user-defined aggregate's '__init__' method raised error", -1);
Py_DECREF(args);
if (!function_result) {
- if (_pysqlite_enable_callback_tracebacks) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
sqlite3_result_error(context, "user-defined aggregate's 'step' method raised error", -1);
Py_DECREF(function_result);
}
if (!ok) {
- if (_pysqlite_enable_callback_tracebacks) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
if (ret == NULL) {
- if (_pysqlite_enable_callback_tracebacks)
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- else
+ }
+ else {
PyErr_Clear();
+ }
rc = SQLITE_DENY;
}
if (PyLong_Check(ret)) {
rc = _PyLong_AsInt(ret);
if (rc == -1 && PyErr_Occurred()) {
- if (_pysqlite_enable_callback_tracebacks)
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- else
+ }
+ else {
PyErr_Clear();
+ }
rc = SQLITE_DENY;
}
}
ret = _PyObject_CallNoArg((PyObject*)user_arg);
if (!ret) {
- if (_pysqlite_enable_callback_tracebacks) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
if (ret) {
Py_DECREF(ret);
} else {
- if (_pysqlite_enable_callback_tracebacks) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
- } else {
+ }
+ else {
PyErr_Clear();
}
}
return NULL;
}
- retval = PyDict_GetItemWithError(_pysqlite_converters, upcase_key);
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ retval = PyDict_GetItemWithError(state->converters, upcase_key);
Py_DECREF(upcase_key);
return retval;
static PyObject *
_pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument)
{
+ pysqlite_state *state = pysqlite_get_state(NULL);
PyObject* parameters_list = NULL;
PyObject* parameters_iter = NULL;
PyObject* parameters = NULL;
if (rc != SQLITE_DONE && rc != SQLITE_ROW) {
if (PyErr_Occurred()) {
/* there was an error that occurred in a user-defined callback */
- if (_pysqlite_enable_callback_tracebacks) {
+ if (state->enable_callback_tracebacks) {
PyErr_Print();
} else {
PyErr_Clear();
#include "microprotocols.h"
#include "prepare_protocol.h"
-/** the adapters registry **/
-
-static PyObject *psyco_adapters = NULL;
/* pysqlite_microprotocols_init - initialize the adapters dictionary */
pysqlite_microprotocols_init(PyObject *module)
{
/* create adapters dictionary and put it in module namespace */
- if ((psyco_adapters = PyDict_New()) == NULL) {
+ pysqlite_state *state = pysqlite_get_state(module);
+ state->psyco_adapters = PyDict_New();
+ if (state->psyco_adapters == NULL) {
return -1;
}
- int res = PyModule_AddObjectRef(module, "adapters", psyco_adapters);
- Py_DECREF(psyco_adapters);
-
- return res;
+ return PyModule_AddObjectRef(module, "adapters", state->psyco_adapters);
}
return -1;
}
- rc = PyDict_SetItem(psyco_adapters, key, cast);
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ rc = PyDict_SetItem(state->psyco_adapters, key, cast);
Py_DECREF(key);
return rc;
if (!key) {
return NULL;
}
- adapter = PyDict_GetItemWithError(psyco_adapters, key);
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ adapter = PyDict_GetItemWithError(state->psyco_adapters, key);
Py_DECREF(key);
if (adapter) {
Py_INCREF(adapter);
return Py_NewRef(alt);
}
/* else set the right exception and return NULL */
- pysqlite_state *state = pysqlite_get_state(NULL);
PyErr_SetString(state->ProgrammingError, "can't adapt");
return NULL;
}
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/
-/* static objects at module-level */
-PyObject* _pysqlite_converters = NULL;
-int _pysqlite_enable_callback_tracebacks = 0;
-int pysqlite_BaseTypeAdapted = 0;
-
pysqlite_state pysqlite_global_state;
// NOTE: This must equal sqlite3.Connection.__init__ argument spec!
* (99 % of all usages) */
if (type == &PyLong_Type || type == &PyFloat_Type
|| type == &PyUnicode_Type || type == &PyByteArray_Type) {
- pysqlite_BaseTypeAdapted = 1;
+ pysqlite_state *state = pysqlite_get_state(module);
+ state->BaseTypeAdapted = 1;
}
pysqlite_state *state = pysqlite_get_state(NULL);
goto error;
}
- if (PyDict_SetItem(_pysqlite_converters, name, callable) != 0) {
+ pysqlite_state *state = pysqlite_get_state(module);
+ if (PyDict_SetItem(state->converters, name, callable) != 0) {
goto error;
}
pysqlite_enable_callback_trace_impl(PyObject *module, int enable)
/*[clinic end generated code: output=4ff1d051c698f194 input=cb79d3581eb77c40]*/
{
- _pysqlite_enable_callback_tracebacks = enable;
+ pysqlite_state *state = pysqlite_get_state(module);
+ state->enable_callback_tracebacks = enable;
Py_RETURN_NONE;
}
static int converters_init(PyObject* module)
{
- _pysqlite_converters = PyDict_New();
- if (!_pysqlite_converters) {
+ pysqlite_state *state = pysqlite_get_state(module);
+ state->converters = PyDict_New();
+ if (state->converters == NULL) {
return -1;
}
- int res = PyModule_AddObjectRef(module, "converters", _pysqlite_converters);
- Py_DECREF(_pysqlite_converters);
-
- return res;
+ return PyModule_AddObjectRef(module, "converters", state->converters);
}
static int
PyObject *ProgrammingError;
PyObject *Warning;
+
+ /* A dictionary, mapping column types (INTEGER, VARCHAR, etc.) to converter
+ * functions, that convert the SQL value to the appropriate Python value.
+ * The key is uppercase.
+ */
+ PyObject *converters;
+
PyObject *lru_cache;
+ PyObject *psyco_adapters; // The adapters registry
+ int BaseTypeAdapted;
+ int enable_callback_tracebacks;
PyTypeObject *ConnectionType;
PyTypeObject *CursorType;
return &pysqlite_global_state;
}
-/* A dictionary, mapping column types (INTEGER, VARCHAR, etc.) to converter
- * functions, that convert the SQL value to the appropriate Python value.
- * The key is uppercase.
- */
-extern PyObject* _pysqlite_converters;
-
-extern int _pysqlite_enable_callback_tracebacks;
-extern int pysqlite_BaseTypeAdapted;
-
#define PARSE_DECLTYPES 1
#define PARSE_COLNAMES 2
#endif
/* returns 0 if the object is one of Python's internal ones that don't need to be adapted */
static int _need_adapt(PyObject* obj)
{
- if (pysqlite_BaseTypeAdapted) {
+ pysqlite_state *state = pysqlite_get_state(NULL);
+ if (state->BaseTypeAdapted) {
return 1;
}