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

Skip to content

Commit 4f056d4

Browse files
Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
2 parents 124a0b3 + 7d6392c commit 4f056d4

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
@@ -10,6 +10,9 @@ Projected release date: 2013-11-24
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #19288: Fixed the "in" operator of dbm.gnu databases for string
14+
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
15+
1316
- Issue #19287: Fixed the "in" operator of dbm.ndbm databases for string
1417
argument. Original patch by Arfrever Frehtes Taifersar Arahesis.
1518

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)