Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9260e77

Browse files
Issue #20184: Converted _dbm and _gdbm modules to Argument Clinic.
1 parent 6d7dced commit 9260e77

4 files changed

Lines changed: 580 additions & 200 deletions

File tree

Modules/_dbmmodule.c

Lines changed: 67 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ static char *which_dbm = "Berkeley DB";
2929
#endif
3030

3131
/*[clinic input]
32-
module dbm
33-
class dbm.dbm "dbmobject *" "&Dbmtype"
32+
module _dbm
33+
class _dbm.dbm "dbmobject *" "&Dbmtype"
3434
[clinic start generated code]*/
35-
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=92450564684a69a3]*/
35+
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b1aa8756d16150e]*/
3636

3737
typedef struct {
3838
PyObject_HEAD
@@ -51,15 +51,6 @@ static PyTypeObject Dbmtype;
5151

5252
static PyObject *DbmError;
5353

54-
/*[python input]
55-
class dbmobject_converter(self_converter):
56-
type = "dbmobject *"
57-
def pre_render(self):
58-
super().pre_render()
59-
self.name = 'dp'
60-
[python start generated code]*/
61-
/*[python end generated code: output=da39a3ee5e6b4b0d input=6ad536357913879a]*/
62-
6354
static PyObject *
6455
newdbmobject(const char *file, int flags, int mode)
6556
{
@@ -183,29 +174,43 @@ static PyMappingMethods dbm_as_mapping = {
183174
(objobjargproc)dbm_ass_sub, /*mp_ass_subscript*/
184175
};
185176

177+
/*[clinic input]
178+
_dbm.dbm.close
179+
180+
Close the database.
181+
[clinic start generated code]*/
182+
186183
static PyObject *
187-
dbm__close(dbmobject *dp, PyObject *unused)
184+
_dbm_dbm_close_impl(dbmobject *self)
185+
/*[clinic end generated code: output=c8dc5b6709600b86 input=046db72377d51be8]*/
188186
{
189-
if (dp->di_dbm)
190-
dbm_close(dp->di_dbm);
191-
dp->di_dbm = NULL;
187+
if (self->di_dbm)
188+
dbm_close(self->di_dbm);
189+
self->di_dbm = NULL;
192190
Py_INCREF(Py_None);
193191
return Py_None;
194192
}
195193

194+
/*[clinic input]
195+
_dbm.dbm.keys
196+
197+
Return a list of all keys in the database.
198+
[clinic start generated code]*/
199+
196200
static PyObject *
197-
dbm_keys(dbmobject *dp, PyObject *unused)
201+
_dbm_dbm_keys_impl(dbmobject *self)
202+
/*[clinic end generated code: output=434549f7c121b33c input=d210ba778cd9c68a]*/
198203
{
199204
PyObject *v, *item;
200205
datum key;
201206
int err;
202207

203-
check_dbmobject_open(dp);
208+
check_dbmobject_open(self);
204209
v = PyList_New(0);
205210
if (v == NULL)
206211
return NULL;
207-
for (key = dbm_firstkey(dp->di_dbm); key.dptr;
208-
key = dbm_nextkey(dp->di_dbm)) {
212+
for (key = dbm_firstkey(self->di_dbm); key.dptr;
213+
key = dbm_nextkey(self->di_dbm)) {
209214
item = PyBytes_FromStringAndSize(key.dptr, key.dsize);
210215
if (item == NULL) {
211216
Py_DECREF(v);
@@ -267,76 +272,82 @@ static PySequenceMethods dbm_as_sequence = {
267272
};
268273

269274
/*[clinic input]
270-
271-
dbm.dbm.get
272-
273-
self: dbmobject
275+
_dbm.dbm.get
274276
275277
key: str(types={'str', 'robuffer'}, length=True)
276-
default: object = None
278+
default: object(c_default="NULL") = b''
277279
/
278280
279281
Return the value for key if present, otherwise default.
280282
[clinic start generated code]*/
281283

282284
static PyObject *
283-
dbm_dbm_get_impl(dbmobject *dp, const char *key, Py_ssize_clean_t key_length,
284-
PyObject *default_value)
285-
/*[clinic end generated code: output=4f5c0e523eaf1251 input=f81478bc211895ef]*/
285+
_dbm_dbm_get_impl(dbmobject *self, const char *key,
286+
Py_ssize_clean_t key_length, PyObject *default_value)
287+
/*[clinic end generated code: output=b44f95eba8203d93 input=fee97bbe85e84822]*/
286288
{
287289
datum dbm_key, val;
288290

289291
dbm_key.dptr = (char *)key;
290292
dbm_key.dsize = key_length;
291-
check_dbmobject_open(dp);
292-
val = dbm_fetch(dp->di_dbm, dbm_key);
293+
check_dbmobject_open(self);
294+
val = dbm_fetch(self->di_dbm, dbm_key);
293295
if (val.dptr != NULL)
294296
return PyBytes_FromStringAndSize(val.dptr, val.dsize);
295297

296298
Py_INCREF(default_value);
297299
return default_value;
298300
}
299301

302+
/*[clinic input]
303+
_dbm.dbm.setdefault
304+
key: str(types={'str', 'robuffer'}, length=True)
305+
default: object(c_default="NULL") = b''
306+
/
307+
308+
Return the value for key if present, otherwise default.
309+
310+
If key is not in the database, it is inserted with default as the value.
311+
[clinic start generated code]*/
312+
300313
static PyObject *
301-
dbm_setdefault(dbmobject *dp, PyObject *args)
314+
_dbm_dbm_setdefault_impl(dbmobject *self, const char *key,
315+
Py_ssize_clean_t key_length,
316+
PyObject *default_value)
317+
/*[clinic end generated code: output=52545886cf272161 input=6a3b99ae91f20203]*/
302318
{
303-
datum key, val;
304-
PyObject *defvalue = NULL;
305-
char *tmp_ptr;
319+
datum dbm_key, val;
306320
Py_ssize_t tmp_size;
307321

308-
if (!PyArg_ParseTuple(args, "s#|O:setdefault",
309-
&tmp_ptr, &tmp_size, &defvalue))
310-
return NULL;
311-
key.dptr = tmp_ptr;
312-
key.dsize = tmp_size;
313-
check_dbmobject_open(dp);
314-
val = dbm_fetch(dp->di_dbm, key);
322+
dbm_key.dptr = (char *)key;
323+
dbm_key.dsize = key_length;
324+
check_dbmobject_open(self);
325+
val = dbm_fetch(self->di_dbm, dbm_key);
315326
if (val.dptr != NULL)
316327
return PyBytes_FromStringAndSize(val.dptr, val.dsize);
317-
if (defvalue == NULL) {
318-
defvalue = PyBytes_FromStringAndSize(NULL, 0);
319-
if (defvalue == NULL)
328+
if (default_value == NULL) {
329+
default_value = PyBytes_FromStringAndSize(NULL, 0);
330+
if (default_value == NULL)
320331
return NULL;
321332
val.dptr = NULL;
322333
val.dsize = 0;
323334
}
324335
else {
325-
if ( !PyArg_Parse(defvalue, "s#", &val.dptr, &tmp_size) ) {
336+
if ( !PyArg_Parse(default_value, "s#", &val.dptr, &tmp_size) ) {
326337
PyErr_SetString(PyExc_TypeError,
327338
"dbm mappings have byte string elements only");
328339
return NULL;
329340
}
330341
val.dsize = tmp_size;
331-
Py_INCREF(defvalue);
342+
Py_INCREF(default_value);
332343
}
333-
if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) {
334-
dbm_clearerr(dp->di_dbm);
344+
if (dbm_store(self->di_dbm, dbm_key, val, DBM_INSERT) < 0) {
345+
dbm_clearerr(self->di_dbm);
335346
PyErr_SetString(DbmError, "cannot add item to database");
336-
Py_DECREF(defvalue);
347+
Py_DECREF(default_value);
337348
return NULL;
338349
}
339-
return defvalue;
350+
return default_value;
340351
}
341352

342353
static PyObject *
@@ -355,15 +366,10 @@ dbm__exit__(PyObject *self, PyObject *args)
355366

356367

357368
static PyMethodDef dbm_methods[] = {
358-
{"close", (PyCFunction)dbm__close, METH_NOARGS,
359-
"close()\nClose the database."},
360-
{"keys", (PyCFunction)dbm_keys, METH_NOARGS,
361-
"keys() -> list\nReturn a list of all keys in the database."},
362-
DBM_DBM_GET_METHODDEF
363-
{"setdefault", (PyCFunction)dbm_setdefault, METH_VARARGS,
364-
"setdefault(key[, default]) -> value\n"
365-
"Return the value for key if present, otherwise default. If key\n"
366-
"is not in the database, it is inserted with default as the value."},
369+
_DBM_DBM_CLOSE_METHODDEF
370+
_DBM_DBM_KEYS_METHODDEF
371+
_DBM_DBM_GET_METHODDEF
372+
_DBM_DBM_SETDEFAULT_METHODDEF
367373
{"__enter__", dbm__enter__, METH_NOARGS, NULL},
368374
{"__exit__", dbm__exit__, METH_VARARGS, NULL},
369375
{NULL, NULL} /* sentinel */
@@ -404,7 +410,7 @@ static PyTypeObject Dbmtype = {
404410

405411
/*[clinic input]
406412
407-
dbm.open as dbmopen
413+
_dbm.open as dbmopen
408414
409415
filename: str
410416
The filename to open.
@@ -425,7 +431,7 @@ Return a database object.
425431
static PyObject *
426432
dbmopen_impl(PyModuleDef *module, const char *filename, const char *flags,
427433
int mode)
428-
/*[clinic end generated code: output=e8d4b36f25c733fd input=6499ab0fab1333ac]*/
434+
/*[clinic end generated code: output=e8d4b36f25c733fd input=226334bade5764e6]*/
429435
{
430436
int iflags;
431437

0 commit comments

Comments
 (0)