gh-129928: Rework sqlite3 error helpers (#129929)

Add a helper for raising DB-API compatible exceptions based on the
result code of SQLite C APIs. Some APIs do not store the error indicator
on the database pointer, so we need to be able to deduce the DB-API
compatible exception directly from the error code.

- rename _pysqlite_seterror() as set_error_from_db()
- introduce set_error_from_code()
This commit is contained in:
Erlend E. Aasland 2025-02-11 08:49:25 +01:00 committed by GitHub
parent 3a2e7aacf6
commit 3b366a4a4b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 41 additions and 30 deletions

View file

@ -118,18 +118,31 @@ exit:
Py_XDECREF(exc);
}
void
set_error_from_code(pysqlite_state *state, int code)
{
PyObject *exc_class = get_exception_class(state, code);
if (exc_class == NULL) {
// No new exception need be raised.
return;
}
const char *errmsg = sqlite3_errstr(code);
assert(errmsg != NULL);
raise_exception(exc_class, code, errmsg);
}
/**
* Checks the SQLite error code and sets the appropriate DB-API exception.
* Returns the error code (0 means no error occurred).
*/
int
_pysqlite_seterror(pysqlite_state *state, sqlite3 *db)
void
set_error_from_db(pysqlite_state *state, sqlite3 *db)
{
int errorcode = sqlite3_errcode(db);
PyObject *exc_class = get_exception_class(state, errorcode);
if (exc_class == NULL) {
// No new exception need be raised; just pass the error code
return errorcode;
// No new exception need be raised.
return;
}
/* Create and set the exception. */
@ -137,7 +150,6 @@ _pysqlite_seterror(pysqlite_state *state, sqlite3 *db)
// sqlite3_errmsg() always returns an UTF-8 encoded message
const char *errmsg = sqlite3_errmsg(db);
raise_exception(exc_class, extended_errcode, errmsg);
return extended_errcode;
}
#ifdef WORDS_BIGENDIAN