Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
83ab267
sqlite3 module expose sqlite error code and name in exceptions
palaviv Apr 13, 2017
eeb10f4
Fix syntax error
palaviv Apr 13, 2017
42636f9
Add NEWS entry
palaviv May 8, 2019
f224223
Update version
palaviv May 8, 2019
31467e3
Fix whitespace
palaviv May 8, 2019
679280d
Merge branch 'main' into sqlite-expose-error-code
Aug 6, 2021
8aa0859
Move exception documentation to the exceptions section
Aug 6, 2021
e4195c0
Use PyModule_AddObjectRef to add error codes
Aug 6, 2021
a4a0762
Refactor: add add_error_constants()
Aug 6, 2021
c18d227
Sort error codes alphabetically
Aug 6, 2021
67e49e8
Normalise style with the rest of the code base (PEP 7, etc.)
Aug 6, 2021
1893ced
Improve "get error name" function
Aug 6, 2021
67ea5f2
Refactor _pysqlite_seterror changes
Aug 6, 2021
6ced38c
Refactor error code table
Aug 6, 2021
467f7ba
Use macro to create error table
Aug 6, 2021
4abd093
Add missing SQLITE_NOTICE and SQLITE_WARNING codes
Aug 6, 2021
70507dd
Add comment
Aug 6, 2021
b617192
Merge branch 'main' into sqlite-expose-error-code
Aug 9, 2021
db053b9
Assert exception class is always set
Aug 9, 2021
98106dd
Use explicit API's iso. Py_BuildValue, etc.
Aug 9, 2021
0567938
Remove duplicate return code entries
Aug 9, 2021
16889a1
Group stuff
Aug 9, 2021
a7a1cf8
Use 'unknown' when a proper SQLite exception cannot be found
Aug 9, 2021
772a29c
Fix complete_statement.py example
Aug 9, 2021
fa5a1af
Improve unit tests
Aug 9, 2021
cf551b1
Adjust NEWS entry and update What's New
Aug 9, 2021
a3646c9
Use PyObject_SetAttrString iso. _PyObject_SetAttrId => slow path/read…
Aug 9, 2021
8a49659
Refactor _pysqlite_seterror
Aug 9, 2021
8d11bc5
Link to sqlite.org/rescode.html iso. sqlite.org/c3ref/c_abort.html
Aug 9, 2021
7a69798
Use test.support.os_helper.temp_dir() in test_error_code_on_exception()
Aug 18, 2021
b9a5a77
Merge branch 'main' into sqlite-expose-error-code
Aug 25, 2021
3589a6a
Address review: document get_exception_class() return value
Aug 25, 2021
a3c45b6
Merge branch 'main' into sqlite-expose-error-code
Aug 25, 2021
5a5683c
Address review: compare char ptr with NULL iso. 0
Aug 26, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Normalise style with the rest of the code base (PEP 7, etc.)
  • Loading branch information
Erlend E. Aasland committed Aug 6, 2021
commit 67e49e8a60ad1654cd1e9236d1433d645b1c1cf9
71 changes: 37 additions & 34 deletions Modules/_sqlite/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,44 +291,47 @@ typedef struct _IntConstantPair IntConstantPair;

/* sqlite API error codes */
static const IntConstantPair _error_codes[] = {
{"SQLITE_ABORT", SQLITE_ABORT},
{"SQLITE_AUTH", SQLITE_AUTH},
{"SQLITE_BUSY", SQLITE_BUSY},
{"SQLITE_CANTOPEN", SQLITE_CANTOPEN},
{"SQLITE_CONSTRAINT", SQLITE_CONSTRAINT},
{"SQLITE_CORRUPT", SQLITE_CORRUPT},
{"SQLITE_DONE", SQLITE_DONE},
{"SQLITE_EMPTY", SQLITE_EMPTY},
{"SQLITE_ERROR", SQLITE_ERROR},
{"SQLITE_FORMAT", SQLITE_FORMAT},
{"SQLITE_FULL", SQLITE_FULL},
{"SQLITE_INTERNAL", SQLITE_INTERNAL},
{"SQLITE_INTERRUPT", SQLITE_INTERRUPT},
{"SQLITE_IOERR", SQLITE_IOERR},
{"SQLITE_LOCKED", SQLITE_LOCKED},
{"SQLITE_MISMATCH", SQLITE_MISMATCH},
{"SQLITE_MISUSE", SQLITE_MISUSE},
{"SQLITE_NOLFS", SQLITE_NOLFS},
{"SQLITE_NOMEM", SQLITE_NOMEM},
{"SQLITE_NOTADB", SQLITE_NOTADB},
{"SQLITE_NOTFOUND", SQLITE_NOTFOUND},
{"SQLITE_OK", SQLITE_OK},
{"SQLITE_PERM", SQLITE_PERM},
{"SQLITE_PROTOCOL", SQLITE_PROTOCOL},
{"SQLITE_RANGE", SQLITE_RANGE},
{"SQLITE_READONLY", SQLITE_READONLY},
{"SQLITE_ROW", SQLITE_ROW},
{"SQLITE_SCHEMA", SQLITE_SCHEMA},
{"SQLITE_TOOBIG", SQLITE_TOOBIG},
{(char*)NULL, 0},
{"SQLITE_UNKNOWN", -1}
{"SQLITE_ABORT", SQLITE_ABORT},
{"SQLITE_AUTH", SQLITE_AUTH},
{"SQLITE_BUSY", SQLITE_BUSY},
{"SQLITE_CANTOPEN", SQLITE_CANTOPEN},
{"SQLITE_CONSTRAINT", SQLITE_CONSTRAINT},
{"SQLITE_CORRUPT", SQLITE_CORRUPT},
{"SQLITE_DONE", SQLITE_DONE},
{"SQLITE_EMPTY", SQLITE_EMPTY},
{"SQLITE_ERROR", SQLITE_ERROR},
{"SQLITE_FORMAT", SQLITE_FORMAT},
{"SQLITE_FULL", SQLITE_FULL},
{"SQLITE_INTERNAL", SQLITE_INTERNAL},
{"SQLITE_INTERRUPT", SQLITE_INTERRUPT},
{"SQLITE_IOERR", SQLITE_IOERR},
{"SQLITE_LOCKED", SQLITE_LOCKED},
{"SQLITE_MISMATCH", SQLITE_MISMATCH},
{"SQLITE_MISUSE", SQLITE_MISUSE},
{"SQLITE_NOLFS", SQLITE_NOLFS},
{"SQLITE_NOMEM", SQLITE_NOMEM},
{"SQLITE_NOTADB", SQLITE_NOTADB},
{"SQLITE_NOTFOUND", SQLITE_NOTFOUND},
{"SQLITE_OK", SQLITE_OK},
{"SQLITE_PERM", SQLITE_PERM},
{"SQLITE_PROTOCOL", SQLITE_PROTOCOL},
{"SQLITE_RANGE", SQLITE_RANGE},
{"SQLITE_READONLY", SQLITE_READONLY},
{"SQLITE_ROW", SQLITE_ROW},
{"SQLITE_SCHEMA", SQLITE_SCHEMA},
{"SQLITE_TOOBIG", SQLITE_TOOBIG},
{NULL, 0},
{"SQLITE_UNKNOWN", -1}
};

const char *sqlite3ErrName(int rc) {
const char *
sqlite3ErrName(int rc)
{
int i;
for (i = 0; _error_codes[i].constant_name != 0; i++) {
if (_error_codes[i].constant_value == rc)
return _error_codes[i].constant_name;
if (_error_codes[i].constant_value == rc) {
return _error_codes[i].constant_name;
}
}
// No error code matched.
return _error_codes[i+1].constant_name;
Expand Down
73 changes: 37 additions & 36 deletions Modules/_sqlite/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,50 +92,51 @@ _pysqlite_seterror(pysqlite_state *state, sqlite3 *db)
}

/* Create and set the exception. */
{
const char *error_msg;
const char *error_name;
PyObject *exc = NULL;
PyObject *args = NULL;
PyObject *py_code = NULL;
PyObject *py_name = NULL;

error_name = sqlite3ErrName(errorcode);

error_msg = sqlite3_errmsg(db);

args = Py_BuildValue("(s)", error_msg);
if (!args)
goto error;

exc = PyObject_Call(exc_class, args, NULL);
if (!exc)
goto error;

py_code = Py_BuildValue("i", errorcode);
if (!py_code)
goto error;
const char *error_msg;
const char *error_name;
PyObject *exc = NULL;
PyObject *args = NULL;
PyObject *py_code = NULL;
PyObject *py_name = NULL;

error_name = sqlite3ErrName(errorcode);
error_msg = sqlite3_errmsg(db);

args = Py_BuildValue("(s)", error_msg);
if (args == NULL) {
goto error;
}

if (PyObject_SetAttrString(exc, "sqlite_errorcode", py_code) < 0)
goto error;
exc = PyObject_Call(exc_class, args, NULL);
if (exc == NULL) {
goto error;
}

py_name = Py_BuildValue("s", error_name);
if (!py_name)
goto error;
py_code = Py_BuildValue("i", errorcode);
if (py_code == NULL) {
goto error;
}

if (PyObject_SetAttrString(exc, "sqlite_errorname", py_name) < 0)
goto error;
if (PyObject_SetAttrString(exc, "sqlite_errorcode", py_code) < 0) {
goto error;
}

PyErr_SetObject((PyObject *) Py_TYPE(exc), exc);
py_name = Py_BuildValue("s", error_name);
if (py_name == NULL) {
goto error;
}

error:
Py_XDECREF(py_code);
Py_XDECREF(py_name);
Py_XDECREF(args);
Py_XDECREF(exc);
if (PyObject_SetAttrString(exc, "sqlite_errorname", py_name) < 0) {
goto error;
}

PyErr_SetObject((PyObject *) Py_TYPE(exc), exc);

error:
Py_XDECREF(py_code);
Py_XDECREF(py_name);
Py_XDECREF(args);
Py_XDECREF(exc);
return errorcode;
}

Expand Down