@@ -862,6 +862,85 @@ static PyMethodDef _gdbm_module_methods[] = {
862862 { 0 , 0 },
863863};
864864
865+ PyDoc_STRVAR (gdbm_version_info__doc__ ,
866+ "_gdbm.gdbm_version_info\n\
867+ \n\
868+ GDBM version information as a named tuple." );
869+
870+ static PyStructSequence_Field gdbm_version_info_fields [] = {
871+ {"major" , "Major release number" },
872+ {"minor" , "Minor release number" },
873+ {"patch" , "Patch release number" },
874+ {0 }
875+ };
876+
877+ static PyStructSequence_Desc gdbm_version_info_desc = {
878+ "_gdbm.gdbm_version_info" , /* name */
879+ gdbm_version_info__doc__ , /* doc */
880+ gdbm_version_info_fields , /* fields */
881+ 3
882+ };
883+
884+ static PyObject *
885+ make_gdbm_version_info (PyTypeObject * type , int major , int minor , int patch )
886+ {
887+ PyObject * version ;
888+ int pos = 0 ;
889+
890+ version = PyStructSequence_New (type );
891+ if (version == NULL ) {
892+ return NULL ;
893+ }
894+
895+ #define SetItem (VALUE ) \
896+ PyStructSequence_SET_ITEM(version, pos++, VALUE); \
897+ if (PyErr_Occurred()) { \
898+ Py_DECREF(version); \
899+ return NULL; \
900+ }
901+
902+ SetItem (PyLong_FromLong (major ))
903+ SetItem (PyLong_FromLong (minor ))
904+ SetItem (PyLong_FromLong (patch ))
905+ #undef SetItem
906+
907+ return version ;
908+ }
909+
910+ static int
911+ add_version_constants (PyObject * module )
912+ {
913+ if (PyModule_AddStringConstant (module , "gdbm_version" , gdbm_version ) < 0 ) {
914+ return -1 ;
915+ }
916+ #if defined(GDBM_VERSION_MAJOR ) && defined(GDBM_VERSION_MINOR ) && \
917+ defined(GDBM_VERSION_PATCH )
918+ PyTypeObject * version_type ;
919+ version_type = PyStructSequence_NewType (& gdbm_version_info_desc );
920+ if (version_type == NULL ) {
921+ return -1 ;
922+ }
923+ if (PyModule_Add (module , "GDBM_VERSION_INFO" ,
924+ make_gdbm_version_info (version_type , GDBM_VERSION_MAJOR ,
925+ GDBM_VERSION_MINOR ,
926+ GDBM_VERSION_PATCH )) < 0 )
927+ {
928+ Py_DECREF (version_type );
929+ return -1 ;
930+ }
931+ if (PyModule_Add (module , "gdbm_version_info" ,
932+ make_gdbm_version_info (version_type , gdbm_version_number [0 ],
933+ gdbm_version_number [1 ],
934+ gdbm_version_number [2 ])) < 0 )
935+ {
936+ Py_DECREF (version_type );
937+ return -1 ;
938+ }
939+ Py_DECREF (version_type );
940+ #endif
941+ return 0 ;
942+ }
943+
865944static int
866945_gdbm_exec (PyObject * module )
867946{
@@ -883,14 +962,9 @@ _gdbm_exec(PyObject *module)
883962 return -1 ;
884963 }
885964
886- #if defined(GDBM_VERSION_MAJOR ) && defined(GDBM_VERSION_MINOR ) && \
887- defined(GDBM_VERSION_PATCH )
888- PyObject * obj = Py_BuildValue ("iii" , GDBM_VERSION_MAJOR ,
889- GDBM_VERSION_MINOR , GDBM_VERSION_PATCH );
890- if (PyModule_Add (module , "_GDBM_VERSION" , obj ) < 0 ) {
965+ if (add_version_constants (module ) < 0 ) {
891966 return -1 ;
892967 }
893- #endif
894968 return 0 ;
895969}
896970
0 commit comments