Skip to content

bpo-42064: Convert sqlite3 global state to module state #29073

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions Modules/_sqlite/clinic/cursor.c.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,25 +279,14 @@ PyDoc_STRVAR(pysqlite_cursor_close__doc__,
"Closes the cursor.");

#define PYSQLITE_CURSOR_CLOSE_METHODDEF \
{"close", (PyCFunction)(void(*)(void))pysqlite_cursor_close, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_cursor_close__doc__},
{"close", (PyCFunction)pysqlite_cursor_close, METH_NOARGS, pysqlite_cursor_close__doc__},

static PyObject *
pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls);
pysqlite_cursor_close_impl(pysqlite_Cursor *self);

static PyObject *
pysqlite_cursor_close(pysqlite_Cursor *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
pysqlite_cursor_close(pysqlite_Cursor *self, PyObject *Py_UNUSED(ignored))
{
PyObject *return_value = NULL;
static const char * const _keywords[] = { NULL};
static _PyArg_Parser _parser = {":close", _keywords, 0};

if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser
)) {
goto exit;
}
return_value = pysqlite_cursor_close_impl(self, cls);

exit:
return return_value;
return pysqlite_cursor_close_impl(self);
}
/*[clinic end generated code: output=3b5328c1619b7626 input=a9049054013a1b77]*/
/*[clinic end generated code: output=514f6eb4e4974671 input=a9049054013a1b77]*/
5 changes: 3 additions & 2 deletions Modules/_sqlite/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ clinic_fsconverter(PyObject *pathlike, const char **result)
return 0;
}

#define clinic_state() (pysqlite_get_state(NULL))
#define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self)))
#include "clinic/connection.c.h"
#undef clinic_state

Expand Down Expand Up @@ -416,7 +416,8 @@ pysqlite_connection_close_impl(pysqlite_Connection *self)
}

if (!self->initialized) {
pysqlite_state *state = pysqlite_get_state(NULL);
PyTypeObject *tp = Py_TYPE(self);
pysqlite_state *state = pysqlite_get_state_by_type(tp);
PyErr_SetString(state->ProgrammingError,
"Base Connection.__init__ not called.");
return NULL;
Expand Down
11 changes: 5 additions & 6 deletions Modules/_sqlite/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "module.h"
#include "util.h"

#define clinic_state() (pysqlite_get_state(NULL))
#define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self)))
#include "clinic/cursor.c.h"
#undef clinic_state

Expand Down Expand Up @@ -966,17 +966,16 @@ pysqlite_cursor_setoutputsize_impl(pysqlite_Cursor *self, PyObject *size,
/*[clinic input]
_sqlite3.Cursor.close as pysqlite_cursor_close

cls: defining_class

Closes the cursor.
[clinic start generated code]*/

static PyObject *
pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls)
/*[clinic end generated code: output=a08ab3d772f45438 input=28ba9b532ab46ba0]*/
pysqlite_cursor_close_impl(pysqlite_Cursor *self)
/*[clinic end generated code: output=b6055e4ec6fe63b6 input=08b36552dbb9a986]*/
{
if (!self->connection) {
pysqlite_state *state = pysqlite_get_state_by_cls(cls);
PyTypeObject *tp = Py_TYPE(self);
pysqlite_state *state = pysqlite_get_state_by_type(tp);
PyErr_SetString(state->ProgrammingError,
"Base Cursor.__init__ not called.");
return NULL;
Expand Down
4 changes: 2 additions & 2 deletions Modules/_sqlite/microprotocols.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ pysqlite_microprotocols_init(PyObject *module)
/* pysqlite_microprotocols_add - add a reverse type-caster to the dictionary */

int
pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
pysqlite_microprotocols_add(pysqlite_state *state, PyTypeObject *type,
PyObject *proto, PyObject *cast)
{
PyObject* key;
int rc;
Expand All @@ -61,7 +62,6 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
return -1;
}

pysqlite_state *state = pysqlite_get_state(NULL);
rc = PyDict_SetItem(state->psyco_adapters, key, cast);
Py_DECREF(key);

Expand Down
5 changes: 3 additions & 2 deletions Modules/_sqlite/microprotocols.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@

/* used by module.c to init the microprotocols system */
extern int pysqlite_microprotocols_init(PyObject *module);
extern int pysqlite_microprotocols_add(
PyTypeObject *type, PyObject *proto, PyObject *cast);
extern int pysqlite_microprotocols_add(pysqlite_state *state,
PyTypeObject *type, PyObject *proto,
PyObject *cast);
extern PyObject *pysqlite_microprotocols_adapt(pysqlite_state *state,
PyObject *obj, PyObject *proto,
PyObject *alt);
Expand Down
21 changes: 7 additions & 14 deletions Modules/_sqlite/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#error "SQLite 3.7.15 or higher required"
#endif

#define clinic_state() (pysqlite_get_state(NULL))
#define clinic_state() (pysqlite_get_state(module))
#include "clinic/module.c.h"
#undef clinic_state

Expand All @@ -41,8 +41,6 @@ module _sqlite3
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/

pysqlite_state pysqlite_global_state;

// NOTE: This must equal sqlite3.Connection.__init__ argument spec!
/*[clinic input]
_sqlite3.connect as pysqlite_connect
Expand Down Expand Up @@ -160,7 +158,7 @@ pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type,

pysqlite_state *state = pysqlite_get_state(module);
PyObject *protocol = (PyObject *)state->PrepareProtocolType;
rc = pysqlite_microprotocols_add(type, protocol, caster);
rc = pysqlite_microprotocols_add(state, type, protocol, caster);
if (rc == -1) {
return NULL;
}
Expand Down Expand Up @@ -395,16 +393,11 @@ static int add_integer_constants(PyObject *module) {
return ret;
}

static struct PyModuleDef _sqlite3module = {
PyModuleDef_HEAD_INIT,
"_sqlite3",
NULL,
-1,
module_methods,
NULL,
NULL,
NULL,
NULL
struct PyModuleDef _sqlite3module = {
.m_base = PyModuleDef_HEAD_INIT,
.m_name = "_sqlite3",
.m_size = sizeof(pysqlite_state),
.m_methods = module_methods,
};

#define ADD_TYPE(module, type) \
Expand Down
20 changes: 9 additions & 11 deletions Modules/_sqlite/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,20 @@ typedef struct {
extern pysqlite_state pysqlite_global_state;

static inline pysqlite_state *
pysqlite_get_state(PyObject *Py_UNUSED(module))
pysqlite_get_state(PyObject *module)
{
return &pysqlite_global_state; // Replace with PyModule_GetState
pysqlite_state *state = (pysqlite_state *)PyModule_GetState(module);
assert(state != NULL);
return state;
}

extern struct PyModuleDef _sqlite3module;
static inline pysqlite_state *
pysqlite_get_state_by_cls(PyTypeObject *Py_UNUSED(cls))
pysqlite_get_state_by_type(PyTypeObject *tp)
{
return &pysqlite_global_state; // Replace with PyType_GetModuleState
}

static inline pysqlite_state *
pysqlite_get_state_by_type(PyTypeObject *Py_UNUSED(tp))
{
// Replace with _PyType_GetModuleByDef & PyModule_GetState
return &pysqlite_global_state;
PyObject *module = _PyType_GetModuleByDef(tp, &_sqlite3module);
assert(module != NULL);
return pysqlite_get_state(module);
}

extern const char *pysqlite_error_name(int rc);
Expand Down
4 changes: 2 additions & 2 deletions Modules/_sqlite/row.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "row.h"
#include "cursor.h"

#define clinic_state() (pysqlite_get_state(NULL))
#define clinic_state() (pysqlite_get_state_by_type(type))
#include "clinic/row.c.h"
#undef clinic_state

Expand Down Expand Up @@ -219,7 +219,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
if (opid != Py_EQ && opid != Py_NE)
Py_RETURN_NOTIMPLEMENTED;

pysqlite_state *state = pysqlite_get_state_by_cls(Py_TYPE(self));
pysqlite_state *state = pysqlite_get_state_by_type(Py_TYPE(self));
if (PyObject_TypeCheck(_other, state->RowType)) {
pysqlite_Row *other = (pysqlite_Row *)_other;
int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);
Expand Down