Skip to content

Commit 0ae4870

Browse files
authored
gh-107122: Add clear method to dbm.ndbm module (gh-107126)
1 parent b3c34e5 commit 0ae4870

File tree

6 files changed

+91
-1
lines changed

6 files changed

+91
-1
lines changed

Doc/library/dbm.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,12 @@ to locate the appropriate header file to simplify building this module.
320320

321321
Close the ``ndbm`` database.
322322

323+
.. method:: ndbm.clear()
324+
325+
Remove all items from the ``ndbm`` database.
326+
327+
.. versionadded:: 3.13
328+
323329

324330
:mod:`dbm.dumb` --- Portable DBM implementation
325331
-----------------------------------------------

Lib/test/test_dbm.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,21 @@ def test_keys(self):
155155
self.assertNotIn(b'xxx', d)
156156
self.assertRaises(KeyError, lambda: d[b'xxx'])
157157

158+
def test_clear(self):
159+
with dbm.open(_fname, 'c') as d:
160+
self.assertEqual(d.keys(), [])
161+
a = [(b'a', b'b'), (b'12345678910', b'019237410982340912840198242')]
162+
for k, v in a:
163+
d[k] = v
164+
for k, _ in a:
165+
self.assertIn(k, d)
166+
self.assertEqual(len(d), len(a))
167+
168+
d.clear()
169+
self.assertEqual(len(d), 0)
170+
for k, _ in a:
171+
self.assertNotIn(k, d)
172+
158173
def setUp(self):
159174
self.addCleanup(setattr, dbm, '_defaultmod', dbm._defaultmod)
160175
dbm._defaultmod = self.module

Lib/test/test_dbm_ndbm.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,19 @@ def test_bool_on_closed_db_raises(self):
147147
db['a'] = 'b'
148148
self.assertRaises(dbm.ndbm.error, bool, db)
149149

150+
def test_clear(self):
151+
kvs = [('foo', 'bar'), ('1234', '5678')]
152+
with dbm.ndbm.open(self.filename, 'c') as db:
153+
for k, v in kvs:
154+
db[k] = v
155+
self.assertIn(k, db)
156+
self.assertEqual(len(db), len(kvs))
157+
158+
db.clear()
159+
for k, v in kvs:
160+
self.assertNotIn(k, db)
161+
self.assertEqual(len(db), 0)
162+
150163

151164
if __name__ == '__main__':
152165
unittest.main()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add :meth:`dbm.ndbm.clear` to :mod:`dbm.ndbm`. Patch By Dong-hee Na.

Modules/_dbmmodule.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,38 @@ _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key,
414414
return default_value;
415415
}
416416

417+
/*[clinic input]
418+
_dbm.dbm.clear
419+
cls: defining_class
420+
/
421+
Remove all items from the database.
422+
423+
[clinic start generated code]*/
424+
425+
static PyObject *
426+
_dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls)
427+
/*[clinic end generated code: output=8d126b9e1d01a434 input=43aa6ca1acb7f5f5]*/
428+
{
429+
_dbm_state *state = PyType_GetModuleState(cls);
430+
assert(state != NULL);
431+
check_dbmobject_open(self, state->dbm_error);
432+
datum key;
433+
// Invalidate cache
434+
self->di_size = -1;
435+
while (1) {
436+
key = dbm_firstkey(self->di_dbm);
437+
if (key.dptr == NULL) {
438+
break;
439+
}
440+
if (dbm_delete(self->di_dbm, key) < 0) {
441+
dbm_clearerr(self->di_dbm);
442+
PyErr_SetString(state->dbm_error, "cannot delete item from database");
443+
return NULL;
444+
}
445+
}
446+
Py_RETURN_NONE;
447+
}
448+
417449
static PyObject *
418450
dbm__enter__(PyObject *self, PyObject *args)
419451
{
@@ -431,6 +463,7 @@ static PyMethodDef dbm_methods[] = {
431463
_DBM_DBM_KEYS_METHODDEF
432464
_DBM_DBM_GET_METHODDEF
433465
_DBM_DBM_SETDEFAULT_METHODDEF
466+
_DBM_DBM_CLEAR_METHODDEF
434467
{"__enter__", dbm__enter__, METH_NOARGS, NULL},
435468
{"__exit__", dbm__exit__, METH_VARARGS, NULL},
436469
{NULL, NULL} /* sentinel */

Modules/clinic/_dbmmodule.c.h

Lines changed: 23 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)