]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-92206: Improve scoping of sqlite3 reset statement helper (#92241)
authorErlend Egeberg Aasland <erlend.aasland@protonmail.com>
Tue, 3 May 2022 17:48:24 +0000 (11:48 -0600)
committerGitHub <noreply@github.com>
Tue, 3 May 2022 17:48:24 +0000 (11:48 -0600)
Modules/_sqlite/cursor.c
Modules/_sqlite/statement.c
Modules/_sqlite/statement.h

index 84f481792ddd3b88bf53c824820a407d9f485d77..0e903ade5bdfb1a3986b43be3b83392eadd783a3 100644 (file)
@@ -101,6 +101,24 @@ pysqlite_cursor_init_impl(pysqlite_Cursor *self,
     return 0;
 }
 
+static inline int
+stmt_reset(pysqlite_Statement *self)
+{
+    int rc = SQLITE_OK;
+
+    if (self->in_use && self->st) {
+        Py_BEGIN_ALLOW_THREADS
+        rc = sqlite3_reset(self->st);
+        Py_END_ALLOW_THREADS
+
+        if (rc == SQLITE_OK) {
+            self->in_use = 0;
+        }
+    }
+
+    return rc;
+}
+
 static int
 cursor_traverse(pysqlite_Cursor *self, visitproc visit, void *arg)
 {
@@ -124,7 +142,7 @@ cursor_clear(pysqlite_Cursor *self)
     Py_CLEAR(self->row_factory);
     if (self->statement) {
         /* Reset the statement if the user has not closed the cursor */
-        pysqlite_statement_reset(self->statement);
+        stmt_reset(self->statement);
         Py_CLEAR(self->statement);
     }
 
@@ -544,7 +562,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
 
     if (self->statement != NULL) {
         /* There is an active statement */
-        pysqlite_statement_reset(self->statement);
+        stmt_reset(self->statement);
     }
 
     /* reset description and rowcount */
@@ -553,7 +571,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
     self->rowcount = 0L;
 
     if (self->statement) {
-        (void)pysqlite_statement_reset(self->statement);
+        (void)stmt_reset(self->statement);
     }
 
     PyObject *stmt = get_statement_from_cache(self, operation);
@@ -577,7 +595,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
         }
     }
 
-    pysqlite_statement_reset(self->statement);
+    stmt_reset(self->statement);
     pysqlite_statement_mark_dirty(self->statement);
 
     /* We start a transaction implicitly before a DML statement.
@@ -614,7 +632,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
                     PyErr_Clear();
                 }
             }
-            (void)pysqlite_statement_reset(self->statement);
+            (void)stmt_reset(self->statement);
             _pysqlite_seterror(state, self->connection->db);
             goto error;
         }
@@ -663,12 +681,12 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation
         }
 
         if (rc == SQLITE_DONE && !multiple) {
-            pysqlite_statement_reset(self->statement);
+            stmt_reset(self->statement);
             Py_CLEAR(self->statement);
         }
 
         if (multiple) {
-            pysqlite_statement_reset(self->statement);
+            stmt_reset(self->statement);
         }
         Py_XDECREF(parameters);
     }
@@ -824,7 +842,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self)
     sqlite3_stmt *stmt = self->statement->st;
     assert(stmt != NULL);
     if (sqlite3_data_count(stmt) == 0) {
-        (void)pysqlite_statement_reset(self->statement);
+        (void)stmt_reset(self->statement);
         Py_CLEAR(self->statement);
         return NULL;
     }
@@ -835,7 +853,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self)
     }
     int rc = stmt_step(stmt);
     if (rc == SQLITE_DONE) {
-        (void)pysqlite_statement_reset(self->statement);
+        (void)stmt_reset(self->statement);
     }
     else if (rc != SQLITE_ROW) {
         (void)_pysqlite_seterror(self->connection->state,
@@ -1005,7 +1023,7 @@ pysqlite_cursor_close_impl(pysqlite_Cursor *self)
     }
 
     if (self->statement) {
-        (void)pysqlite_statement_reset(self->statement);
+        (void)stmt_reset(self->statement);
         Py_CLEAR(self->statement);
     }
 
index baa1b71a8daa41684ca78f2bcc1882f758cc561c..2f2f4b2d85089b6e9b65e9d4d3c998081b9995e4 100644 (file)
@@ -366,25 +366,6 @@ pysqlite_statement_bind_parameters(pysqlite_state *state,
     }
 }
 
-int pysqlite_statement_reset(pysqlite_Statement* self)
-{
-    int rc;
-
-    rc = SQLITE_OK;
-
-    if (self->in_use && self->st) {
-        Py_BEGIN_ALLOW_THREADS
-        rc = sqlite3_reset(self->st);
-        Py_END_ALLOW_THREADS
-
-        if (rc == SQLITE_OK) {
-            self->in_use = 0;
-        }
-    }
-
-    return rc;
-}
-
 void pysqlite_statement_mark_dirty(pysqlite_Statement* self)
 {
     self->in_use = 1;
index b901c43c479ae22957c5fcf30872d4271609b1fc..5b55e2fbcb8f93ce371440ecdea4276e0fe10283 100644 (file)
@@ -44,7 +44,6 @@ void pysqlite_statement_bind_parameters(pysqlite_state *state,
                                         pysqlite_Statement *self,
                                         PyObject *parameters);
 
-int pysqlite_statement_reset(pysqlite_Statement* self);
 void pysqlite_statement_mark_dirty(pysqlite_Statement* self);
 
 int pysqlite_statement_setup_types(PyObject *module);