[Python-checkins] bpo-45040: Simplify sqlite3 transaction control functions (GH-28019)

pablogsal webhook-mailer at python.org
Sun Sep 19 18:51:41 EDT 2021


https://github.com/python/cpython/commit/771a5467132f0400d4c987db8ba807f845b655bc
commit: 771a5467132f0400d4c987db8ba807f845b655bc
branch: main
author: Erlend Egeberg Aasland <erlend.aasland at innova.no>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-09-19T23:51:36+01:00
summary:

bpo-45040: Simplify sqlite3 transaction control functions (GH-28019)

files:
M Modules/_sqlite/connection.c
M Modules/_sqlite/cursor.c

diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 3b9e42740d432..02481d9fbd8bb 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -459,43 +459,29 @@ static PyObject *
 pysqlite_connection_commit_impl(pysqlite_Connection *self)
 /*[clinic end generated code: output=3da45579e89407f2 input=39c12c04dda276a8]*/
 {
-    int rc;
-    sqlite3_stmt* statement;
-
     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
         return NULL;
     }
 
     if (!sqlite3_get_autocommit(self->db)) {
+        int rc;
 
         Py_BEGIN_ALLOW_THREADS
+        sqlite3_stmt *statement;
         rc = sqlite3_prepare_v2(self->db, "COMMIT", 7, &statement, NULL);
-        Py_END_ALLOW_THREADS
-        if (rc != SQLITE_OK) {
-            _pysqlite_seterror(self->state, self->db);
-            goto error;
+        if (rc == SQLITE_OK) {
+            (void)sqlite3_step(statement);
+            rc = sqlite3_finalize(statement);
         }
-
-        rc = pysqlite_step(statement);
-        if (rc != SQLITE_DONE) {
-            _pysqlite_seterror(self->state, self->db);
-        }
-
-        Py_BEGIN_ALLOW_THREADS
-        rc = sqlite3_finalize(statement);
         Py_END_ALLOW_THREADS
-        if (rc != SQLITE_OK && !PyErr_Occurred()) {
-            _pysqlite_seterror(self->state, self->db);
-        }
 
+        if (rc != SQLITE_OK) {
+            (void)_pysqlite_seterror(self->state, self->db);
+            return NULL;
+        }
     }
 
-error:
-    if (PyErr_Occurred()) {
-        return NULL;
-    } else {
-        Py_RETURN_NONE;
-    }
+    Py_RETURN_NONE;
 }
 
 /*[clinic input]
@@ -508,9 +494,6 @@ static PyObject *
 pysqlite_connection_rollback_impl(pysqlite_Connection *self)
 /*[clinic end generated code: output=b66fa0d43e7ef305 input=12d4e8d068942830]*/
 {
-    int rc;
-    sqlite3_stmt* statement;
-
     if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
         return NULL;
     }
@@ -518,34 +501,25 @@ pysqlite_connection_rollback_impl(pysqlite_Connection *self)
     if (!sqlite3_get_autocommit(self->db)) {
         pysqlite_do_all_statements(self);
 
+        int rc;
+
         Py_BEGIN_ALLOW_THREADS
+        sqlite3_stmt *statement;
         rc = sqlite3_prepare_v2(self->db, "ROLLBACK", 9, &statement, NULL);
-        Py_END_ALLOW_THREADS
-        if (rc != SQLITE_OK) {
-            _pysqlite_seterror(self->state, self->db);
-            goto error;
-        }
-
-        rc = pysqlite_step(statement);
-        if (rc != SQLITE_DONE) {
-            _pysqlite_seterror(self->state, self->db);
+        if (rc == SQLITE_OK) {
+            (void)sqlite3_step(statement);
+            rc = sqlite3_finalize(statement);
         }
-
-        Py_BEGIN_ALLOW_THREADS
-        rc = sqlite3_finalize(statement);
         Py_END_ALLOW_THREADS
-        if (rc != SQLITE_OK && !PyErr_Occurred()) {
-            _pysqlite_seterror(self->state, self->db);
+
+        if (rc != SQLITE_OK) {
+            (void)_pysqlite_seterror(self->state, self->db);
+            return NULL;
         }
 
     }
 
-error:
-    if (PyErr_Occurred()) {
-        return NULL;
-    } else {
-        Py_RETURN_NONE;
-    }
+    Py_RETURN_NONE;
 }
 
 static int
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 06ce385cca3a4..d0c9e7f265520 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -431,31 +431,22 @@ static int
 begin_transaction(pysqlite_Connection *self)
 {
     int rc;
-    sqlite3_stmt *statement;
 
     Py_BEGIN_ALLOW_THREADS
+    sqlite3_stmt *statement;
     rc = sqlite3_prepare_v2(self->db, self->begin_statement, -1, &statement,
                             NULL);
-    Py_END_ALLOW_THREADS
-
-    if (rc != SQLITE_OK) {
-        _pysqlite_seterror(self->state, self->db);
-        goto error;
+    if (rc == SQLITE_OK) {
+        (void)sqlite3_step(statement);
+        rc = sqlite3_finalize(statement);
     }
-
-    Py_BEGIN_ALLOW_THREADS
-    sqlite3_step(statement);
-    rc = sqlite3_finalize(statement);
     Py_END_ALLOW_THREADS
 
-    if (rc != SQLITE_OK && !PyErr_Occurred()) {
-        _pysqlite_seterror(self->state, self->db);
-    }
-
-error:
-    if (PyErr_Occurred()) {
+    if (rc != SQLITE_OK) {
+        (void)_pysqlite_seterror(self->state, self->db);
         return -1;
     }
+
     return 0;
 }
 



More information about the Python-checkins mailing list