[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