]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-107122: Add clear method to dbm.gdbm.module (gh-107127)
authorDong-hee Na <donghee.na@python.org>
Sun, 23 Jul 2023 13:51:12 +0000 (22:51 +0900)
committerGitHub <noreply@github.com>
Sun, 23 Jul 2023 13:51:12 +0000 (13:51 +0000)
Doc/library/dbm.rst
Lib/test/test_dbm_gnu.py
Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst [new file with mode: 0644]
Modules/_gdbmmodule.c
Modules/clinic/_gdbmmodule.c.h

index 2be499337a2a1562fc8221a71928062a8eab7b36..d226fa9f962cb41a6a84034795206b8b9d067020 100644 (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
 -------------------------------------------
 
index 73602cab5180fc7fc0dc35b79a8383cda25ed42e..e20addf1f04f1b082a07917f77443f922af522c9 100644 (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()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-23-13-07-34.gh-issue-107122.9HFUyb.rst
new file mode 100644 (file)
index 0000000..c2e1c58
--- /dev/null
@@ -0,0 +1 @@
+Add :meth:`dbm.gdbm.clear` to :mod:`dbm.gdbm`. Patch By Dong-hee Na.
index bedbdc081425c2c9fd6aebbf4f1a9c3d62441698..47f2da8e0e3d0485ecf9590d5b013336c41553dd 100644 (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 */
index 5c6aeeee7789f7b955929b28b53238bf1655ce1f..76f6db318f8cc57e0eb59b4910cd042f91918ca1 100644 (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]*/