[Python-checkins] r61072 - python/trunk/Modules/dbmmodule.c python/trunk/Modules/gdbmmodule.c

facundo.batista python-checkins at python.org
Mon Feb 25 23:33:55 CET 2008


Author: facundo.batista
Date: Mon Feb 25 23:33:55 2008
New Revision: 61072

Modified:
   python/trunk/Modules/dbmmodule.c
   python/trunk/Modules/gdbmmodule.c
Log:

Issue 2168. gdbm and dbm needs to be iterable; this fixes a 
failure in the shelve module.  Thanks Thomas Herve.


Modified: python/trunk/Modules/dbmmodule.c
==============================================================================
--- python/trunk/Modules/dbmmodule.c	(original)
+++ python/trunk/Modules/dbmmodule.c	Mon Feb 25 23:33:55 2008
@@ -161,6 +161,37 @@
 	return 0;
 }
 
+static int
+dbm_contains(register dbmobject *dp, PyObject *v)
+{
+    datum key, val;
+
+    if (PyString_AsStringAndSize(v, &key.dptr, &key.dsize)) {
+        return -1;
+    }
+
+    /* Expand check_dbmobject_open to return -1 */
+    if (dp->di_dbm == NULL) {
+        PyErr_SetString(DbmError, "DBM object has already been closed");
+        return -1;
+    }
+	val = dbm_fetch(dp->di_dbm, key);
+	return val.dptr != NULL;
+}
+
+static PySequenceMethods dbm_as_sequence = {
+    (lenfunc)dbm_length,        /*_length*/
+    0,                          /*sq_concat*/
+    0,                          /*sq_repeat*/
+    0,                          /*sq_item*/
+    0,                          /*sq_slice*/
+    0,                          /*sq_ass_item*/
+    0,                          /*sq_ass_slice*/
+    (objobjproc)dbm_contains,   /*sq_contains*/
+    0,                          /*sq_inplace_concat*/
+    0                           /*sq_inplace_repeat*/
+};
+
 static PyMappingMethods dbm_as_mapping = {
 	(lenfunc)dbm_length,		/*mp_length*/
 	(binaryfunc)dbm_subscript,	/*mp_subscript*/
@@ -313,8 +344,15 @@
 	0,			  /*tp_compare*/
 	0,			  /*tp_repr*/
 	0,			  /*tp_as_number*/
-	0,			  /*tp_as_sequence*/
+    &dbm_as_sequence,     /*tp_as_sequence*/
 	&dbm_as_mapping,	  /*tp_as_mapping*/
+    0,                    /*tp_hash*/
+    0,                    /*tp_call*/
+    0,                    /*tp_str*/
+    0,                    /*tp_getattro*/
+    0,                    /*tp_setattro*/
+    0,                    /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT,   /*tp_xxx4*/
 };
 
 /* ----------------------------------------------------------------- */

Modified: python/trunk/Modules/gdbmmodule.c
==============================================================================
--- python/trunk/Modules/gdbmmodule.c	(original)
+++ python/trunk/Modules/gdbmmodule.c	Mon Feb 25 23:33:55 2008
@@ -178,6 +178,33 @@
     return 0;
 }
 
+static int
+dbm_contains(register dbmobject *dp, PyObject *v)
+{
+    datum key;
+
+    if (PyString_AsStringAndSize(v, &key.dptr, &key.dsize)) {
+        return -1;
+    }
+
+    check_dbmobject_open(dp);
+    
+    return gdbm_exists(dp->di_dbm, key);
+}
+
+static PySequenceMethods dbm_as_sequence = {
+    (lenfunc)dbm_length,               /*_length*/
+       0,              /*sq_concat*/
+       0,                      /*sq_repeat*/
+       0,                      /*sq_item*/
+       0,                      /*sq_slice*/
+       0,                      /*sq_ass_item*/
+       0,                  /*sq_ass_slice*/
+       (objobjproc)dbm_contains,               /*sq_contains*/
+       0,                  /*sq_inplace_concat*/
+       0                   /*sq_inplace_repeat*/
+};
+
 static PyMappingMethods dbm_as_mapping = {
     (lenfunc)dbm_length,		/*mp_length*/
     (binaryfunc)dbm_subscript,          /*mp_subscript*/
@@ -381,7 +408,7 @@
     0,                                  /*tp_compare*/
     0,                                  /*tp_repr*/
     0,                                  /*tp_as_number*/
-    0,                                  /*tp_as_sequence*/
+    &dbm_as_sequence,                   /*tp_as_sequence*/
     &dbm_as_mapping,                    /*tp_as_mapping*/
     0,                                  /*tp_hash*/
     0,                                  /*tp_call*/
@@ -389,7 +416,7 @@
     0,                                  /*tp_getattro*/
     0,                                  /*tp_setattro*/
     0,                                  /*tp_as_buffer*/
-    0,                                  /*tp_xxx4*/
+    Py_TPFLAGS_DEFAULT,                 /*tp_xxx4*/
     gdbm_object__doc__,                 /*tp_doc*/
 };
 


More information about the Python-checkins mailing list