mirror of https://github.com/python/cpython
gh-107122: Add clear method to dbm.gdbm.module (gh-107127)
This commit is contained in:
parent
e59da0c4f2
commit
b273837fea
|
@ -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
|
||||
-------------------------------------------
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Add :meth:`dbm.gdbm.clear` to :mod:`dbm.gdbm`. Patch By Dong-hee Na.
|
|
@ -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 */
|
||||
|
|
|
@ -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]*/
|
||||
|
|
Loading…
Reference in New Issue