summaryrefslogtreecommitdiff
path: root/Modules/_sqlite
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2020-10-19 15:50:36 +0100
committerGitHub <noreply@github.com>2020-10-19 15:50:36 +0100
commitc82f10450c547eb94a04ee17b7c816ff31948297 (patch)
treead305c05c5745e1a5e7c136545bec7eefa741e32 /Modules/_sqlite
parenteee6bb50c69d94280f43b47390ea9d1b5f42930c (diff)
parentb580ed1d9d55461d8dde027411b90be26cae131e (diff)
downloadcpython-git-bpo-39107.tar.gz
Merge branch 'master' into bpo-39107bpo-39107
Diffstat (limited to 'Modules/_sqlite')
-rw-r--r--Modules/_sqlite/cache.c137
-rw-r--r--Modules/_sqlite/cache.h6
-rw-r--r--Modules/_sqlite/connection.c84
-rw-r--r--Modules/_sqlite/connection.h4
-rw-r--r--Modules/_sqlite/cursor.c78
-rw-r--r--Modules/_sqlite/cursor.h4
-rw-r--r--Modules/_sqlite/microprotocols.c13
-rw-r--r--Modules/_sqlite/microprotocols.h2
-rw-r--r--Modules/_sqlite/module.c234
-rw-r--r--Modules/_sqlite/prepare_protocol.c69
-rw-r--r--Modules/_sqlite/prepare_protocol.h4
-rw-r--r--Modules/_sqlite/row.c96
-rw-r--r--Modules/_sqlite/row.h4
-rw-r--r--Modules/_sqlite/statement.c75
-rw-r--r--Modules/_sqlite/statement.h4
15 files changed, 315 insertions, 499 deletions
diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c
index 758fc022f7..0b02be4f0b 100644
--- a/Modules/_sqlite/cache.c
+++ b/Modules/_sqlite/cache.c
@@ -29,7 +29,7 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data)
{
pysqlite_Node* node;
- node = (pysqlite_Node*) (pysqlite_NodeType.tp_alloc(&pysqlite_NodeType, 0));
+ node = (pysqlite_Node*) (pysqlite_NodeType->tp_alloc(pysqlite_NodeType, 0));
if (!node) {
return NULL;
}
@@ -48,10 +48,13 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data)
void pysqlite_node_dealloc(pysqlite_Node* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_DECREF(self->key);
Py_DECREF(self->data);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs)
@@ -88,6 +91,7 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs)
void pysqlite_cache_dealloc(pysqlite_Cache* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
pysqlite_Node* node;
pysqlite_Node* delete_node;
@@ -109,7 +113,8 @@ void pysqlite_cache_dealloc(pysqlite_Cache* self)
}
Py_DECREF(self->mapping);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key)
@@ -253,6 +258,20 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args)
Py_RETURN_NONE;
}
+static PyType_Slot pysqlite_NodeType_slots[] = {
+ {Py_tp_dealloc, pysqlite_node_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {0, NULL},
+};
+
+static PyType_Spec pysqlite_NodeType_spec = {
+ .name = MODULE_NAME ".Node",
+ .basicsize = sizeof(pysqlite_Node),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = pysqlite_NodeType_slots,
+};
+PyTypeObject *pysqlite_NodeType = NULL;
+
static PyMethodDef cache_methods[] = {
{"get", (PyCFunction)pysqlite_cache_get, METH_O,
PyDoc_STR("Gets an entry from the cache or calls the factory function to produce one.")},
@@ -261,102 +280,32 @@ static PyMethodDef cache_methods[] = {
{NULL, NULL}
};
-PyTypeObject pysqlite_NodeType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME "Node", /* tp_name */
- sizeof(pysqlite_Node), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_node_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot pysqlite_CacheType_slots[] = {
+ {Py_tp_dealloc, pysqlite_cache_dealloc},
+ {Py_tp_methods, cache_methods},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_cache_init},
+ {0, NULL},
};
-PyTypeObject pysqlite_CacheType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Cache", /* tp_name */
- sizeof(pysqlite_Cache), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_cache_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- cache_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_cache_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Spec pysqlite_CacheType_spec = {
+ .name = MODULE_NAME ".Cache",
+ .basicsize = sizeof(pysqlite_Cache),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = pysqlite_CacheType_slots,
};
+PyTypeObject *pysqlite_CacheType = NULL;
-extern int pysqlite_cache_setup_types(void)
+extern int pysqlite_cache_setup_types(PyObject *mod)
{
- int rc;
-
- pysqlite_NodeType.tp_new = PyType_GenericNew;
- pysqlite_CacheType.tp_new = PyType_GenericNew;
-
- rc = PyType_Ready(&pysqlite_NodeType);
- if (rc < 0) {
- return rc;
+ pysqlite_NodeType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_NodeType_spec, NULL);
+ if (pysqlite_NodeType == NULL) {
+ return -1;
}
- rc = PyType_Ready(&pysqlite_CacheType);
- return rc;
+ pysqlite_CacheType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_CacheType_spec, NULL);
+ if (pysqlite_CacheType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/cache.h b/Modules/_sqlite/cache.h
index 529010967c..0afdf7f09b 100644
--- a/Modules/_sqlite/cache.h
+++ b/Modules/_sqlite/cache.h
@@ -59,8 +59,8 @@ typedef struct
int decref_factory;
} pysqlite_Cache;
-extern PyTypeObject pysqlite_NodeType;
-extern PyTypeObject pysqlite_CacheType;
+extern PyTypeObject *pysqlite_NodeType;
+extern PyTypeObject *pysqlite_CacheType;
int pysqlite_node_init(pysqlite_Node* self, PyObject* args, PyObject* kwargs);
void pysqlite_node_dealloc(pysqlite_Node* self);
@@ -69,6 +69,6 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs);
void pysqlite_cache_dealloc(pysqlite_Cache* self);
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args);
-int pysqlite_cache_setup_types(void);
+int pysqlite_cache_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 81fc133537..69203f85e0 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -133,7 +133,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
}
Py_DECREF(isolation_level);
- self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements);
+ self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)pysqlite_CacheType, "Oi", self, cached_statements);
if (PyErr_Occurred()) {
return -1;
}
@@ -220,6 +220,8 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset
void pysqlite_connection_dealloc(pysqlite_Connection* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_XDECREF(self->statement_cache);
/* Clean up if user has not called .close() explicitly. */
@@ -236,7 +238,9 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self)
Py_XDECREF(self->collations);
Py_XDECREF(self->statements);
Py_XDECREF(self->cursors);
- Py_TYPE(self)->tp_free((PyObject*)self);
+
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
/*
@@ -281,13 +285,13 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,
}
if (factory == NULL) {
- factory = (PyObject*)&pysqlite_CursorType;
+ factory = (PyObject*)pysqlite_CursorType;
}
cursor = PyObject_CallOneArg(factory, (PyObject *)self);
if (cursor == NULL)
return NULL;
- if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) {
+ if (!PyObject_TypeCheck(cursor, pysqlite_CursorType)) {
PyErr_Format(PyExc_TypeError,
"factory must return a cursor, not %.100s",
Py_TYPE(cursor)->tp_name);
@@ -1234,7 +1238,7 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py
_pysqlite_drop_unused_statement_references(self);
- statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
+ statement = PyObject_New(pysqlite_Statement, pysqlite_StatementType);
if (!statement) {
return NULL;
}
@@ -1494,7 +1498,7 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject *
static char *keywords[] = {"target", "pages", "progress", "name", "sleep", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|$iOsO:backup", keywords,
- &pysqlite_ConnectionType, &target,
+ pysqlite_ConnectionType, &target,
&pages, &progress, &name, &sleep_obj)) {
return NULL;
}
@@ -1831,50 +1835,32 @@ static struct PyMemberDef connection_members[] =
{NULL}
};
-PyTypeObject pysqlite_ConnectionType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Connection", /* tp_name */
- sizeof(pysqlite_Connection), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_connection_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- (ternaryfunc)pysqlite_connection_call, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- connection_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- connection_methods, /* tp_methods */
- connection_members, /* tp_members */
- connection_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_connection_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot connection_slots[] = {
+ {Py_tp_dealloc, pysqlite_connection_dealloc},
+ {Py_tp_doc, (void *)connection_doc},
+ {Py_tp_methods, connection_methods},
+ {Py_tp_members, connection_members},
+ {Py_tp_getset, connection_getset},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_connection_init},
+ {Py_tp_call, pysqlite_connection_call},
+ {0, NULL},
+};
+
+static PyType_Spec connection_spec = {
+ .name = MODULE_NAME ".Connection",
+ .basicsize = sizeof(pysqlite_Connection),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = connection_slots,
};
-extern int pysqlite_connection_setup_types(void)
+PyTypeObject *pysqlite_ConnectionType = NULL;
+
+extern int pysqlite_connection_setup_types(PyObject *module)
{
- pysqlite_ConnectionType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_ConnectionType);
+ pysqlite_ConnectionType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &connection_spec, NULL);
+ if (pysqlite_ConnectionType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h
index 206085e00a..aadf439034 100644
--- a/Modules/_sqlite/connection.h
+++ b/Modules/_sqlite/connection.h
@@ -106,7 +106,7 @@ typedef struct
PyObject* NotSupportedError;
} pysqlite_Connection;
-extern PyTypeObject pysqlite_ConnectionType;
+extern PyTypeObject *pysqlite_ConnectionType;
PyObject* pysqlite_connection_alloc(PyTypeObject* type, int aware);
void pysqlite_connection_dealloc(pysqlite_Connection* self);
@@ -122,6 +122,6 @@ int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObjec
int pysqlite_check_thread(pysqlite_Connection* self);
int pysqlite_check_connection(pysqlite_Connection* con);
-int pysqlite_connection_setup_types(void);
+int pysqlite_connection_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 5cfb4b97d6..3c09c1c6b7 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -33,7 +33,7 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject*
{
pysqlite_Connection* connection;
- if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection))
+ if (!PyArg_ParseTuple(args, "O!", pysqlite_ConnectionType, &connection))
{
return -1;
}
@@ -74,6 +74,8 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject*
static void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
/* Reset the statement if the user has not closed the cursor */
if (self->statement) {
pysqlite_statement_reset(self->statement);
@@ -91,7 +93,8 @@ static void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
PyObject_ClearWeakRefs((PyObject*)self);
}
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -472,7 +475,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args)
if (self->statement->in_use) {
Py_SETREF(self->statement,
- PyObject_New(pysqlite_Statement, &pysqlite_StatementType));
+ PyObject_New(pysqlite_Statement, pysqlite_StatementType));
if (!self->statement) {
goto error;
}
@@ -898,56 +901,39 @@ static struct PyMemberDef cursor_members[] =
{"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY},
{"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), READONLY},
{"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0},
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Cursor, in_weakreflist), READONLY},
{NULL}
};
static const char cursor_doc[] =
PyDoc_STR("SQLite database cursor class.");
-PyTypeObject pysqlite_CursorType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Cursor", /* tp_name */
- sizeof(pysqlite_Cursor), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_cursor_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- cursor_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- offsetof(pysqlite_Cursor, in_weakreflist), /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)pysqlite_cursor_iternext, /* tp_iternext */
- cursor_methods, /* tp_methods */
- cursor_members, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_cursor_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot cursor_slots[] = {
+ {Py_tp_dealloc, pysqlite_cursor_dealloc},
+ {Py_tp_doc, (void *)cursor_doc},
+ {Py_tp_iter, PyObject_SelfIter},
+ {Py_tp_iternext, pysqlite_cursor_iternext},
+ {Py_tp_methods, cursor_methods},
+ {Py_tp_members, cursor_members},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_cursor_init},
+ {0, NULL},
+};
+
+static PyType_Spec cursor_spec = {
+ .name = MODULE_NAME ".Cursor",
+ .basicsize = sizeof(pysqlite_Cursor),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = cursor_slots,
};
-extern int pysqlite_cursor_setup_types(void)
+PyTypeObject *pysqlite_CursorType = NULL;
+
+extern int pysqlite_cursor_setup_types(PyObject *module)
{
- pysqlite_CursorType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_CursorType);
+ pysqlite_CursorType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &cursor_spec, NULL);
+ if (pysqlite_CursorType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h
index 4a20e756f7..3e6cde167f 100644
--- a/Modules/_sqlite/cursor.h
+++ b/Modules/_sqlite/cursor.h
@@ -52,7 +52,7 @@ typedef struct
PyObject* in_weakreflist; /* List of weak references */
} pysqlite_Cursor;
-extern PyTypeObject pysqlite_CursorType;
+extern PyTypeObject *pysqlite_CursorType;
PyObject* pysqlite_cursor_execute(pysqlite_Cursor* self, PyObject* args);
PyObject* pysqlite_cursor_executemany(pysqlite_Cursor* self, PyObject* args);
@@ -64,7 +64,7 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args);
PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args);
PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args);
-int pysqlite_cursor_setup_types(void);
+int pysqlite_cursor_setup_types(PyObject *module);
#define UNKNOWN (-1)
#endif
diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c
index 3b2d7f42b8..ddc30e8a89 100644
--- a/Modules/_sqlite/microprotocols.c
+++ b/Modules/_sqlite/microprotocols.c
@@ -37,14 +37,19 @@ static PyObject *psyco_adapters = NULL;
/* pysqlite_microprotocols_init - initialize the adapters dictionary */
int
-pysqlite_microprotocols_init(PyObject *dict)
+pysqlite_microprotocols_init(PyObject *module)
{
/* create adapters dictionary and put it in module namespace */
if ((psyco_adapters = PyDict_New()) == NULL) {
return -1;
}
- return PyDict_SetItemString(dict, "adapters", psyco_adapters);
+ if (PyModule_AddObject(module, "adapters", psyco_adapters) < 0) {
+ Py_DECREF(psyco_adapters);
+ return -1;
+ }
+
+ return 0;
}
@@ -56,7 +61,7 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
PyObject* key;
int rc;
- if (proto == NULL) proto = (PyObject*)&pysqlite_PrepareProtocolType;
+ if (proto == NULL) proto = (PyObject*)pysqlite_PrepareProtocolType;
key = Py_BuildValue("(OO)", (PyObject*)type, proto);
if (!key) {
@@ -152,7 +157,7 @@ PyObject *
pysqlite_adapt(pysqlite_Cursor *self, PyObject *args)
{
PyObject *obj, *alt = NULL;
- PyObject *proto = (PyObject*)&pysqlite_PrepareProtocolType;
+ PyObject *proto = (PyObject*)pysqlite_PrepareProtocolType;
if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL;
return pysqlite_microprotocols_adapt(obj, proto, alt);
diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h
index 5418c2b98f..87df6bac55 100644
--- a/Modules/_sqlite/microprotocols.h
+++ b/Modules/_sqlite/microprotocols.h
@@ -38,7 +38,7 @@
/** exported functions **/
/* used by module.c to init the microprotocols system */
-extern int pysqlite_microprotocols_init(PyObject *dict);
+extern int pysqlite_microprotocols_init(PyObject *module);
extern int pysqlite_microprotocols_add(
PyTypeObject *type, PyObject *proto, PyObject *cast);
extern PyObject *pysqlite_microprotocols_adapt(
diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c
index 82f58eb248..0297e2fab2 100644
--- a/Modules/_sqlite/module.c
+++ b/Modules/_sqlite/module.c
@@ -82,7 +82,7 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
}
if (factory == NULL) {
- factory = (PyObject*)&pysqlite_ConnectionType;
+ factory = (PyObject*)pysqlite_ConnectionType;
}
if (PySys_Audit("sqlite3.connect", "O", database) < 0) {
@@ -176,7 +176,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
pysqlite_BaseTypeAdapted = 1;
}
- rc = pysqlite_microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
+ rc = pysqlite_microprotocols_add(type, (PyObject*)pysqlite_PrepareProtocolType, caster);
if (rc == -1)
return NULL;
@@ -236,14 +236,17 @@ PyDoc_STRVAR(enable_callback_tracebacks_doc,
\n\
Enable or disable callback functions throwing errors to stderr.");
-static void converters_init(PyObject* dict)
+static void converters_init(PyObject* module)
{
_pysqlite_converters = PyDict_New();
if (!_pysqlite_converters) {
return;
}
- PyDict_SetItemString(dict, "converters", _pysqlite_converters);
+ if (PyModule_AddObject(module, "converters", _pysqlite_converters) < 0) {
+ Py_DECREF(_pysqlite_converters);
+ }
+ return;
}
static PyMethodDef module_methods[] = {
@@ -264,59 +267,52 @@ static PyMethodDef module_methods[] = {
{NULL, NULL}
};
-struct _IntConstantPair {
- const char *constant_name;
- int constant_value;
-};
-
-typedef struct _IntConstantPair IntConstantPair;
-
-static const IntConstantPair _int_constants[] = {
- {"PARSE_DECLTYPES", PARSE_DECLTYPES},
- {"PARSE_COLNAMES", PARSE_COLNAMES},
-
- {"SQLITE_OK", SQLITE_OK},
- {"SQLITE_DENY", SQLITE_DENY},
- {"SQLITE_IGNORE", SQLITE_IGNORE},
- {"SQLITE_CREATE_INDEX", SQLITE_CREATE_INDEX},
- {"SQLITE_CREATE_TABLE", SQLITE_CREATE_TABLE},
- {"SQLITE_CREATE_TEMP_INDEX", SQLITE_CREATE_TEMP_INDEX},
- {"SQLITE_CREATE_TEMP_TABLE", SQLITE_CREATE_TEMP_TABLE},
- {"SQLITE_CREATE_TEMP_TRIGGER", SQLITE_CREATE_TEMP_TRIGGER},
- {"SQLITE_CREATE_TEMP_VIEW", SQLITE_CREATE_TEMP_VIEW},
- {"SQLITE_CREATE_TRIGGER", SQLITE_CREATE_TRIGGER},
- {"SQLITE_CREATE_VIEW", SQLITE_CREATE_VIEW},
- {"SQLITE_DELETE", SQLITE_DELETE},
- {"SQLITE_DROP_INDEX", SQLITE_DROP_INDEX},
- {"SQLITE_DROP_TABLE", SQLITE_DROP_TABLE},
- {"SQLITE_DROP_TEMP_INDEX", SQLITE_DROP_TEMP_INDEX},
- {"SQLITE_DROP_TEMP_TABLE", SQLITE_DROP_TEMP_TABLE},
- {"SQLITE_DROP_TEMP_TRIGGER", SQLITE_DROP_TEMP_TRIGGER},
- {"SQLITE_DROP_TEMP_VIEW", SQLITE_DROP_TEMP_VIEW},
- {"SQLITE_DROP_TRIGGER", SQLITE_DROP_TRIGGER},
- {"SQLITE_DROP_VIEW", SQLITE_DROP_VIEW},
- {"SQLITE_INSERT", SQLITE_INSERT},
- {"SQLITE_PRAGMA", SQLITE_PRAGMA},
- {"SQLITE_READ", SQLITE_READ},
- {"SQLITE_SELECT", SQLITE_SELECT},
- {"SQLITE_TRANSACTION", SQLITE_TRANSACTION},
- {"SQLITE_UPDATE", SQLITE_UPDATE},
- {"SQLITE_ATTACH", SQLITE_ATTACH},
- {"SQLITE_DETACH", SQLITE_DETACH},
- {"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE},
- {"SQLITE_REINDEX", SQLITE_REINDEX},
- {"SQLITE_ANALYZE", SQLITE_ANALYZE},
- {"SQLITE_CREATE_VTABLE", SQLITE_CREATE_VTABLE},
- {"SQLITE_DROP_VTABLE", SQLITE_DROP_VTABLE},
- {"SQLITE_FUNCTION", SQLITE_FUNCTION},
- {"SQLITE_SAVEPOINT", SQLITE_SAVEPOINT},
+static int add_integer_constants(PyObject *module) {
+ int ret = 0;
+
+ ret += PyModule_AddIntMacro(module, PARSE_DECLTYPES);
+ ret += PyModule_AddIntMacro(module, PARSE_COLNAMES);
+ ret += PyModule_AddIntMacro(module, SQLITE_OK);
+ ret += PyModule_AddIntMacro(module, SQLITE_DENY);
+ ret += PyModule_AddIntMacro(module, SQLITE_IGNORE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_DELETE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_INSERT);
+ ret += PyModule_AddIntMacro(module, SQLITE_PRAGMA);
+ ret += PyModule_AddIntMacro(module, SQLITE_READ);
+ ret += PyModule_AddIntMacro(module, SQLITE_SELECT);
+ ret += PyModule_AddIntMacro(module, SQLITE_TRANSACTION);
+ ret += PyModule_AddIntMacro(module, SQLITE_UPDATE);
+ ret += PyModule_AddIntMacro(module, SQLITE_ATTACH);
+ ret += PyModule_AddIntMacro(module, SQLITE_DETACH);
+ ret += PyModule_AddIntMacro(module, SQLITE_ALTER_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_REINDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_ANALYZE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VTABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_VTABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_FUNCTION);
+ ret += PyModule_AddIntMacro(module, SQLITE_SAVEPOINT);
#if SQLITE_VERSION_NUMBER >= 3008003
- {"SQLITE_RECURSIVE", SQLITE_RECURSIVE},
+ ret += PyModule_AddIntMacro(module, SQLITE_RECURSIVE);
#endif
- {"SQLITE_DONE", SQLITE_DONE},
- {(char*)NULL, 0}
-};
-
+ ret += PyModule_AddIntMacro(module, SQLITE_DONE);
+ return ret;
+}
static struct PyModuleDef _sqlite3module = {
PyModuleDef_HEAD_INIT,
@@ -338,11 +334,21 @@ do { \
} \
} while (0)
+#define ADD_EXCEPTION(module, name, exc, base) \
+do { \
+ exc = PyErr_NewException(MODULE_NAME "." name, base, NULL); \
+ if (!exc) { \
+ goto error; \
+ } \
+ if (PyModule_AddObject(module, name, exc) < 0) { \
+ Py_DECREF(exc); \
+ goto error; \
+ } \
+} while (0)
+
PyMODINIT_FUNC PyInit__sqlite3(void)
{
- PyObject *module, *dict;
- PyObject *tmp_obj;
- int i;
+ PyObject *module;
if (sqlite3_libversion_number() < 3007003) {
PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.3 or higher required");
@@ -352,81 +358,37 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
module = PyModule_Create(&_sqlite3module);
if (!module ||
- (pysqlite_row_setup_types() < 0) ||
- (pysqlite_cursor_setup_types() < 0) ||
- (pysqlite_connection_setup_types() < 0) ||
- (pysqlite_cache_setup_types() < 0) ||
- (pysqlite_statement_setup_types() < 0) ||
- (pysqlite_prepare_protocol_setup_types() < 0)
+ (pysqlite_row_setup_types(module) < 0) ||
+ (pysqlite_cursor_setup_types(module) < 0) ||
+ (pysqlite_connection_setup_types(module) < 0) ||
+ (pysqlite_cache_setup_types(module) < 0) ||
+ (pysqlite_statement_setup_types(module) < 0) ||
+ (pysqlite_prepare_protocol_setup_types(module) < 0)
) {
Py_XDECREF(module);
return NULL;
}
- ADD_TYPE(module, pysqlite_ConnectionType);
- ADD_TYPE(module, pysqlite_CursorType);
- ADD_TYPE(module, pysqlite_PrepareProtocolType);
- ADD_TYPE(module, pysqlite_RowType);
-
- if (!(dict = PyModule_GetDict(module))) {
- goto error;
- }
+ ADD_TYPE(module, *pysqlite_ConnectionType);
+ ADD_TYPE(module, *pysqlite_CursorType);
+ ADD_TYPE(module, *pysqlite_PrepareProtocolType);
+ ADD_TYPE(module, *pysqlite_RowType);
/*** Create DB-API Exception hierarchy */
-
- if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_Exception, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "Error", pysqlite_Error);
-
- if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_Exception, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "Warning", pysqlite_Warning);
+ ADD_EXCEPTION(module, "Error", pysqlite_Error, PyExc_Exception);
+ ADD_EXCEPTION(module, "Warning", pysqlite_Warning, PyExc_Exception);
/* Error subclasses */
-
- if (!(pysqlite_InterfaceError = PyErr_NewException(MODULE_NAME ".InterfaceError", pysqlite_Error, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "InterfaceError", pysqlite_InterfaceError);
-
- if (!(pysqlite_DatabaseError = PyErr_NewException(MODULE_NAME ".DatabaseError", pysqlite_Error, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "DatabaseError", pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "InterfaceError", pysqlite_InterfaceError, pysqlite_Error);
+ ADD_EXCEPTION(module, "DatabaseError", pysqlite_DatabaseError, pysqlite_Error);
/* pysqlite_DatabaseError subclasses */
-
- if (!(pysqlite_InternalError = PyErr_NewException(MODULE_NAME ".InternalError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "InternalError", pysqlite_InternalError);
-
- if (!(pysqlite_OperationalError = PyErr_NewException(MODULE_NAME ".OperationalError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "OperationalError", pysqlite_OperationalError);
-
- if (!(pysqlite_ProgrammingError = PyErr_NewException(MODULE_NAME ".ProgrammingError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "ProgrammingError", pysqlite_ProgrammingError);
-
- if (!(pysqlite_IntegrityError = PyErr_NewException(MODULE_NAME ".IntegrityError", pysqlite_DatabaseError,NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "IntegrityError", pysqlite_IntegrityError);
-
- if (!(pysqlite_DataError = PyErr_NewException(MODULE_NAME ".DataError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "DataError", pysqlite_DataError);
-
- if (!(pysqlite_NotSupportedError = PyErr_NewException(MODULE_NAME ".NotSupportedError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError);
+ ADD_EXCEPTION(module, "InternalError", pysqlite_InternalError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "OperationalError", pysqlite_OperationalError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "ProgrammingError", pysqlite_ProgrammingError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "IntegrityError", pysqlite_IntegrityError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "DataError", pysqlite_DataError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "NotSupportedError", pysqlite_NotSupportedError, pysqlite_DatabaseError);
/* In Python 2.x, setting Connection.text_factory to
OptimizedUnicode caused Unicode objects to be returned for
@@ -434,35 +396,31 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
Now OptimizedUnicode is an alias for str, so it has no
effect. */
Py_INCREF((PyObject*)&PyUnicode_Type);
- PyDict_SetItemString(dict, "OptimizedUnicode", (PyObject*)&PyUnicode_Type);
+ if (PyModule_AddObject(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) {
+ Py_DECREF((PyObject*)&PyUnicode_Type);
+ goto error;
+ }
/* Set integer constants */
- for (i = 0; _int_constants[i].constant_name != NULL; i++) {
- tmp_obj = PyLong_FromLong(_int_constants[i].constant_value);
- if (!tmp_obj) {
- goto error;
- }
- PyDict_SetItemString(dict, _int_constants[i].constant_name, tmp_obj);
- Py_DECREF(tmp_obj);
+ if (add_integer_constants(module) < 0) {
+ goto error;
}
- if (!(tmp_obj = PyUnicode_FromString(PYSQLITE_VERSION))) {
+ if (PyModule_AddStringConstant(module, "version", PYSQLITE_VERSION) < 0) {
goto error;
}
- PyDict_SetItemString(dict, "version", tmp_obj);
- Py_DECREF(tmp_obj);
- if (!(tmp_obj = PyUnicode_FromString(sqlite3_libversion()))) {
+ if (PyModule_AddStringConstant(module, "sqlite_version", sqlite3_libversion())) {
goto error;
}
- PyDict_SetItemString(dict, "sqlite_version", tmp_obj);
- Py_DECREF(tmp_obj);
/* initialize microprotocols layer */
- pysqlite_microprotocols_init(dict);
+ if (pysqlite_microprotocols_init(module) < 0) {
+ goto error;
+ }
/* initialize the default converters */
- converters_init(dict);
+ converters_init(module);
error:
if (PyErr_Occurred())
diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c
index 05a2ca5a65..089d66b981 100644
--- a/Modules/_sqlite/prepare_protocol.c
+++ b/Modules/_sqlite/prepare_protocol.c
@@ -30,54 +30,33 @@ int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* arg
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self)
{
- Py_TYPE(self)->tp_free((PyObject*)self);
+ PyTypeObject *tp = Py_TYPE(self);
+
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
-PyTypeObject pysqlite_PrepareProtocolType= {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".PrepareProtocol", /* tp_name */
- sizeof(pysqlite_PrepareProtocol), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_prepare_protocol_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_prepare_protocol_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot type_slots[] = {
+ {Py_tp_dealloc, pysqlite_prepare_protocol_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_prepare_protocol_init},
+ {0, NULL},
+};
+
+static PyType_Spec type_spec = {
+ .name = MODULE_NAME ".PrepareProtocol",
+ .basicsize = sizeof(pysqlite_PrepareProtocol),
+ .flags = Py_TPFLAGS_DEFAULT,
+ .slots = type_slots,
};
-extern int pysqlite_prepare_protocol_setup_types(void)
+PyTypeObject *pysqlite_PrepareProtocolType = NULL;
+
+extern int pysqlite_prepare_protocol_setup_types(PyObject *module)
{
- pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew;
- Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type);
- return PyType_Ready(&pysqlite_PrepareProtocolType);
+ pysqlite_PrepareProtocolType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &type_spec, NULL);
+ if (pysqlite_PrepareProtocolType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h
index 3998a55e51..d0f717c754 100644
--- a/Modules/_sqlite/prepare_protocol.h
+++ b/Modules/_sqlite/prepare_protocol.h
@@ -31,12 +31,12 @@ typedef struct
PyObject_HEAD
} pysqlite_PrepareProtocol;
-extern PyTypeObject pysqlite_PrepareProtocolType;
+extern PyTypeObject *pysqlite_PrepareProtocolType;
int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs);
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self);
-int pysqlite_prepare_protocol_setup_types(void);
+int pysqlite_prepare_protocol_setup_types(PyObject *module);
#define UNKNOWN (-1)
#endif
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c
index 4b47108278..76b6f04f0c 100644
--- a/Modules/_sqlite/row.c
+++ b/Modules/_sqlite/row.c
@@ -26,10 +26,13 @@
void pysqlite_row_dealloc(pysqlite_Row* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_XDECREF(self->data);
Py_XDECREF(self->description);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -46,7 +49,7 @@ pysqlite_row_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
if (!PyArg_ParseTuple(args, "OO", &cursor, &data))
return NULL;
- if (!PyObject_TypeCheck((PyObject*)cursor, &pysqlite_CursorType)) {
+ if (!PyObject_TypeCheck((PyObject*)cursor, pysqlite_CursorType)) {
PyErr_SetString(PyExc_TypeError, "instance of cursor required for first argument");
return NULL;
}
@@ -192,7 +195,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
if (opid != Py_EQ && opid != Py_NE)
Py_RETURN_NOTIMPLEMENTED;
- if (PyObject_TypeCheck(_other, &pysqlite_RowType)) {
+ if (PyObject_TypeCheck(_other, pysqlite_RowType)) {
pysqlite_Row *other = (pysqlite_Row *)_other;
int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);
if (eq < 0) {
@@ -206,73 +209,40 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
Py_RETURN_NOTIMPLEMENTED;
}
-PyMappingMethods pysqlite_row_as_mapping = {
- /* mp_length */ (lenfunc)pysqlite_row_length,
- /* mp_subscript */ (binaryfunc)pysqlite_row_subscript,
- /* mp_ass_subscript */ (objobjargproc)0,
-};
-
-static PySequenceMethods pysqlite_row_as_sequence = {
- /* sq_length */ (lenfunc)pysqlite_row_length,
- /* sq_concat */ 0,
- /* sq_repeat */ 0,
- /* sq_item */ (ssizeargfunc)pysqlite_row_item,
-};
-
-
-static PyMethodDef pysqlite_row_methods[] = {
+static PyMethodDef row_methods[] = {
{"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS,
PyDoc_STR("Returns the keys of the row.")},
{NULL, NULL}
};
+static PyType_Slot row_slots[] = {
+ {Py_tp_dealloc, pysqlite_row_dealloc},
+ {Py_tp_hash, pysqlite_row_hash},
+ {Py_tp_methods, row_methods},
+ {Py_tp_richcompare, pysqlite_row_richcompare},
+ {Py_tp_iter, pysqlite_iter},
+ {Py_mp_length, pysqlite_row_length},
+ {Py_mp_subscript, pysqlite_row_subscript},
+ {Py_sq_length, pysqlite_row_length},
+ {Py_sq_item, pysqlite_row_item},
+ {Py_tp_new, pysqlite_row_new},
+ {0, NULL},
+};
-PyTypeObject pysqlite_RowType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Row", /* tp_name */
- sizeof(pysqlite_Row), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_row_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)pysqlite_row_hash, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- (traverseproc)0, /* tp_traverse */
- 0, /* tp_clear */
- (richcmpfunc)pysqlite_row_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)pysqlite_iter, /* tp_iter */
- 0, /* tp_iternext */
- pysqlite_row_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Spec row_spec = {
+ .name = MODULE_NAME ".Row",
+ .basicsize = sizeof(pysqlite_Row),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = row_slots,
};
-extern int pysqlite_row_setup_types(void)
+PyTypeObject *pysqlite_RowType = NULL;
+
+extern int pysqlite_row_setup_types(PyObject *module)
{
- pysqlite_RowType.tp_new = pysqlite_row_new;
- pysqlite_RowType.tp_as_mapping = &pysqlite_row_as_mapping;
- pysqlite_RowType.tp_as_sequence = &pysqlite_row_as_sequence;
- return PyType_Ready(&pysqlite_RowType);
+ pysqlite_RowType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &row_spec, NULL);
+ if (pysqlite_RowType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h
index 4ad506f8dd..2dac41e89e 100644
--- a/Modules/_sqlite/row.h
+++ b/Modules/_sqlite/row.h
@@ -33,8 +33,8 @@ typedef struct _Row
PyObject* description;
} pysqlite_Row;
-extern PyTypeObject pysqlite_RowType;
+extern PyTypeObject *pysqlite_RowType;
-int pysqlite_row_setup_types(void);
+int pysqlite_row_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index 02e47a02b7..4682d286c5 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -255,7 +255,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
if (!_need_adapt(current_param)) {
adapted = current_param;
} else {
- adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param);
+ adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param);
Py_DECREF(current_param);
if (!adapted) {
return;
@@ -306,7 +306,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
if (!_need_adapt(current_param)) {
adapted = current_param;
} else {
- adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param);
+ adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param);
Py_DECREF(current_param);
if (!adapted) {
return;
@@ -371,6 +371,8 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self)
void pysqlite_statement_dealloc(pysqlite_Statement* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
if (self->st) {
Py_BEGIN_ALLOW_THREADS
sqlite3_finalize(self->st);
@@ -385,7 +387,8 @@ void pysqlite_statement_dealloc(pysqlite_Statement* self)
PyObject_ClearWeakRefs((PyObject*)self);
}
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
/*
@@ -458,50 +461,30 @@ static int pysqlite_check_remaining_sql(const char* tail)
return 0;
}
-PyTypeObject pysqlite_StatementType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Statement", /* tp_name */
- sizeof(pysqlite_Statement), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_statement_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- offsetof(pysqlite_Statement, in_weakreflist), /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyMemberDef stmt_members[] = {
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Statement, in_weakreflist), READONLY},
+ {NULL},
+};
+static PyType_Slot stmt_slots[] = {
+ {Py_tp_members, stmt_members},
+ {Py_tp_dealloc, pysqlite_statement_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {0, NULL},
+};
+
+static PyType_Spec stmt_spec = {
+ .name = MODULE_NAME ".Statement",
+ .basicsize = sizeof(pysqlite_Statement),
+ .flags = Py_TPFLAGS_DEFAULT,
+ .slots = stmt_slots,
};
+PyTypeObject *pysqlite_StatementType = NULL;
-extern int pysqlite_statement_setup_types(void)
+extern int pysqlite_statement_setup_types(PyObject *module)
{
- pysqlite_StatementType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_StatementType);
+ pysqlite_StatementType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &stmt_spec, NULL);
+ if (pysqlite_StatementType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h
index 5002f02dc5..b426036002 100644
--- a/Modules/_sqlite/statement.h
+++ b/Modules/_sqlite/statement.h
@@ -43,7 +43,7 @@ typedef struct
PyObject* in_weakreflist; /* List of weak references */
} pysqlite_Statement;
-extern PyTypeObject pysqlite_StatementType;
+extern PyTypeObject *pysqlite_StatementType;
int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql);
void pysqlite_statement_dealloc(pysqlite_Statement* self);
@@ -55,6 +55,6 @@ int pysqlite_statement_finalize(pysqlite_Statement* self);
int pysqlite_statement_reset(pysqlite_Statement* self);
void pysqlite_statement_mark_dirty(pysqlite_Statement* self);
-int pysqlite_statement_setup_types(void);
+int pysqlite_statement_setup_types(PyObject *module);
#endif