mirror of
https://github.com/python/cpython.git
synced 2025-12-10 11:00:14 +00:00
bpo-42064: Convert sqlite3 global state to module state (GH-29073)
This commit is contained in:
parent
82a662e521
commit
8f24b7dbcb
8 changed files with 36 additions and 55 deletions
|
|
@ -279,25 +279,14 @@ PyDoc_STRVAR(pysqlite_cursor_close__doc__,
|
||||||
"Closes the cursor.");
|
"Closes the cursor.");
|
||||||
|
|
||||||
#define PYSQLITE_CURSOR_CLOSE_METHODDEF \
|
#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 *
|
static PyObject *
|
||||||
pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls);
|
pysqlite_cursor_close_impl(pysqlite_Cursor *self);
|
||||||
|
|
||||||
static PyObject *
|
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;
|
return pysqlite_cursor_close_impl(self);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=3b5328c1619b7626 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=514f6eb4e4974671 input=a9049054013a1b77]*/
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ error:
|
||||||
return 0;
|
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"
|
#include "clinic/connection.c.h"
|
||||||
#undef clinic_state
|
#undef clinic_state
|
||||||
|
|
||||||
|
|
@ -416,7 +416,8 @@ pysqlite_connection_close_impl(pysqlite_Connection *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self->initialized) {
|
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,
|
PyErr_SetString(state->ProgrammingError,
|
||||||
"Base Connection.__init__ not called.");
|
"Base Connection.__init__ not called.");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "util.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"
|
#include "clinic/cursor.c.h"
|
||||||
#undef clinic_state
|
#undef clinic_state
|
||||||
|
|
||||||
|
|
@ -966,17 +966,16 @@ pysqlite_cursor_setoutputsize_impl(pysqlite_Cursor *self, PyObject *size,
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
_sqlite3.Cursor.close as pysqlite_cursor_close
|
_sqlite3.Cursor.close as pysqlite_cursor_close
|
||||||
|
|
||||||
cls: defining_class
|
|
||||||
|
|
||||||
Closes the cursor.
|
Closes the cursor.
|
||||||
[clinic start generated code]*/
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls)
|
pysqlite_cursor_close_impl(pysqlite_Cursor *self)
|
||||||
/*[clinic end generated code: output=a08ab3d772f45438 input=28ba9b532ab46ba0]*/
|
/*[clinic end generated code: output=b6055e4ec6fe63b6 input=08b36552dbb9a986]*/
|
||||||
{
|
{
|
||||||
if (!self->connection) {
|
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,
|
PyErr_SetString(state->ProgrammingError,
|
||||||
"Base Cursor.__init__ not called.");
|
"Base Cursor.__init__ not called.");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,8 @@ pysqlite_microprotocols_init(PyObject *module)
|
||||||
/* pysqlite_microprotocols_add - add a reverse type-caster to the dictionary */
|
/* pysqlite_microprotocols_add - add a reverse type-caster to the dictionary */
|
||||||
|
|
||||||
int
|
int
|
||||||
pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
|
pysqlite_microprotocols_add(pysqlite_state *state, PyTypeObject *type,
|
||||||
|
PyObject *proto, PyObject *cast)
|
||||||
{
|
{
|
||||||
PyObject* key;
|
PyObject* key;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
@ -61,7 +62,6 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pysqlite_state *state = pysqlite_get_state(NULL);
|
|
||||||
rc = PyDict_SetItem(state->psyco_adapters, key, cast);
|
rc = PyDict_SetItem(state->psyco_adapters, key, cast);
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,9 @@
|
||||||
|
|
||||||
/* used by module.c to init the microprotocols system */
|
/* used by module.c to init the microprotocols system */
|
||||||
extern int pysqlite_microprotocols_init(PyObject *module);
|
extern int pysqlite_microprotocols_init(PyObject *module);
|
||||||
extern int pysqlite_microprotocols_add(
|
extern int pysqlite_microprotocols_add(pysqlite_state *state,
|
||||||
PyTypeObject *type, PyObject *proto, PyObject *cast);
|
PyTypeObject *type, PyObject *proto,
|
||||||
|
PyObject *cast);
|
||||||
extern PyObject *pysqlite_microprotocols_adapt(pysqlite_state *state,
|
extern PyObject *pysqlite_microprotocols_adapt(pysqlite_state *state,
|
||||||
PyObject *obj, PyObject *proto,
|
PyObject *obj, PyObject *proto,
|
||||||
PyObject *alt);
|
PyObject *alt);
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
#error "SQLite 3.7.15 or higher required"
|
#error "SQLite 3.7.15 or higher required"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define clinic_state() (pysqlite_get_state(NULL))
|
#define clinic_state() (pysqlite_get_state(module))
|
||||||
#include "clinic/module.c.h"
|
#include "clinic/module.c.h"
|
||||||
#undef clinic_state
|
#undef clinic_state
|
||||||
|
|
||||||
|
|
@ -41,8 +41,6 @@ module _sqlite3
|
||||||
[clinic start generated code]*/
|
[clinic start generated code]*/
|
||||||
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/
|
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/
|
||||||
|
|
||||||
pysqlite_state pysqlite_global_state;
|
|
||||||
|
|
||||||
// NOTE: This must equal sqlite3.Connection.__init__ argument spec!
|
// NOTE: This must equal sqlite3.Connection.__init__ argument spec!
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
_sqlite3.connect as pysqlite_connect
|
_sqlite3.connect as pysqlite_connect
|
||||||
|
|
@ -160,7 +158,7 @@ pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type,
|
||||||
|
|
||||||
pysqlite_state *state = pysqlite_get_state(module);
|
pysqlite_state *state = pysqlite_get_state(module);
|
||||||
PyObject *protocol = (PyObject *)state->PrepareProtocolType;
|
PyObject *protocol = (PyObject *)state->PrepareProtocolType;
|
||||||
rc = pysqlite_microprotocols_add(type, protocol, caster);
|
rc = pysqlite_microprotocols_add(state, type, protocol, caster);
|
||||||
if (rc == -1) {
|
if (rc == -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -395,16 +393,11 @@ static int add_integer_constants(PyObject *module) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct PyModuleDef _sqlite3module = {
|
struct PyModuleDef _sqlite3module = {
|
||||||
PyModuleDef_HEAD_INIT,
|
.m_base = PyModuleDef_HEAD_INIT,
|
||||||
"_sqlite3",
|
.m_name = "_sqlite3",
|
||||||
NULL,
|
.m_size = sizeof(pysqlite_state),
|
||||||
-1,
|
.m_methods = module_methods,
|
||||||
module_methods,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ADD_TYPE(module, type) \
|
#define ADD_TYPE(module, type) \
|
||||||
|
|
|
||||||
|
|
@ -63,22 +63,20 @@ typedef struct {
|
||||||
extern pysqlite_state pysqlite_global_state;
|
extern pysqlite_state pysqlite_global_state;
|
||||||
|
|
||||||
static inline pysqlite_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 *
|
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
|
PyObject *module = _PyType_GetModuleByDef(tp, &_sqlite3module);
|
||||||
}
|
assert(module != NULL);
|
||||||
|
return pysqlite_get_state(module);
|
||||||
static inline pysqlite_state *
|
|
||||||
pysqlite_get_state_by_type(PyTypeObject *Py_UNUSED(tp))
|
|
||||||
{
|
|
||||||
// Replace with _PyType_GetModuleByDef & PyModule_GetState
|
|
||||||
return &pysqlite_global_state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const char *pysqlite_error_name(int rc);
|
extern const char *pysqlite_error_name(int rc);
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
#include "row.h"
|
#include "row.h"
|
||||||
#include "cursor.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"
|
#include "clinic/row.c.h"
|
||||||
#undef clinic_state
|
#undef clinic_state
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
|
||||||
if (opid != Py_EQ && opid != Py_NE)
|
if (opid != Py_EQ && opid != Py_NE)
|
||||||
Py_RETURN_NOTIMPLEMENTED;
|
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)) {
|
if (PyObject_TypeCheck(_other, state->RowType)) {
|
||||||
pysqlite_Row *other = (pysqlite_Row *)_other;
|
pysqlite_Row *other = (pysqlite_Row *)_other;
|
||||||
int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);
|
int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue