summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlend Egeberg Aasland <erlend.aasland@innova.no>2021-09-19 22:52:36 (GMT)
committerGitHub <noreply@github.com>2021-09-19 22:52:36 (GMT)
commita6779715c4d0289acb59a8fd3660ab2e5d486c4b (patch)
tree8b58969be970952c73ba8431794f8f6b500d0848
parent771a5467132f0400d4c987db8ba807f845b655bc (diff)
downloadcpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.zip
cpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.tar.gz
cpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.tar.bz2
bpo-45041: Simplify `sqlite3.Cursor.executescript()` (GH-28020)
-rw-r--r--Modules/_sqlite/cursor.c67
1 files changed, 25 insertions, 42 deletions
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index d0c9e7f..38ccdcf 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -721,19 +721,13 @@ pysqlite_cursor_executescript_impl(pysqlite_Cursor *self,
const char *sql_script)
/*[clinic end generated code: output=8fd726dde1c65164 input=1ac0693dc8db02a8]*/
{
- _Py_IDENTIFIER(commit);
- sqlite3_stmt* statement;
- int rc;
- size_t sql_len;
- PyObject* result;
-
if (!check_cursor(self)) {
return NULL;
}
self->reset = 0;
- sql_len = strlen(sql_script);
+ size_t sql_len = strlen(sql_script);
int max_length = sqlite3_limit(self->connection->db,
SQLITE_LIMIT_LENGTH, -1);
if (sql_len >= (unsigned)max_length) {
@@ -742,47 +736,37 @@ pysqlite_cursor_executescript_impl(pysqlite_Cursor *self,
return NULL;
}
- /* commit first */
- result = _PyObject_CallMethodIdNoArgs((PyObject *)self->connection, &PyId_commit);
- if (!result) {
- goto error;
- }
- Py_DECREF(result);
-
- pysqlite_state *state = self->connection->state;
- while (1) {
- const char *tail;
+ // Commit if needed
+ sqlite3 *db = self->connection->db;
+ if (!sqlite3_get_autocommit(db)) {
+ int rc = SQLITE_OK;
Py_BEGIN_ALLOW_THREADS
- rc = sqlite3_prepare_v2(self->connection->db,
- sql_script,
- (int)sql_len + 1,
- &statement,
- &tail);
+ rc = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
Py_END_ALLOW_THREADS
+
if (rc != SQLITE_OK) {
- _pysqlite_seterror(state, self->connection->db);
goto error;
}
+ }
- /* execute statement, and ignore results of SELECT statements */
- do {
- rc = pysqlite_step(statement);
- if (PyErr_Occurred()) {
- (void)sqlite3_finalize(statement);
- goto error;
- }
- } while (rc == SQLITE_ROW);
+ while (1) {
+ int rc;
+ const char *tail;
- if (rc != SQLITE_DONE) {
- (void)sqlite3_finalize(statement);
- _pysqlite_seterror(state, self->connection->db);
- goto error;
+ Py_BEGIN_ALLOW_THREADS
+ sqlite3_stmt *stmt;
+ rc = sqlite3_prepare_v2(db, sql_script, (int)sql_len + 1, &stmt,
+ &tail);
+ if (rc == SQLITE_OK) {
+ do {
+ (void)sqlite3_step(stmt);
+ } while (rc == SQLITE_ROW);
+ rc = sqlite3_finalize(stmt);
}
+ Py_END_ALLOW_THREADS
- rc = sqlite3_finalize(statement);
if (rc != SQLITE_OK) {
- _pysqlite_seterror(state, self->connection->db);
goto error;
}
@@ -793,12 +777,11 @@ pysqlite_cursor_executescript_impl(pysqlite_Cursor *self,
sql_script = tail;
}
+ return Py_NewRef((PyObject *)self);
+
error:
- if (PyErr_Occurred()) {
- return NULL;
- } else {
- return Py_NewRef((PyObject *)self);
- }
+ _pysqlite_seterror(self->connection->state, db);
+ return NULL;
}
static PyObject *