bpo-33901: Add _gdbm._GDBM_VERSION (GH-7794)

* Fix also PyInit__gdbm() to catch errors.
* test.pythoninfo: add gdbm.version
* test_dbm_gnu now logs GDBM_VERSION when run in verbose mode.

* pythoninfo: rename function to collect_gdbm()
This commit is contained in:
Victor Stinner 2018-06-19 23:29:22 +02:00 committed by GitHub
parent 06fe77a84b
commit 00f9edb98d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 9 deletions

View File

@ -525,6 +525,15 @@ def collect_cc(info_add):
info_add('CC.version', text) 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): def collect_info(info):
error = False error = False
info_add = info.add info_add = info.add
@ -552,6 +561,7 @@ def collect_info(info):
collect_testcapi, collect_testcapi,
collect_resource, collect_resource,
collect_cc, collect_cc,
collect_gdbm,
# Collecting from tests should be last as they have side effects. # Collecting from tests should be last as they have side effects.
collect_test_socket, collect_test_socket,

View File

@ -8,6 +8,17 @@ from test.support import TESTFN, TESTFN_NONASCII, unlink
filename = TESTFN filename = TESTFN
class TestGdbm(unittest.TestCase): 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): def setUp(self):
self.g = None self.g = None

View File

@ -654,20 +654,43 @@ static struct PyModuleDef _gdbmmodule = {
PyMODINIT_FUNC PyMODINIT_FUNC
PyInit__gdbm(void) { PyInit__gdbm(void) {
PyObject *m, *d, *s; PyObject *m;
if (PyType_Ready(&Dbmtype) < 0) if (PyType_Ready(&Dbmtype) < 0)
return NULL; return NULL;
m = PyModule_Create(&_gdbmmodule); m = PyModule_Create(&_gdbmmodule);
if (m == NULL) if (m == NULL) {
return 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);
} }
DbmError = PyErr_NewException("_gdbm.error", PyExc_OSError, NULL);
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; return m;
error:
Py_DECREF(m);
return NULL;
} }