summaryrefslogtreecommitdiffstats
path: root/Modules/_sqlite/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_sqlite/connection.c')
-rw-r--r--Modules/_sqlite/connection.c41
1 files changed, 17 insertions, 24 deletions
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 33d3d4c..af093c3 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -177,11 +177,6 @@ pysqlite_connection_init_impl(pysqlite_Connection *self,
self->function_pinboard_progress_handler = NULL;
self->function_pinboard_authorizer_cb = NULL;
- Py_XSETREF(self->collations, PyDict_New());
- if (!self->collations) {
- return -1;
- }
-
pysqlite_state *state = pysqlite_get_state(NULL);
self->Warning = state->Warning;
self->Error = state->Error;
@@ -249,7 +244,6 @@ connection_traverse(pysqlite_Connection *self, visitproc visit, void *arg)
Py_VISIT(self->function_pinboard_trace_callback);
Py_VISIT(self->function_pinboard_progress_handler);
Py_VISIT(self->function_pinboard_authorizer_cb);
- Py_VISIT(self->collations);
return 0;
}
@@ -265,7 +259,6 @@ connection_clear(pysqlite_Connection *self)
Py_CLEAR(self->function_pinboard_trace_callback);
Py_CLEAR(self->function_pinboard_progress_handler);
Py_CLEAR(self->function_pinboard_authorizer_cb);
- Py_CLEAR(self->collations);
return 0;
}
@@ -1780,29 +1773,29 @@ pysqlite_connection_create_collation_impl(pysqlite_Connection *self,
if (!uppercase_name_str)
goto finally;
- if (callable != Py_None && !PyCallable_Check(callable)) {
- PyErr_SetString(PyExc_TypeError, "parameter must be callable");
- goto finally;
+ int flags = SQLITE_UTF8;
+ if (callable == Py_None) {
+ rc = sqlite3_create_collation_v2(self->db, uppercase_name_str, flags,
+ NULL, NULL, NULL);
}
-
- if (callable != Py_None) {
- if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1)
- goto finally;
- } else {
- if (PyDict_DelItem(self->collations, uppercase_name) == -1)
+ else {
+ if (!PyCallable_Check(callable)) {
+ PyErr_SetString(PyExc_TypeError, "parameter must be callable");
goto finally;
+ }
+ rc = sqlite3_create_collation_v2(self->db, uppercase_name_str, flags,
+ Py_NewRef(callable),
+ &pysqlite_collation_callback,
+ &_destructor);
}
- rc = sqlite3_create_collation(self->db,
- uppercase_name_str,
- SQLITE_UTF8,
- (callable != Py_None) ? callable : NULL,
- (callable != Py_None) ? pysqlite_collation_callback : NULL);
if (rc != SQLITE_OK) {
+ /* Unlike other sqlite3_* functions, the destructor callback is _not_
+ * called if sqlite3_create_collation_v2() fails, so we have to free
+ * the context before returning.
+ */
if (callable != Py_None) {
- if (PyDict_DelItem(self->collations, uppercase_name) < 0) {
- PyErr_Clear();
- }
+ Py_DECREF(callable);
}
_pysqlite_seterror(self->db);
goto finally;