From 3446516ffa92c98519146253153484291947b273 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Thu, 3 Jun 2021 23:24:25 +0200 Subject: bpo-44042: Optimize sqlite3 begin transaction (GH-25908) --- Modules/_sqlite/connection.c | 36 ---------------------------------- Modules/_sqlite/connection.h | 2 -- Modules/_sqlite/cursor.c | 46 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index c43f74c..47ae9aa 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -405,42 +405,6 @@ int pysqlite_check_connection(pysqlite_Connection* con) } } -PyObject* _pysqlite_connection_begin(pysqlite_Connection* self) -{ - int rc; - sqlite3_stmt* statement; - - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_prepare_v2(self->db, self->begin_statement, -1, &statement, - NULL); - Py_END_ALLOW_THREADS - - if (rc != SQLITE_OK) { - _pysqlite_seterror(self->db); - goto error; - } - - rc = pysqlite_step(statement, self); - if (rc != SQLITE_DONE) { - _pysqlite_seterror(self->db); - } - - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_finalize(statement); - Py_END_ALLOW_THREADS - - if (rc != SQLITE_OK && !PyErr_Occurred()) { - _pysqlite_seterror(self->db); - } - -error: - if (PyErr_Occurred()) { - return NULL; - } else { - Py_RETURN_NONE; - } -} - /*[clinic input] _sqlite3.Connection.commit as pysqlite_connection_commit diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index f2be4f1..03845a6 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -107,8 +107,6 @@ typedef struct extern PyTypeObject *pysqlite_ConnectionType; -PyObject* _pysqlite_connection_begin(pysqlite_Connection* self); - int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor); int pysqlite_check_thread(pysqlite_Connection* self); int pysqlite_check_connection(pysqlite_Connection* con); diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 8073f3b..7f33b3d 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -415,6 +415,38 @@ static int check_cursor(pysqlite_Cursor* cur) return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); } +static int +begin_transaction(pysqlite_Connection *self) +{ + int rc; + sqlite3_stmt *statement; + + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_prepare_v2(self->db, self->begin_statement, -1, &statement, + NULL); + Py_END_ALLOW_THREADS + + if (rc != SQLITE_OK) { + _pysqlite_seterror(self->db); + goto error; + } + + Py_BEGIN_ALLOW_THREADS + sqlite3_step(statement); + rc = sqlite3_finalize(statement); + Py_END_ALLOW_THREADS + + if (rc != SQLITE_OK && !PyErr_Occurred()) { + _pysqlite_seterror(self->db); + } + +error: + if (PyErr_Occurred()) { + return -1; + } + return 0; +} + static PyObject * get_statement_from_cache(pysqlite_Cursor *self, PyObject *operation) { @@ -431,7 +463,6 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation PyObject* parameters = NULL; int i; int rc; - PyObject* result; int numcols; PyObject* column_name; sqlite_int64 lastrowid; @@ -515,13 +546,12 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation /* We start a transaction implicitly before a DML statement. SELECT is the only exception. See #9924. */ - if (self->connection->begin_statement && self->statement->is_dml) { - if (sqlite3_get_autocommit(self->connection->db)) { - result = _pysqlite_connection_begin(self->connection); - if (!result) { - goto error; - } - Py_DECREF(result); + if (self->connection->begin_statement + && self->statement->is_dml + && sqlite3_get_autocommit(self->connection->db)) + { + if (begin_transaction(self->connection) < 0) { + goto error; } } -- cgit v0.12