summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/_sqlite/connection.c36
-rw-r--r--Modules/_sqlite/connection.h2
-rw-r--r--Modules/_sqlite/cursor.c46
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;
}
}