bpo-42064: Finalise establishing sqlite3 global state (GH-27155)

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
This commit is contained in:
Erlend Egeberg Aasland 2021-07-20 12:59:18 +02:00 committed by GitHub
parent 366fcbac18
commit 4c0deb25ac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 69 additions and 53 deletions

View file

@ -637,9 +637,11 @@ _pysqlite_func_callback(sqlite3_context *context, int argc, sqlite3_value **argv
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);
@ -669,9 +671,12 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_
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);
@ -693,9 +698,11 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_
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);
@ -746,9 +753,11 @@ _pysqlite_final_callback(sqlite3_context *context)
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);
@ -941,10 +950,13 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co
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;
}
@ -952,10 +964,13 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co
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;
}
}
@ -979,9 +994,11 @@ static int _progress_handler(void* user_arg)
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();
}
@ -1030,9 +1047,11 @@ static void _trace_callback(void* user_arg, const char* statement_string)
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();
}
}

View file

@ -147,7 +147,8 @@ _pysqlite_get_converter(const char *keystr, Py_ssize_t keylen)
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;
@ -469,6 +470,7 @@ get_statement_from_cache(pysqlite_Cursor *self, PyObject *operation)
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;
@ -583,7 +585,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
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();

View file

@ -29,9 +29,6 @@
#include "microprotocols.h"
#include "prepare_protocol.h"
/** the adapters registry **/
static PyObject *psyco_adapters = NULL;
/* pysqlite_microprotocols_init - initialize the adapters dictionary */
@ -39,14 +36,13 @@ int
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);
}
@ -65,7 +61,8 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
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;
@ -89,7 +86,8 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
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);
@ -143,7 +141,6 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
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;
}

View file

@ -41,11 +41,6 @@ module _sqlite3
[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!
@ -159,7 +154,8 @@ pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type,
* (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);
@ -197,7 +193,8 @@ pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name,
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;
}
@ -220,7 +217,8 @@ static PyObject *
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;
}
@ -246,15 +244,13 @@ pysqlite_adapt_impl(PyObject *module, PyObject *obj, PyObject *proto,
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

View file

@ -41,7 +41,17 @@ typedef struct {
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;
@ -58,15 +68,6 @@ pysqlite_get_state(PyObject *Py_UNUSED(module))
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

View file

@ -211,7 +211,8 @@ int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObjec
/* 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;
}