info_add('CC.version', text)
+def collect_gdbm(info_add):
+ try:
+ import _gdbm
+ except ImportError:
+ return
+
+ info_add('gdbm.GDBM_VERSION', '.'.join(map(str, _gdbm._GDBM_VERSION)))
+
+
def collect_info(info):
error = False
info_add = info.add
collect_testcapi,
collect_resource,
collect_cc,
+ collect_gdbm,
# Collecting from tests should be last as they have side effects.
collect_test_socket,
filename = TESTFN
class TestGdbm(unittest.TestCase):
+ @staticmethod
+ def setUpClass():
+ if support.verbose:
+ try:
+ import _gdbm
+ version = _gdbm._GDBM_VERSION
+ except (ImportError, AttributeError):
+ pass
+ else:
+ print(f"gdbm version: {version}")
+
def setUp(self):
self.g = None
PyMODINIT_FUNC
PyInit__gdbm(void) {
- PyObject *m, *d, *s;
+ PyObject *m;
if (PyType_Ready(&Dbmtype) < 0)
return NULL;
m = PyModule_Create(&_gdbmmodule);
- if (m == NULL)
+ if (m == NULL) {
return NULL;
- d = PyModule_GetDict(m);
+ }
+
DbmError = PyErr_NewException("_gdbm.error", PyExc_OSError, NULL);
- if (DbmError != NULL) {
- PyDict_SetItemString(d, "error", DbmError);
- s = PyUnicode_FromString(dbmmodule_open_flags);
- PyDict_SetItemString(d, "open_flags", s);
- Py_DECREF(s);
+ if (DbmError == NULL) {
+ goto error;
+ }
+ Py_INCREF(DbmError);
+ if (PyModule_AddObject(m, "error", DbmError) < 0) {
+ Py_DECREF(DbmError);
+ goto error;
+ }
+
+ if (PyModule_AddStringConstant(m, "open_flags",
+ dbmmodule_open_flags) < 0) {
+ goto error;
}
+
+ PyObject *obj = Py_BuildValue("iii", GDBM_VERSION_MAJOR,
+ GDBM_VERSION_MINOR, GDBM_VERSION_PATCH);
+ if (obj == NULL) {
+ goto error;
+ }
+ if (PyModule_AddObject(m, "_GDBM_VERSION", obj) < 0) {
+ Py_DECREF(obj);
+ goto error;
+ }
+
return m;
+
+error:
+ Py_DECREF(m);
+ return NULL;
}