diff options
author | Erlend Egeberg Aasland <erlend.aasland@innova.no> | 2021-09-19 22:52:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-19 22:52:36 (GMT) |
commit | a6779715c4d0289acb59a8fd3660ab2e5d486c4b (patch) | |
tree | 8b58969be970952c73ba8431794f8f6b500d0848 | |
parent | 771a5467132f0400d4c987db8ba807f845b655bc (diff) | |
download | cpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.zip cpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.tar.gz cpython-a6779715c4d0289acb59a8fd3660ab2e5d486c4b.tar.bz2 |
bpo-45041: Simplify `sqlite3.Cursor.executescript()` (GH-28020)
-rw-r--r-- | Modules/_sqlite/cursor.c | 67 |
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 * |