gh-107122: Add clear method to dbm.gdbm.module (gh-107127)

This commit is contained in:
Dong-hee Na 2023-07-23 22:51:12 +09:00 committed by GitHub
parent e59da0c4f2
commit b273837fea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 77 additions and 1 deletions

View File

@ -245,6 +245,13 @@ supported.
Close the ``gdbm`` database.
.. method:: gdbm.clear()
Remove all items from the ``gdbm`` database.
.. versionadded:: 3.13
:mod:`dbm.ndbm` --- Interface based on ndbm
-------------------------------------------

View File

@ -192,6 +192,20 @@ class TestGdbm(unittest.TestCase):
def test_open_with_pathlib_bytes_path(self):
gdbm.open(FakePath(os.fsencode(filename)), "c").close()
def test_clear(self):
kvs = [('foo', 'bar'), ('1234', '5678')]
with gdbm.open(filename, 'c') as db:
for k, v in kvs:
db[k] = v
self.assertIn(k, db)
self.assertEqual(len(db), len(kvs))
db.clear()
for k, v in kvs:
self.assertNotIn(k, db)
self.assertEqual(len(db), 0)
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1 @@
Add :meth:`dbm.gdbm.clear` to :mod:`dbm.gdbm`. Patch By Dong-hee Na.

View File

@ -561,6 +561,37 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls)
Py_RETURN_NONE;
}
/*[clinic input]
_gdbm.gdbm.clear
cls: defining_class
/
Remove all items from the database.
[clinic start generated code]*/
static PyObject *
_gdbm_gdbm_clear_impl(gdbmobject *self, PyTypeObject *cls)
/*[clinic end generated code: output=673577c573318661 input=34136d52fcdd4210]*/
{
_gdbm_state *state = PyType_GetModuleState(cls);
assert(state != NULL);
check_gdbmobject_open(self, state->gdbm_error);
datum key;
// Invalidate cache
self->di_size = -1;
while (1) {
key = gdbm_firstkey(self->di_dbm);
if (key.dptr == NULL) {
break;
}
if (gdbm_delete(self->di_dbm, key) < 0) {
PyErr_SetString(state->gdbm_error, "cannot delete item from database");
return NULL;
}
}
Py_RETURN_NONE;
}
static PyObject *
gdbm__enter__(PyObject *self, PyObject *args)
{
@ -582,6 +613,7 @@ static PyMethodDef gdbm_methods[] = {
_GDBM_GDBM_SYNC_METHODDEF
_GDBM_GDBM_GET_METHODDEF
_GDBM_GDBM_SETDEFAULT_METHODDEF
_GDBM_GDBM_CLEAR_METHODDEF
{"__enter__", gdbm__enter__, METH_NOARGS, NULL},
{"__exit__", gdbm__exit__, METH_VARARGS, NULL},
{NULL, NULL} /* sentinel */

View File

@ -247,6 +247,28 @@ _gdbm_gdbm_sync(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_s
return _gdbm_gdbm_sync_impl(self, cls);
}
PyDoc_STRVAR(_gdbm_gdbm_clear__doc__,
"clear($self, /)\n"
"--\n"
"\n"
"Remove all items from the database.");
#define _GDBM_GDBM_CLEAR_METHODDEF \
{"clear", _PyCFunction_CAST(_gdbm_gdbm_clear), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_clear__doc__},
static PyObject *
_gdbm_gdbm_clear_impl(gdbmobject *self, PyTypeObject *cls);
static PyObject *
_gdbm_gdbm_clear(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
if (nargs) {
PyErr_SetString(PyExc_TypeError, "clear() takes no arguments");
return NULL;
}
return _gdbm_gdbm_clear_impl(self, cls);
}
PyDoc_STRVAR(dbmopen__doc__,
"open($module, filename, flags=\'r\', mode=0o666, /)\n"
"--\n"
@ -322,4 +344,4 @@ skip_optional:
exit:
return return_value;
}
/*[clinic end generated code: output=c6e721d82335adb3 input=a9049054013a1b77]*/
/*[clinic end generated code: output=8c613cbd88e57480 input=a9049054013a1b77]*/