blob: 23ec8315d03e204e8adc7f95e91957777c38afaf [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)
Guido van Rossum77eecfa1997-07-17 22:56:01 +000060#define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
61 { PyErr_SetString(DbmError, "GDBM object has already been closed"); \
62 return NULL; }
63
64
Guido van Rossum4b4c6641994-08-08 08:06:37 +000065
Roger E. Masseb15bef81996-12-17 19:55:33 +000066static PyObject *DbmError;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000067
Roger E. Masseb15bef81996-12-17 19:55:33 +000068static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +000069newdbmobject(file, flags, mode)
Roger E. Masseb15bef81996-12-17 19:55:33 +000070 char *file;
71int flags;
72int mode;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000073{
74 dbmobject *dp;
75
Roger E. Masseb15bef81996-12-17 19:55:33 +000076 dp = PyObject_NEW(dbmobject, &Dbmtype);
Guido van Rossum4b4c6641994-08-08 08:06:37 +000077 if (dp == NULL)
78 return NULL;
79 dp->di_size = -1;
Guido van Rossumb045afc1995-03-14 15:04:40 +000080 errno = 0;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000081 if ( (dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +000082 if (errno != 0)
83 PyErr_SetFromErrno(DbmError);
84 else
85 PyErr_SetString(DbmError,
86 (char *) gdbm_strerror(gdbm_errno));
87 Py_DECREF(dp);
88 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000089 }
Roger E. Masseb15bef81996-12-17 19:55:33 +000090 return (PyObject *)dp;
Guido van Rossum4b4c6641994-08-08 08:06:37 +000091}
92
93/* Methods */
94
95static void
96dbm_dealloc(dp)
97 register dbmobject *dp;
98{
99 if ( dp->di_dbm )
Roger E. Masseb15bef81996-12-17 19:55:33 +0000100 gdbm_close(dp->di_dbm);
101 PyMem_DEL(dp);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000102}
103
104static int
105dbm_length(dp)
106 dbmobject *dp;
107{
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000108 if (dp->di_dbm == NULL) {
109 PyErr_SetString(DbmError, "GDBM object has already been closed");
110 return -1;
111 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000112 if ( dp->di_size < 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000113 datum key,okey;
114 int size;
115 okey.dsize=0;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000116
Roger E. Masseb15bef81996-12-17 19:55:33 +0000117 size = 0;
118 for ( key=gdbm_firstkey(dp->di_dbm); key.dptr;
119 key = gdbm_nextkey(dp->di_dbm,okey)) {
120 size++;
121 if(okey.dsize) free(okey.dptr);
122 okey=key;
123 }
124 dp->di_size = size;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000125 }
126 return dp->di_size;
127}
128
Roger E. Masseb15bef81996-12-17 19:55:33 +0000129static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000130dbm_subscript(dp, key)
131 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000132register PyObject *key;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000133{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000134 PyObject *v;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000135 datum drec, krec;
136
Roger E. Masseb15bef81996-12-17 19:55:33 +0000137 if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000138 return NULL;
139
140 drec = gdbm_fetch(dp->di_dbm, krec);
141 if ( drec.dptr == 0 ) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000142 PyErr_SetString(PyExc_KeyError,
143 PyString_AS_STRING((PyStringObject *)key));
144 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000145 }
Roger E. Masseb15bef81996-12-17 19:55:33 +0000146 v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
Guido van Rossumb045afc1995-03-14 15:04:40 +0000147 free(drec.dptr);
148 return v;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000149}
150
151static int
152dbm_ass_sub(dp, v, w)
153 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000154PyObject *v, *w;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000155{
156 datum krec, drec;
157
Roger E. Masseb15bef81996-12-17 19:55:33 +0000158 if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
159 PyErr_SetString(PyExc_TypeError,
160 "gdbm mappings have string indices only");
161 return -1;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000162 }
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000163 if (dp->di_dbm == NULL) {
164 PyErr_SetString(DbmError, "GDBM object has already been closed");
165 return -1;
166 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000167 dp->di_size = -1;
168 if (w == NULL) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000169 if ( gdbm_delete(dp->di_dbm, krec) < 0 ) {
170 PyErr_SetString(PyExc_KeyError,
171 PyString_AS_STRING((PyStringObject *)v));
172 return -1;
173 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000174 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000175 if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) {
176 PyErr_SetString(PyExc_TypeError,
177 "gdbm mappings have string elements only");
178 return -1;
179 }
180 errno = 0;
181 if ( gdbm_store(dp->di_dbm, krec, drec, GDBM_REPLACE) < 0 ) {
182 if (errno != 0)
183 PyErr_SetFromErrno(DbmError);
184 else
185 PyErr_SetString(DbmError,
186 (char *) gdbm_strerror(gdbm_errno));
187 return -1;
188 }
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000189 }
190 return 0;
191}
192
Roger E. Masseb15bef81996-12-17 19:55:33 +0000193static PyMappingMethods dbm_as_mapping = {
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000194 (inquiry)dbm_length, /*mp_length*/
195 (binaryfunc)dbm_subscript, /*mp_subscript*/
196 (objobjargproc)dbm_ass_sub, /*mp_ass_subscript*/
197};
198
Roger E. Masseb15bef81996-12-17 19:55:33 +0000199static PyObject *
Guido van Rossum807b7be1995-07-07 22:37:11 +0000200dbm_close(dp, args)
201 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000202PyObject *args;
Guido van Rossum807b7be1995-07-07 22:37:11 +0000203{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000204 if ( !PyArg_NoArgs(args) )
Guido van Rossum807b7be1995-07-07 22:37:11 +0000205 return NULL;
206 if ( dp->di_dbm )
207 gdbm_close(dp->di_dbm);
208 dp->di_dbm = NULL;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000209 Py_INCREF(Py_None);
210 return Py_None;
Guido van Rossum807b7be1995-07-07 22:37:11 +0000211}
212
Roger E. Masseb15bef81996-12-17 19:55:33 +0000213static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000214dbm_keys(dp, args)
215 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000216PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000217{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000218 register PyObject *v, *item;
Guido van Rossum3be71401996-07-21 02:32:44 +0000219 datum key, nextkey;
Guido van Rossum66017aa1995-08-28 02:58:00 +0000220 int err;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000221
222 if (dp == NULL || !is_dbmobject(dp)) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000223 PyErr_BadInternalCall();
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000224 return NULL;
225 }
Guido van Rossum3be71401996-07-21 02:32:44 +0000226
Roger E. Masseb15bef81996-12-17 19:55:33 +0000227 if (!PyArg_NoArgs(args))
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000228 return NULL;
Guido van Rossum3be71401996-07-21 02:32:44 +0000229
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000230 check_dbmobject_open(dp);
231
Roger E. Masseb15bef81996-12-17 19:55:33 +0000232 v = PyList_New(0);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000233 if (v == NULL)
234 return NULL;
Guido van Rossum3be71401996-07-21 02:32:44 +0000235
236 key = gdbm_firstkey(dp->di_dbm);
237 while (key.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000238 item = PyString_FromStringAndSize(key.dptr, key.dsize);
239 if (item == NULL) {
240 free(key.dptr);
241 Py_DECREF(v);
242 return NULL;
243 }
244 err = PyList_Append(v, item);
245 Py_DECREF(item);
246 if (err != 0) {
247 free(key.dptr);
248 Py_DECREF(v);
249 return NULL;
250 }
251 nextkey = gdbm_nextkey(dp->di_dbm, key);
Guido van Rossum3be71401996-07-21 02:32:44 +0000252 free(key.dptr);
Roger E. Masseb15bef81996-12-17 19:55:33 +0000253 key = nextkey;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000254 }
Guido van Rossum3be71401996-07-21 02:32:44 +0000255
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000256 return v;
257}
258
Roger E. Masseb15bef81996-12-17 19:55:33 +0000259static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000260dbm_has_key(dp, args)
261 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000262PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000263{
Guido van Rossumb045afc1995-03-14 15:04:40 +0000264 datum key;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000265
Roger E. Masseb15bef81996-12-17 19:55:33 +0000266 if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000267 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000268 check_dbmobject_open(dp);
Roger E. Masseb15bef81996-12-17 19:55:33 +0000269 return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000270}
271
Roger E. Masseb15bef81996-12-17 19:55:33 +0000272static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000273dbm_firstkey(dp, args)
274 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000275PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000276{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000277 register PyObject *v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000278 datum key;
279
Roger E. Masseb15bef81996-12-17 19:55:33 +0000280 if (!PyArg_NoArgs(args))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000281 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000282 check_dbmobject_open(dp);
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000283 key = gdbm_firstkey(dp->di_dbm);
284 if (key.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000285 v = PyString_FromStringAndSize(key.dptr, key.dsize);
286 free(key.dptr);
287 return v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000288 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000289 Py_INCREF(Py_None);
290 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000291 }
292}
293
Roger E. Masseb15bef81996-12-17 19:55:33 +0000294static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000295dbm_nextkey(dp, args)
296 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000297PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000298{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000299 register PyObject *v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000300 datum key, nextkey;
301
Roger E. Masseb15bef81996-12-17 19:55:33 +0000302 if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000303 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000304 check_dbmobject_open(dp);
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000305 nextkey = gdbm_nextkey(dp->di_dbm, key);
306 if (nextkey.dptr) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000307 v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
308 free(nextkey.dptr);
309 return v;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000310 } else {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000311 Py_INCREF(Py_None);
312 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000313 }
314}
315
Roger E. Masseb15bef81996-12-17 19:55:33 +0000316static PyObject *
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000317dbm_reorganize(dp, args)
318 register dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000319PyObject *args;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000320{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000321 if (!PyArg_NoArgs(args))
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000322 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000323 check_dbmobject_open(dp);
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000324 errno = 0;
325 if (gdbm_reorganize(dp->di_dbm) < 0) {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000326 if (errno != 0)
327 PyErr_SetFromErrno(DbmError);
328 else
329 PyErr_SetString(DbmError,
330 (char *) gdbm_strerror(gdbm_errno));
331 return NULL;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000332 }
Roger E. Masseb15bef81996-12-17 19:55:33 +0000333 Py_INCREF(Py_None);
334 return Py_None;
Guido van Rossumfbd30e91995-03-16 16:07:34 +0000335}
336
Roger E. Massee5a9c8f1997-03-25 17:39:56 +0000337static PyObject *
338dbm_sync(dp, args)
339 register dbmobject *dp;
340 PyObject *args;
341{
342 if (!PyArg_NoArgs(args))
343 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000344 check_dbmobject_open(dp);
Roger E. Massee5a9c8f1997-03-25 17:39:56 +0000345 gdbm_sync(dp->di_dbm);
346 Py_INCREF(Py_None);
347 return Py_None;
348}
349
Roger E. Masseb15bef81996-12-17 19:55:33 +0000350static PyMethodDef dbm_methods[] = {
351 {"close", (PyCFunction)dbm_close},
352 {"keys", (PyCFunction)dbm_keys},
353 {"has_key", (PyCFunction)dbm_has_key},
354 {"firstkey", (PyCFunction)dbm_firstkey},
355 {"nextkey", (PyCFunction)dbm_nextkey},
356 {"reorganize", (PyCFunction)dbm_reorganize},
Roger E. Massee5a9c8f1997-03-25 17:39:56 +0000357 {"sync", (PyCFunction)dbm_sync},
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000358 {NULL, NULL} /* sentinel */
359};
360
Roger E. Masseb15bef81996-12-17 19:55:33 +0000361static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000362dbm_getattr(dp, name)
363 dbmobject *dp;
Roger E. Masseb15bef81996-12-17 19:55:33 +0000364char *name;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000365{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000366 return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000367}
368
Roger E. Masseb15bef81996-12-17 19:55:33 +0000369static PyTypeObject Dbmtype = {
370 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000371 0,
Guido van Rossum807b7be1995-07-07 22:37:11 +0000372 "gdbm",
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000373 sizeof(dbmobject),
374 0,
Roger E. Masseb15bef81996-12-17 19:55:33 +0000375 (destructor)dbm_dealloc, /*tp_dealloc*/
376 0, /*tp_print*/
377 (getattrfunc)dbm_getattr, /*tp_getattr*/
378 0, /*tp_setattr*/
379 0, /*tp_compare*/
380 0, /*tp_repr*/
381 0, /*tp_as_number*/
382 0, /*tp_as_sequence*/
383 &dbm_as_mapping, /*tp_as_mapping*/
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000384};
385
386/* ----------------------------------------------------------------- */
387
Roger E. Masseb15bef81996-12-17 19:55:33 +0000388static PyObject *
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000389dbmopen(self, args)
Roger E. Masseb15bef81996-12-17 19:55:33 +0000390 PyObject *self;
391PyObject *args;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000392{
Roger E. Masseb15bef81996-12-17 19:55:33 +0000393 char *name;
394 char *flags = "r ";
395 int iflags;
396 int mode = 0666;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000397
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000398/* XXXX add other flags. 2nd character can be "f" meaning open in fast mode. */
Roger E. Masseb15bef81996-12-17 19:55:33 +0000399 if ( !PyArg_ParseTuple(args, "s|si", &name, &flags, &mode) )
400 return NULL;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000401 switch (flags[0]) {
402 case 'r':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000403 iflags = GDBM_READER;
404 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000405 case 'w':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000406 iflags = GDBM_WRITER;
407 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000408 case 'c':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000409 iflags = GDBM_WRCREAT;
410 break;
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000411 case 'n':
Roger E. Masseb15bef81996-12-17 19:55:33 +0000412 iflags = GDBM_NEWDB;
413 break;
414 default:
415 PyErr_SetString(DbmError,
416 "Flags should be one of 'r', 'w', 'c' or 'n'");
417 return NULL;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000418 }
Guido van Rossume36e1fe1996-01-26 21:08:01 +0000419 if (flags[1] == 'f')
Roger E. Masseb15bef81996-12-17 19:55:33 +0000420 iflags |= GDBM_FAST;
421 return newdbmobject(name, iflags, mode);
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000422}
423
Roger E. Masseb15bef81996-12-17 19:55:33 +0000424static PyMethodDef dbmmodule_methods[] = {
425 { "open", (PyCFunction)dbmopen, 1 },
426 { 0, 0 },
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000427};
428
429void
430initgdbm() {
Roger E. Masseb15bef81996-12-17 19:55:33 +0000431 PyObject *m, *d;
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000432
Roger E. Masseb15bef81996-12-17 19:55:33 +0000433 m = Py_InitModule("gdbm", dbmmodule_methods);
434 d = PyModule_GetDict(m);
435 DbmError = PyString_FromString("gdbm.error");
436 if ( DbmError == NULL || PyDict_SetItemString(d, "error", DbmError) )
437 Py_FatalError("can't define gdbm.error");
Guido van Rossum4b4c6641994-08-08 08:06:37 +0000438}