bpo-45041: Simplify `sqlite3.Cursor.executescript()` (GH-28020)

This commit is contained in:
Erlend Egeberg Aasland 2021-09-20 00:52:36 +02:00 committed by GitHub
parent 771a546713
commit a6779715c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 28 additions and 45 deletions

View File

@ -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);
// Commit if needed
sqlite3 *db = self->connection->db;
if (!sqlite3_get_autocommit(db)) {
int rc = SQLITE_OK;
Py_BEGIN_ALLOW_THREADS
rc = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
Py_END_ALLOW_THREADS
if (rc != SQLITE_OK) {
goto error;
}
}
pysqlite_state *state = self->connection->state;
while (1) {
int rc;
const char *tail;
Py_BEGIN_ALLOW_THREADS
rc = sqlite3_prepare_v2(self->connection->db,
sql_script,
(int)sql_len + 1,
&statement,
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
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);
if (rc != SQLITE_DONE) {
(void)sqlite3_finalize(statement);
_pysqlite_seterror(state, self->connection->db);
goto error;
}
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 *