@@ -282,12 +282,79 @@ static PyMethodDef module_methods[] = {
282282 {NULL , NULL }
283283};
284284
285+ /* SQLite API error codes */
286+ static const struct {
287+ const char * name ;
288+ long value ;
289+ } error_codes [] = {
290+ #define DECLARE_ERROR_CODE (code ) {#code , code }
291+ // Primary result code list
292+ DECLARE_ERROR_CODE (SQLITE_ABORT ),
293+ DECLARE_ERROR_CODE (SQLITE_AUTH ),
294+ DECLARE_ERROR_CODE (SQLITE_BUSY ),
295+ DECLARE_ERROR_CODE (SQLITE_CANTOPEN ),
296+ DECLARE_ERROR_CODE (SQLITE_CONSTRAINT ),
297+ DECLARE_ERROR_CODE (SQLITE_CORRUPT ),
298+ DECLARE_ERROR_CODE (SQLITE_DONE ),
299+ DECLARE_ERROR_CODE (SQLITE_EMPTY ),
300+ DECLARE_ERROR_CODE (SQLITE_ERROR ),
301+ DECLARE_ERROR_CODE (SQLITE_FORMAT ),
302+ DECLARE_ERROR_CODE (SQLITE_FULL ),
303+ DECLARE_ERROR_CODE (SQLITE_INTERNAL ),
304+ DECLARE_ERROR_CODE (SQLITE_INTERRUPT ),
305+ DECLARE_ERROR_CODE (SQLITE_IOERR ),
306+ DECLARE_ERROR_CODE (SQLITE_LOCKED ),
307+ DECLARE_ERROR_CODE (SQLITE_MISMATCH ),
308+ DECLARE_ERROR_CODE (SQLITE_MISUSE ),
309+ DECLARE_ERROR_CODE (SQLITE_NOLFS ),
310+ DECLARE_ERROR_CODE (SQLITE_NOMEM ),
311+ DECLARE_ERROR_CODE (SQLITE_NOTADB ),
312+ DECLARE_ERROR_CODE (SQLITE_NOTFOUND ),
313+ DECLARE_ERROR_CODE (SQLITE_OK ),
314+ DECLARE_ERROR_CODE (SQLITE_PERM ),
315+ DECLARE_ERROR_CODE (SQLITE_PROTOCOL ),
316+ DECLARE_ERROR_CODE (SQLITE_READONLY ),
317+ DECLARE_ERROR_CODE (SQLITE_ROW ),
318+ DECLARE_ERROR_CODE (SQLITE_SCHEMA ),
319+ DECLARE_ERROR_CODE (SQLITE_TOOBIG ),
320+ #if SQLITE_VERSION_NUMBER >= 3007017
321+ DECLARE_ERROR_CODE (SQLITE_NOTICE ),
322+ DECLARE_ERROR_CODE (SQLITE_WARNING ),
323+ #endif
324+ #undef DECLARE_ERROR_CODE
325+ {NULL, 0 },
326+ };
327+
328+ static int
329+ add_error_constants (PyObject * module )
330+ {
331+ for (int i = 0 ; error_codes [i ].name != NULL ; i ++ ) {
332+ const char * name = error_codes [i ].name ;
333+ const long value = error_codes [i ].value ;
334+ if (PyModule_AddIntConstant (module , name , value ) < 0 ) {
335+ return -1 ;
336+ }
337+ }
338+ return 0 ;
339+ }
340+
341+ const char *
342+ pysqlite_error_name (int rc )
343+ {
344+ for (int i = 0 ; error_codes [i ].name != NULL ; i ++ ) {
345+ if (error_codes [i ].value == rc ) {
346+ return error_codes [i ].name ;
347+ }
348+ }
349+ // No error code matched.
350+ return NULL ;
351+ }
352+
285353static int add_integer_constants (PyObject * module ) {
286354 int ret = 0 ;
287355
288356 ret += PyModule_AddIntMacro (module , PARSE_DECLTYPES );
289357 ret += PyModule_AddIntMacro (module , PARSE_COLNAMES );
290- ret += PyModule_AddIntMacro (module , SQLITE_OK );
291358 ret += PyModule_AddIntMacro (module , SQLITE_DENY );
292359 ret += PyModule_AddIntMacro (module , SQLITE_IGNORE );
293360 ret += PyModule_AddIntMacro (module , SQLITE_CREATE_INDEX );
@@ -325,7 +392,6 @@ static int add_integer_constants(PyObject *module) {
325392#if SQLITE_VERSION_NUMBER >= 3008003
326393 ret += PyModule_AddIntMacro (module , SQLITE_RECURSIVE );
327394#endif
328- ret += PyModule_AddIntMacro (module , SQLITE_DONE );
329395 return ret ;
330396}
331397
@@ -406,6 +472,11 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
406472 ADD_EXCEPTION (module , state , DataError , state -> DatabaseError );
407473 ADD_EXCEPTION (module , state , NotSupportedError , state -> DatabaseError );
408474
475+ /* Set error constants */
476+ if (add_error_constants (module ) < 0 ) {
477+ goto error ;
478+ }
479+
409480 /* Set integer constants */
410481 if (add_integer_constants (module ) < 0 ) {
411482 goto error ;
0 commit comments