blob: 6cace286ef57f837ff6cc169e912cb59176e9cf7 [file] [log] [blame]
Guido van Rossum4b4c6641994-08-08 08:06:37 +00001/* GDBM module, hacked from the still-breathing corpse of the
2 DBM module by anthony.baxter@aaii.oz.au. Original copyright
3 follows:
4*/
5/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00006Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7The Netherlands.
Guido van Rossum4b4c6641994-08-08 08:06:37 +00008
9 All Rights Reserved
10
Guido van Rossumd266eb41996-10-25 14:44:06 +000011Permission to use, copy, modify, and distribute this software and its
12documentation for any purpose and without fee is hereby granted,
Guido van Rossum4b4c6641994-08-08 08:06:37 +000013provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000014both that copyright notice and this permission notice appear in
Guido van Rossum4b4c6641994-08-08 08:06:37 +000015supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000016Centrum or CWI or Corporation for National Research Initiatives or
17CNRI not be used in advertising or publicity pertaining to
18distribution of the software without specific, written prior
19permission.
Guido van Rossum4b4c6641994-08-08 08:06:37 +000020
Guido van Rossumd266eb41996-10-25 14:44:06 +000021While CWI is the initial source for this software, a modified version
22is made available by the Corporation for National Research Initiatives
23(CNRI) at the Internet address ftp://ftp.python.org.
24
25STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
26REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
27MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
28CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
29DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
30PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
31TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
32PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum4b4c6641994-08-08 08:06:37 +000033
34******************************************************************/
Roger E. Massee5a9c8f1997-03-25 17:39:56 +000035/*****************************************************************
36 Modification History:
Guido van Rossum4b4c6641994-08-08 08:06:37 +000037
Roger E. Massee5a9c8f1997-03-25 17:39:56 +000038 Added support for 'gdbm_sync' method. Roger E. Masse 3/25/97
39
40 *****************************************************************/
Guido van Rossum4b4c6641994-08-08 08:06:37 +000041/* DBM module using dictionary interface */
42
43
Roger E. Masseb15bef81996-12-17 19:55:33 +000044#include "Python.h"
Guido van Rossum4b4c6641994-08-08 08:06:37 +000045
46#include <sys/types.h>
47#include <sys/stat.h>
48#include <fcntl.h>
49#include "gdbm.h"
50
51typedef struct {
Roger E. Masseb15bef81996-12-17 19:55:33 +000052 PyObject_HEAD
Guido van Rossum4b4c6641994-08-08 08:06:37 +000053 int di_size; /* -1 means recompute */
54 GDBM_FILE di_dbm;
55} dbmobject;
56
Roger E. Masseb15bef81996-12-17 19:55:33 +000057staticforward PyTypeObject Dbmtype;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000058
59#define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
60
Roger E. Masseb15bef81996-12-17 19:55:33 +000061static PyObject *DbmError;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000062
Roger E. Masseb15bef81996-12-17 19:55:33 +000063static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +000064newdbmobject(file, flags, mode)
Roger E. Masseb15bef81996-12-17 19:55:33 +000065 char *file;
66int flags;
67int mode;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000068{
69 dbmobject *dp;
70
Roger E. Masseb15bef81996-12-17 19:55:33 +000071 dp = PyObject_NEW(dbmobject, &Dbmtype);
Guido van Rossum4b4c6641994-08-08 08:06:37 +000072 if (dp == NULL)
73 return NULL;
74 dp->di_size = -1;
Guido van Rossumb045afc1995-03-14 15:04:40 +000075 errno = 0;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000076 if ( (dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +000077 if (errno != 0)
78 PyErr_SetFromErrno(DbmError);
79 else
80 PyErr_SetString(DbmError,
81 (char *) gdbm_strerror(gdbm_errno));
82 Py_DECREF(dp);
83 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000084 }
Roger E. Masseb15bef81996-12-17 19:55:33 +000085 return (PyObject *)dp;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000086}
87
88/* Methods */
89
90static void
91dbm_dealloc(dp)
92 register dbmobject *dp;
93{
94 if ( dp->di_dbm )
Roger E. Masseb15bef81996-12-17 19:55:33 +000095 gdbm_close(dp->di_dbm);
96 PyMem_DEL(dp);
Guido van Rossum4b4c6641994-08-08 08:06:37 +000097}
98
99static int
100dbm_length(dp)
101 dbmobject *dp;
102{
103 if ( dp->di_size < 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000104 datum key,okey;
105 int size;
106 okey.dsize=0;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000107
Roger E. Masseb15bef81996-12-17 19:55:33 +0000108 size = 0;
109 for ( key=gdbm_firstkey(dp->di_dbm); key.dptr;
110 key = gdbm_nextkey(dp->di_dbm,okey)) {
111 size++;
112 if(okey.dsize) free(okey.dptr);
113 okey=key;
114 }
115 dp->di_size = size;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000116 }
117 return dp->di_size;
118}
119
Roger E. Masseb15bef81996-12-17 19:55:33 +0000120static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000121dbm_subscript(dp, key)
122 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000123register PyObject *key;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000124{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000125 PyObject *v;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000126 datum drec, krec;
127
Roger E. Masseb15bef81996-12-17 19:55:33 +0000128 if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000129 return NULL;
130
131 drec = gdbm_fetch(dp->di_dbm, krec);
132 if ( drec.dptr == 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000133 PyErr_SetString(PyExc_KeyError,
134 PyString_AS_STRING((PyStringObject *)key));
135 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000136 }
Roger E. Masseb15bef81996-12-17 19:55:33 +0000137 v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
Guido van Rossumb045afc1995-03-14 15:04:40 +0000138 free(drec.dptr);
139 return v;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000140}
141
142static int
143dbm_ass_sub(dp, v, w)
144 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000145PyObject *v, *w;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000146{
147 datum krec, drec;
148
Roger E. Masseb15bef81996-12-17 19:55:33 +0000149 if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
150 PyErr_SetString(PyExc_TypeError,
151 "gdbm mappings have string indices only");
152 return -1;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000153 }
154 dp->di_size = -1;
155 if (w == NULL) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000156 if ( gdbm_delete(dp->di_dbm, krec) < 0 ) {
157 PyErr_SetString(PyExc_KeyError,
158 PyString_AS_STRING((PyStringObject *)v));
159 return -1;
160 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000161 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000162 if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) {
163 PyErr_SetString(PyExc_TypeError,
164 "gdbm mappings have string elements only");
165 return -1;
166 }
167 errno = 0;
168 if ( gdbm_store(dp->di_dbm, krec, drec, GDBM_REPLACE) < 0 ) {
169 if (errno != 0)
170 PyErr_SetFromErrno(DbmError);
171 else
172 PyErr_SetString(DbmError,
173 (char *) gdbm_strerror(gdbm_errno));
174 return -1;
175 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000176 }
177 return 0;
178}
179
Roger E. Masseb15bef81996-12-17 19:55:33 +0000180static PyMappingMethods dbm_as_mapping = {
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000181 (inquiry)dbm_length, /*mp_length*/
182 (binaryfunc)dbm_subscript, /*mp_subscript*/
183 (objobjargproc)dbm_ass_sub, /*mp_ass_subscript*/
184};
185
Roger E. Masseb15bef81996-12-17 19:55:33 +0000186static PyObject *
Guido van Rossum807b7be1995-07-07 22:37:11 +0000187dbm_close(dp, args)
188 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000189PyObject *args;
Guido van Rossum807b7be1995-07-07 22:37:11 +0000190{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000191 if ( !PyArg_NoArgs(args) )
Guido van Rossum807b7be1995-07-07 22:37:11 +0000192 return NULL;
193 if ( dp->di_dbm )
194 gdbm_close(dp->di_dbm);
195 dp->di_dbm = NULL;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000196 Py_INCREF(Py_None);
197 return Py_None;
Guido van Rossum807b7be1995-07-07 22:37:11 +0000198}
199
Roger E. Masseb15bef81996-12-17 19:55:33 +0000200static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000201dbm_keys(dp, args)
202 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000203PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000204{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000205 register PyObject *v, *item;
Guido van Rossum3be71401996-07-21 02:32:44 +0000206 datum key, nextkey;
Guido van Rossum66017aa1995-08-28 02:58:00 +0000207 int err;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000208
209 if (dp == NULL || !is_dbmobject(dp)) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000210 PyErr_BadInternalCall();
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000211 return NULL;
212 }
Guido van Rossum3be71401996-07-21 02:32:44 +0000213
Roger E. Masseb15bef81996-12-17 19:55:33 +0000214 if (!PyArg_NoArgs(args))
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000215 return NULL;
Guido van Rossum3be71401996-07-21 02:32:44 +0000216
Roger E. Masseb15bef81996-12-17 19:55:33 +0000217 v = PyList_New(0);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000218 if (v == NULL)
219 return NULL;
Guido van Rossum3be71401996-07-21 02:32:44 +0000220
221 key = gdbm_firstkey(dp->di_dbm);
222 while (key.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000223 item = PyString_FromStringAndSize(key.dptr, key.dsize);
224 if (item == NULL) {
225 free(key.dptr);
226 Py_DECREF(v);
227 return NULL;
228 }
229 err = PyList_Append(v, item);
230 Py_DECREF(item);
231 if (err != 0) {
232 free(key.dptr);
233 Py_DECREF(v);
234 return NULL;
235 }
236 nextkey = gdbm_nextkey(dp->di_dbm, key);
Guido van Rossum3be71401996-07-21 02:32:44 +0000237 free(key.dptr);
Roger E. Masseb15bef81996-12-17 19:55:33 +0000238 key = nextkey;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000239 }
Guido van Rossum3be71401996-07-21 02:32:44 +0000240
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000241 return v;
242}
243
Roger E. Masseb15bef81996-12-17 19:55:33 +0000244static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000245dbm_has_key(dp, args)
246 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000247PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000248{
Guido van Rossumb045afc1995-03-14 15:04:40 +0000249 datum key;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000250
Roger E. Masseb15bef81996-12-17 19:55:33 +0000251 if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000252 return NULL;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000253 return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000254}
255
Roger E. Masseb15bef81996-12-17 19:55:33 +0000256static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000257dbm_firstkey(dp, args)
258 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000259PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000260{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000261 register PyObject *v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000262 datum key;
263
Roger E. Masseb15bef81996-12-17 19:55:33 +0000264 if (!PyArg_NoArgs(args))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000265 return NULL;
266 key = gdbm_firstkey(dp->di_dbm);
267 if (key.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000268 v = PyString_FromStringAndSize(key.dptr, key.dsize);
269 free(key.dptr);
270 return v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000271 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000272 Py_INCREF(Py_None);
273 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000274 }
275}
276
Roger E. Masseb15bef81996-12-17 19:55:33 +0000277static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000278dbm_nextkey(dp, args)
279 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000280PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000281{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000282 register PyObject *v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000283 datum key, nextkey;
284
Roger E. Masseb15bef81996-12-17 19:55:33 +0000285 if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000286 return NULL;
287 nextkey = gdbm_nextkey(dp->di_dbm, key);
288 if (nextkey.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000289 v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
290 free(nextkey.dptr);
291 return v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000292 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000293 Py_INCREF(Py_None);
294 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000295 }
296}
297
Roger E. Masseb15bef81996-12-17 19:55:33 +0000298static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000299dbm_reorganize(dp, args)
300 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000301PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000302{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000303 if (!PyArg_NoArgs(args))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000304 return NULL;
305 errno = 0;
306 if (gdbm_reorganize(dp->di_dbm) < 0) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000307 if (errno != 0)
308 PyErr_SetFromErrno(DbmError);
309 else
310 PyErr_SetString(DbmError,
311 (char *) gdbm_strerror(gdbm_errno));
312 return NULL;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000313 }
Roger E. Masseb15bef81996-12-17 19:55:33 +0000314 Py_INCREF(Py_None);
315 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000316}
317
Roger E. Massee5a9c8f1997-03-25 17:39:56 +0000318static PyObject *
319dbm_sync(dp, args)
320 register dbmobject *dp;
321 PyObject *args;
322{
323 if (!PyArg_NoArgs(args))
324 return NULL;
325 gdbm_sync(dp->di_dbm);
326 Py_INCREF(Py_None);
327 return Py_None;
328}
329
Roger E. Masseb15bef81996-12-17 19:55:33 +0000330static PyMethodDef dbm_methods[] = {
331 {"close", (PyCFunction)dbm_close},
332 {"keys", (PyCFunction)dbm_keys},
333 {"has_key", (PyCFunction)dbm_has_key},
334 {"firstkey", (PyCFunction)dbm_firstkey},
335 {"nextkey", (PyCFunction)dbm_nextkey},
336 {"reorganize", (PyCFunction)dbm_reorganize},
Roger E. Massee5a9c8f1997-03-25 17:39:56 +0000337 {"sync", (PyCFunction)dbm_sync},
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000338 {NULL, NULL} /* sentinel */
339};
340
Roger E. Masseb15bef81996-12-17 19:55:33 +0000341static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000342dbm_getattr(dp, name)
343 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000344char *name;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000345{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000346 return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000347}
348
Roger E. Masseb15bef81996-12-17 19:55:33 +0000349static PyTypeObject Dbmtype = {
350 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000351 0,
Guido van Rossum807b7be1995-07-07 22:37:11 +0000352 "gdbm",
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000353 sizeof(dbmobject),
354 0,
Roger E. Masseb15bef81996-12-17 19:55:33 +0000355 (destructor)dbm_dealloc, /*tp_dealloc*/
356 0, /*tp_print*/
357 (getattrfunc)dbm_getattr, /*tp_getattr*/
358 0, /*tp_setattr*/
359 0, /*tp_compare*/
360 0, /*tp_repr*/
361 0, /*tp_as_number*/
362 0, /*tp_as_sequence*/
363 &dbm_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000364};
365
366/* ----------------------------------------------------------------- */
367
Roger E. Masseb15bef81996-12-17 19:55:33 +0000368static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000369dbmopen(self, args)
Roger E. Masseb15bef81996-12-17 19:55:33 +0000370 PyObject *self;
371PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000372{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000373 char *name;
374 char *flags = "r ";
375 int iflags;
376 int mode = 0666;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000377
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000378/* XXXX add other flags. 2nd character can be "f" meaning open in fast mode. */
Roger E. Masseb15bef81996-12-17 19:55:33 +0000379 if ( !PyArg_ParseTuple(args, "s|si", &name, &flags, &mode) )
380 return NULL;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000381 switch (flags[0]) {
382 case 'r':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000383 iflags = GDBM_READER;
384 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000385 case 'w':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000386 iflags = GDBM_WRITER;
387 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000388 case 'c':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000389 iflags = GDBM_WRCREAT;
390 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000391 case 'n':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000392 iflags = GDBM_NEWDB;
393 break;
394 default:
395 PyErr_SetString(DbmError,
396 "Flags should be one of 'r', 'w', 'c' or 'n'");
397 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000398 }
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000399 if (flags[1] == 'f')
Roger E. Masseb15bef81996-12-17 19:55:33 +0000400 iflags |= GDBM_FAST;
401 return newdbmobject(name, iflags, mode);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000402}
403
Roger E. Masseb15bef81996-12-17 19:55:33 +0000404static PyMethodDef dbmmodule_methods[] = {
405 { "open", (PyCFunction)dbmopen, 1 },
406 { 0, 0 },
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000407};
408
409void
410initgdbm() {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000411 PyObject *m, *d;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000412
Roger E. Masseb15bef81996-12-17 19:55:33 +0000413 m = Py_InitModule("gdbm", dbmmodule_methods);
414 d = PyModule_GetDict(m);
415 DbmError = PyString_FromString("gdbm.error");
416 if ( DbmError == NULL || PyDict_SetItemString(d, "error", DbmError) )
417 Py_FatalError("can't define gdbm.error");
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000418}