mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
gh-107122: Add clear method to dbm.gdbm.module (gh-107127)
This commit is contained in:
parent
e59da0c4f2
commit
b273837fea
5 changed files with 77 additions and 1 deletions
|
@ -245,6 +245,13 @@ supported.
|
||||||
|
|
||||||
Close the ``gdbm`` database.
|
Close the ``gdbm`` database.
|
||||||
|
|
||||||
|
.. method:: gdbm.clear()
|
||||||
|
|
||||||
|
Remove all items from the ``gdbm`` database.
|
||||||
|
|
||||||
|
.. versionadded:: 3.13
|
||||||
|
|
||||||
|
|
||||||
:mod:`dbm.ndbm` --- Interface based on ndbm
|
:mod:`dbm.ndbm` --- Interface based on ndbm
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,20 @@ class TestGdbm(unittest.TestCase):
|
||||||
def test_open_with_pathlib_bytes_path(self):
|
def test_open_with_pathlib_bytes_path(self):
|
||||||
gdbm.open(FakePath(os.fsencode(filename)), "c").close()
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest.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;
|
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 *
|
static PyObject *
|
||||||
gdbm__enter__(PyObject *self, PyObject *args)
|
gdbm__enter__(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
@ -582,6 +613,7 @@ static PyMethodDef gdbm_methods[] = {
|
||||||
_GDBM_GDBM_SYNC_METHODDEF
|
_GDBM_GDBM_SYNC_METHODDEF
|
||||||
_GDBM_GDBM_GET_METHODDEF
|
_GDBM_GDBM_GET_METHODDEF
|
||||||
_GDBM_GDBM_SETDEFAULT_METHODDEF
|
_GDBM_GDBM_SETDEFAULT_METHODDEF
|
||||||
|
_GDBM_GDBM_CLEAR_METHODDEF
|
||||||
{"__enter__", gdbm__enter__, METH_NOARGS, NULL},
|
{"__enter__", gdbm__enter__, METH_NOARGS, NULL},
|
||||||
{"__exit__", gdbm__exit__, METH_VARARGS, NULL},
|
{"__exit__", gdbm__exit__, METH_VARARGS, NULL},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
|
|
24
Modules/clinic/_gdbmmodule.c.h
generated
24
Modules/clinic/_gdbmmodule.c.h
generated
|
@ -247,6 +247,28 @@ _gdbm_gdbm_sync(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_s
|
||||||
return _gdbm_gdbm_sync_impl(self, cls);
|
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__,
|
PyDoc_STRVAR(dbmopen__doc__,
|
||||||
"open($module, filename, flags=\'r\', mode=0o666, /)\n"
|
"open($module, filename, flags=\'r\', mode=0o666, /)\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
|
@ -322,4 +344,4 @@ skip_optional:
|
||||||
exit:
|
exit:
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=c6e721d82335adb3 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=8c613cbd88e57480 input=a9049054013a1b77]*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue