summaryrefslogtreecommitdiffstats
path: root/Modules/_gdbmmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_gdbmmodule.c')
-rw-r--r--Modules/_gdbmmodule.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index bedbdc0..47f2da8 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -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 */