@@ -236,14 +236,17 @@ PyDoc_STRVAR(enable_callback_tracebacks_doc,
236
236
\n\
237
237
Enable or disable callback functions throwing errors to stderr." );
238
238
239
- static void converters_init (PyObject * dict )
239
+ static void converters_init (PyObject * module )
240
240
{
241
241
_pysqlite_converters = PyDict_New ();
242
242
if (!_pysqlite_converters ) {
243
243
return ;
244
244
}
245
245
246
- PyDict_SetItemString (dict , "converters" , _pysqlite_converters );
246
+ if (PyModule_AddObject (module , "converters" , _pysqlite_converters ) < 0 ) {
247
+ Py_DECREF (_pysqlite_converters );
248
+ }
249
+ return ;
247
250
}
248
251
249
252
static PyMethodDef module_methods [] = {
@@ -264,59 +267,52 @@ static PyMethodDef module_methods[] = {
264
267
{NULL , NULL }
265
268
};
266
269
267
- struct _IntConstantPair {
268
- const char * constant_name ;
269
- int constant_value ;
270
- };
271
-
272
- typedef struct _IntConstantPair IntConstantPair ;
273
-
274
- static const IntConstantPair _int_constants [] = {
275
- {"PARSE_DECLTYPES" , PARSE_DECLTYPES },
276
- {"PARSE_COLNAMES" , PARSE_COLNAMES },
277
-
278
- {"SQLITE_OK" , SQLITE_OK },
279
- {"SQLITE_DENY" , SQLITE_DENY },
280
- {"SQLITE_IGNORE" , SQLITE_IGNORE },
281
- {"SQLITE_CREATE_INDEX" , SQLITE_CREATE_INDEX },
282
- {"SQLITE_CREATE_TABLE" , SQLITE_CREATE_TABLE },
283
- {"SQLITE_CREATE_TEMP_INDEX" , SQLITE_CREATE_TEMP_INDEX },
284
- {"SQLITE_CREATE_TEMP_TABLE" , SQLITE_CREATE_TEMP_TABLE },
285
- {"SQLITE_CREATE_TEMP_TRIGGER" , SQLITE_CREATE_TEMP_TRIGGER },
286
- {"SQLITE_CREATE_TEMP_VIEW" , SQLITE_CREATE_TEMP_VIEW },
287
- {"SQLITE_CREATE_TRIGGER" , SQLITE_CREATE_TRIGGER },
288
- {"SQLITE_CREATE_VIEW" , SQLITE_CREATE_VIEW },
289
- {"SQLITE_DELETE" , SQLITE_DELETE },
290
- {"SQLITE_DROP_INDEX" , SQLITE_DROP_INDEX },
291
- {"SQLITE_DROP_TABLE" , SQLITE_DROP_TABLE },
292
- {"SQLITE_DROP_TEMP_INDEX" , SQLITE_DROP_TEMP_INDEX },
293
- {"SQLITE_DROP_TEMP_TABLE" , SQLITE_DROP_TEMP_TABLE },
294
- {"SQLITE_DROP_TEMP_TRIGGER" , SQLITE_DROP_TEMP_TRIGGER },
295
- {"SQLITE_DROP_TEMP_VIEW" , SQLITE_DROP_TEMP_VIEW },
296
- {"SQLITE_DROP_TRIGGER" , SQLITE_DROP_TRIGGER },
297
- {"SQLITE_DROP_VIEW" , SQLITE_DROP_VIEW },
298
- {"SQLITE_INSERT" , SQLITE_INSERT },
299
- {"SQLITE_PRAGMA" , SQLITE_PRAGMA },
300
- {"SQLITE_READ" , SQLITE_READ },
301
- {"SQLITE_SELECT" , SQLITE_SELECT },
302
- {"SQLITE_TRANSACTION" , SQLITE_TRANSACTION },
303
- {"SQLITE_UPDATE" , SQLITE_UPDATE },
304
- {"SQLITE_ATTACH" , SQLITE_ATTACH },
305
- {"SQLITE_DETACH" , SQLITE_DETACH },
306
- {"SQLITE_ALTER_TABLE" , SQLITE_ALTER_TABLE },
307
- {"SQLITE_REINDEX" , SQLITE_REINDEX },
308
- {"SQLITE_ANALYZE" , SQLITE_ANALYZE },
309
- {"SQLITE_CREATE_VTABLE" , SQLITE_CREATE_VTABLE },
310
- {"SQLITE_DROP_VTABLE" , SQLITE_DROP_VTABLE },
311
- {"SQLITE_FUNCTION" , SQLITE_FUNCTION },
312
- {"SQLITE_SAVEPOINT" , SQLITE_SAVEPOINT },
270
+ static int add_integer_constants (PyObject * module ) {
271
+ int ret = 0 ;
272
+
273
+ ret += PyModule_AddIntMacro (module , PARSE_DECLTYPES );
274
+ ret += PyModule_AddIntMacro (module , PARSE_COLNAMES );
275
+ ret += PyModule_AddIntMacro (module , SQLITE_OK );
276
+ ret += PyModule_AddIntMacro (module , SQLITE_DENY );
277
+ ret += PyModule_AddIntMacro (module , SQLITE_IGNORE );
278
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_INDEX );
279
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TABLE );
280
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TEMP_INDEX );
281
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TEMP_TABLE );
282
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TEMP_TRIGGER );
283
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TEMP_VIEW );
284
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_TRIGGER );
285
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_VIEW );
286
+ ret += PyModule_AddIntMacro (module , SQLITE_DELETE );
287
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_INDEX );
288
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TABLE );
289
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TEMP_INDEX );
290
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TEMP_TABLE );
291
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TEMP_TRIGGER );
292
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TEMP_VIEW );
293
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_TRIGGER );
294
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_VIEW );
295
+ ret += PyModule_AddIntMacro (module , SQLITE_INSERT );
296
+ ret += PyModule_AddIntMacro (module , SQLITE_PRAGMA );
297
+ ret += PyModule_AddIntMacro (module , SQLITE_READ );
298
+ ret += PyModule_AddIntMacro (module , SQLITE_SELECT );
299
+ ret += PyModule_AddIntMacro (module , SQLITE_TRANSACTION );
300
+ ret += PyModule_AddIntMacro (module , SQLITE_UPDATE );
301
+ ret += PyModule_AddIntMacro (module , SQLITE_ATTACH );
302
+ ret += PyModule_AddIntMacro (module , SQLITE_DETACH );
303
+ ret += PyModule_AddIntMacro (module , SQLITE_ALTER_TABLE );
304
+ ret += PyModule_AddIntMacro (module , SQLITE_REINDEX );
305
+ ret += PyModule_AddIntMacro (module , SQLITE_ANALYZE );
306
+ ret += PyModule_AddIntMacro (module , SQLITE_CREATE_VTABLE );
307
+ ret += PyModule_AddIntMacro (module , SQLITE_DROP_VTABLE );
308
+ ret += PyModule_AddIntMacro (module , SQLITE_FUNCTION );
309
+ ret += PyModule_AddIntMacro (module , SQLITE_SAVEPOINT );
313
310
#if SQLITE_VERSION_NUMBER >= 3008003
314
- { "SQLITE_RECURSIVE" , SQLITE_RECURSIVE },
311
+ ret += PyModule_AddIntMacro ( module , SQLITE_RECURSIVE );
315
312
#endif
316
- {"SQLITE_DONE" , SQLITE_DONE },
317
- {(char * )NULL , 0 }
318
- };
319
-
313
+ ret += PyModule_AddIntMacro (module , SQLITE_DONE );
314
+ return ret ;
315
+ }
320
316
321
317
static struct PyModuleDef _sqlite3module = {
322
318
PyModuleDef_HEAD_INIT ,
@@ -338,11 +334,21 @@ do { \
338
334
} \
339
335
} while (0)
340
336
337
+ #define ADD_EXCEPTION (module , name , exc , base ) \
338
+ do { \
339
+ exc = PyErr_NewException(MODULE_NAME "." name, base, NULL); \
340
+ if (!exc) { \
341
+ goto error; \
342
+ } \
343
+ if (PyModule_AddObject(module, name, exc) < 0) { \
344
+ Py_DECREF(exc); \
345
+ goto error; \
346
+ } \
347
+ } while (0)
348
+
341
349
PyMODINIT_FUNC PyInit__sqlite3 (void )
342
350
{
343
- PyObject * module , * dict ;
344
- PyObject * tmp_obj ;
345
- int i ;
351
+ PyObject * module ;
346
352
347
353
if (sqlite3_libversion_number () < 3007003 ) {
348
354
PyErr_SetString (PyExc_ImportError , MODULE_NAME ": SQLite 3.7.3 or higher required" );
@@ -368,101 +374,53 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
368
374
ADD_TYPE (module , * pysqlite_PrepareProtocolType );
369
375
ADD_TYPE (module , * pysqlite_RowType );
370
376
371
- if (!(dict = PyModule_GetDict (module ))) {
372
- goto error ;
373
- }
374
-
375
377
/*** Create DB-API Exception hierarchy */
376
-
377
- if (!(pysqlite_Error = PyErr_NewException (MODULE_NAME ".Error" , PyExc_Exception , NULL ))) {
378
- goto error ;
379
- }
380
- PyDict_SetItemString (dict , "Error" , pysqlite_Error );
381
-
382
- if (!(pysqlite_Warning = PyErr_NewException (MODULE_NAME ".Warning" , PyExc_Exception , NULL ))) {
383
- goto error ;
384
- }
385
- PyDict_SetItemString (dict , "Warning" , pysqlite_Warning );
378
+ ADD_EXCEPTION (module , "Error" , pysqlite_Error , PyExc_Exception );
379
+ ADD_EXCEPTION (module , "Warning" , pysqlite_Warning , PyExc_Exception );
386
380
387
381
/* Error subclasses */
388
-
389
- if (!(pysqlite_InterfaceError = PyErr_NewException (MODULE_NAME ".InterfaceError" , pysqlite_Error , NULL ))) {
390
- goto error ;
391
- }
392
- PyDict_SetItemString (dict , "InterfaceError" , pysqlite_InterfaceError );
393
-
394
- if (!(pysqlite_DatabaseError = PyErr_NewException (MODULE_NAME ".DatabaseError" , pysqlite_Error , NULL ))) {
395
- goto error ;
396
- }
397
- PyDict_SetItemString (dict , "DatabaseError" , pysqlite_DatabaseError );
382
+ ADD_EXCEPTION (module , "InterfaceError" , pysqlite_InterfaceError , pysqlite_Error );
383
+ ADD_EXCEPTION (module , "DatabaseError" , pysqlite_DatabaseError , pysqlite_Error );
398
384
399
385
/* pysqlite_DatabaseError subclasses */
400
-
401
- if (!(pysqlite_InternalError = PyErr_NewException (MODULE_NAME ".InternalError" , pysqlite_DatabaseError , NULL ))) {
402
- goto error ;
403
- }
404
- PyDict_SetItemString (dict , "InternalError" , pysqlite_InternalError );
405
-
406
- if (!(pysqlite_OperationalError = PyErr_NewException (MODULE_NAME ".OperationalError" , pysqlite_DatabaseError , NULL ))) {
407
- goto error ;
408
- }
409
- PyDict_SetItemString (dict , "OperationalError" , pysqlite_OperationalError );
410
-
411
- if (!(pysqlite_ProgrammingError = PyErr_NewException (MODULE_NAME ".ProgrammingError" , pysqlite_DatabaseError , NULL ))) {
412
- goto error ;
413
- }
414
- PyDict_SetItemString (dict , "ProgrammingError" , pysqlite_ProgrammingError );
415
-
416
- if (!(pysqlite_IntegrityError = PyErr_NewException (MODULE_NAME ".IntegrityError" , pysqlite_DatabaseError ,NULL ))) {
417
- goto error ;
418
- }
419
- PyDict_SetItemString (dict , "IntegrityError" , pysqlite_IntegrityError );
420
-
421
- if (!(pysqlite_DataError = PyErr_NewException (MODULE_NAME ".DataError" , pysqlite_DatabaseError , NULL ))) {
422
- goto error ;
423
- }
424
- PyDict_SetItemString (dict , "DataError" , pysqlite_DataError );
425
-
426
- if (!(pysqlite_NotSupportedError = PyErr_NewException (MODULE_NAME ".NotSupportedError" , pysqlite_DatabaseError , NULL ))) {
427
- goto error ;
428
- }
429
- PyDict_SetItemString (dict , "NotSupportedError" , pysqlite_NotSupportedError );
386
+ ADD_EXCEPTION (module , "InternalError" , pysqlite_InternalError , pysqlite_DatabaseError );
387
+ ADD_EXCEPTION (module , "OperationalError" , pysqlite_OperationalError , pysqlite_DatabaseError );
388
+ ADD_EXCEPTION (module , "ProgrammingError" , pysqlite_ProgrammingError , pysqlite_DatabaseError );
389
+ ADD_EXCEPTION (module , "IntegrityError" , pysqlite_IntegrityError , pysqlite_DatabaseError );
390
+ ADD_EXCEPTION (module , "DataError" , pysqlite_DataError , pysqlite_DatabaseError );
391
+ ADD_EXCEPTION (module , "NotSupportedError" , pysqlite_NotSupportedError , pysqlite_DatabaseError );
430
392
431
393
/* In Python 2.x, setting Connection.text_factory to
432
394
OptimizedUnicode caused Unicode objects to be returned for
433
395
non-ASCII data and bytestrings to be returned for ASCII data.
434
396
Now OptimizedUnicode is an alias for str, so it has no
435
397
effect. */
436
398
Py_INCREF ((PyObject * )& PyUnicode_Type );
437
- PyDict_SetItemString (dict , "OptimizedUnicode" , (PyObject * )& PyUnicode_Type );
399
+ if (PyModule_AddObject (module , "OptimizedUnicode" , (PyObject * )& PyUnicode_Type ) < 0 ) {
400
+ Py_DECREF ((PyObject * )& PyUnicode_Type );
401
+ goto error ;
402
+ }
438
403
439
404
/* Set integer constants */
440
- for (i = 0 ; _int_constants [i ].constant_name != NULL ; i ++ ) {
441
- tmp_obj = PyLong_FromLong (_int_constants [i ].constant_value );
442
- if (!tmp_obj ) {
443
- goto error ;
444
- }
445
- PyDict_SetItemString (dict , _int_constants [i ].constant_name , tmp_obj );
446
- Py_DECREF (tmp_obj );
405
+ if (add_integer_constants (module ) < 0 ) {
406
+ goto error ;
447
407
}
448
408
449
- if (!( tmp_obj = PyUnicode_FromString ( PYSQLITE_VERSION )) ) {
409
+ if (PyModule_AddStringConstant ( module , "version" , PYSQLITE_VERSION ) < 0 ) {
450
410
goto error ;
451
411
}
452
- PyDict_SetItemString (dict , "version" , tmp_obj );
453
- Py_DECREF (tmp_obj );
454
412
455
- if (!( tmp_obj = PyUnicode_FromString ( sqlite3_libversion () ))) {
413
+ if (PyModule_AddStringConstant ( module , "sqlite_version" , sqlite3_libversion ())) {
456
414
goto error ;
457
415
}
458
- PyDict_SetItemString (dict , "sqlite_version" , tmp_obj );
459
- Py_DECREF (tmp_obj );
460
416
461
417
/* initialize microprotocols layer */
462
- pysqlite_microprotocols_init (dict );
418
+ if (pysqlite_microprotocols_init (module ) < 0 ) {
419
+ goto error ;
420
+ }
463
421
464
422
/* initialize the default converters */
465
- converters_init (dict );
423
+ converters_init (module );
466
424
467
425
error :
468
426
if (PyErr_Occurred ())
0 commit comments