@@ -855,6 +855,85 @@ static PyMethodDef _gdbm_module_methods[] = {
855855 { 0 , 0 },
856856};
857857
858+ PyDoc_STRVAR (gdbm_version_info__doc__ ,
859+ "_gdbm.gdbm_version_info\n\
860+ \n\
861+ GDBM version information as a named tuple." );
862+
863+ static PyStructSequence_Field gdbm_version_info_fields [] = {
864+ {"major" , "Major release number" },
865+ {"minor" , "Minor release number" },
866+ {"patch" , "Patch release number" },
867+ {0 }
868+ };
869+
870+ static PyStructSequence_Desc gdbm_version_info_desc = {
871+ "_gdbm.gdbm_version_info" , /* name */
872+ gdbm_version_info__doc__ , /* doc */
873+ gdbm_version_info_fields , /* fields */
874+ 3
875+ };
876+
877+ static PyObject *
878+ make_gdbm_version_info (PyTypeObject * type , int major , int minor , int patch )
879+ {
880+ PyObject * version ;
881+ int pos = 0 ;
882+
883+ version = PyStructSequence_New (type );
884+ if (version == NULL ) {
885+ return NULL ;
886+ }
887+
888+ #define SetItem (VALUE ) \
889+ PyStructSequence_SET_ITEM(version, pos++, VALUE); \
890+ if (PyErr_Occurred()) { \
891+ Py_DECREF(version); \
892+ return NULL; \
893+ }
894+
895+ SetItem (PyLong_FromLong (major ))
896+ SetItem (PyLong_FromLong (minor ))
897+ SetItem (PyLong_FromLong (patch ))
898+ #undef SetItem
899+
900+ return version ;
901+ }
902+
903+ static int
904+ add_version_constants (PyObject * module )
905+ {
906+ if (PyModule_AddStringConstant (module , "gdbm_version" , gdbm_version ) < 0 ) {
907+ return -1 ;
908+ }
909+ #if defined(GDBM_VERSION_MAJOR ) && defined(GDBM_VERSION_MINOR ) && \
910+ defined(GDBM_VERSION_PATCH )
911+ PyTypeObject * version_type ;
912+ version_type = PyStructSequence_NewType (& gdbm_version_info_desc );
913+ if (version_type == NULL ) {
914+ return -1 ;
915+ }
916+ if (PyModule_Add (module , "GDBM_VERSION_INFO" ,
917+ make_gdbm_version_info (version_type , GDBM_VERSION_MAJOR ,
918+ GDBM_VERSION_MINOR ,
919+ GDBM_VERSION_PATCH )) < 0 )
920+ {
921+ Py_DECREF (version_type );
922+ return -1 ;
923+ }
924+ if (PyModule_Add (module , "gdbm_version_info" ,
925+ make_gdbm_version_info (version_type , gdbm_version_number [0 ],
926+ gdbm_version_number [1 ],
927+ gdbm_version_number [2 ])) < 0 )
928+ {
929+ Py_DECREF (version_type );
930+ return -1 ;
931+ }
932+ Py_DECREF (version_type );
933+ #endif
934+ return 0 ;
935+ }
936+
858937static int
859938_gdbm_exec (PyObject * module )
860939{
@@ -876,14 +955,9 @@ _gdbm_exec(PyObject *module)
876955 return -1 ;
877956 }
878957
879- #if defined(GDBM_VERSION_MAJOR ) && defined(GDBM_VERSION_MINOR ) && \
880- defined(GDBM_VERSION_PATCH )
881- PyObject * obj = Py_BuildValue ("iii" , GDBM_VERSION_MAJOR ,
882- GDBM_VERSION_MINOR , GDBM_VERSION_PATCH );
883- if (PyModule_Add (module , "_GDBM_VERSION" , obj ) < 0 ) {
958+ if (add_version_constants (module ) < 0 ) {
884959 return -1 ;
885960 }
886- #endif
887961 return 0 ;
888962}
889963
0 commit comments