Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7d6392c

Browse files
Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
1 parent 9da33ab commit 7d6392c

3 files changed

Lines changed: 17 additions & 4 deletions

File tree

Lib/test/test_dbm_gnu.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def test_key_methods(self):
2424
self.g[b'bytes'] = b'data'
2525
key_set = set(self.g.keys())
2626
self.assertEqual(key_set, set([b'a', b'bytes', b'12345678910']))
27+
self.assertIn('a', self.g)
2728
self.assertIn(b'a', self.g)
2829
self.assertEqual(self.g[b'bytes'], b'data')
2930
key = self.g.firstkey()

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ Core and Builtins
8181
Library
8282
-------
8383

84+
- Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
85+
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
86+
8487
- Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
8588
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
8689

Modules/_gdbmmodule.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,20 +290,29 @@ dbm_contains(PyObject *self, PyObject *arg)
290290
{
291291
dbmobject *dp = (dbmobject *)self;
292292
datum key;
293+
Py_ssize_t size;
293294

294295
if ((dp)->di_dbm == NULL) {
295296
PyErr_SetString(DbmError,
296297
"GDBM object has already been closed");
297298
return -1;
298299
}
299-
if (!PyBytes_Check(arg)) {
300+
if (PyUnicode_Check(arg)) {
301+
key.dptr = PyUnicode_AsUTF8AndSize(arg, &size);
302+
key.dsize = size;
303+
if (key.dptr == NULL)
304+
return -1;
305+
}
306+
else if (!PyBytes_Check(arg)) {
300307
PyErr_Format(PyExc_TypeError,
301-
"gdbm key must be bytes, not %.100s",
308+
"gdbm key must be bytes or string, not %.100s",
302309
arg->ob_type->tp_name);
303310
return -1;
304311
}
305-
key.dptr = PyBytes_AS_STRING(arg);
306-
key.dsize = PyBytes_GET_SIZE(arg);
312+
else {
313+
key.dptr = PyBytes_AS_STRING(arg);
314+
key.dsize = PyBytes_GET_SIZE(arg);
315+
}
307316
return gdbm_exists(dp->di_dbm, key);
308317
}
309318

0 commit comments

Comments
 (0)