blob: 48c221e7eb332fa9837fee25d702c03b6a02236a [file] [log] [blame]
Guido van Rossum1100dca1995-08-30 23:43:03 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum1100dca1995-08-30 23:43:03 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1100dca1995-08-30 23:43:03 +00009******************************************************************/
10
11/* Berkeley DB interface.
12 Author: Michael McLay
13 Hacked: Guido van Rossum
14 Btree and Recno additions plus sequence methods: David Ely
15
16 XXX To do:
17 - provide interface to the B-tree and record libraries too
18 - provide a way to access the various hash functions
19 - support more open flags
Guido van Rossum675e9941999-09-20 13:28:18 +000020
21 The windows port of the Berkeley DB code is hard to find on the web:
22 www.nightmare.com/software.html
23*/
Guido van Rossum1100dca1995-08-30 23:43:03 +000024
Guido van Rossumdfe8ad91996-07-24 00:51:20 +000025#include "Python.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000026#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +000027#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000028#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +000029
30#include <sys/types.h>
31#include <sys/stat.h>
32#include <fcntl.h>
Fred Drakec9cb8472000-08-31 16:11:07 +000033#ifdef HAVE_DB_185_H
34#include <db_185.h>
35#else
Guido van Rossum1100dca1995-08-30 23:43:03 +000036#include <db.h>
Fred Drakec9cb8472000-08-31 16:11:07 +000037#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +000038/* Please don't include internal header files of the Berkeley db package
39 (it messes up the info required in the Setup file) */
40
41typedef struct {
Roger E. Massed9240d11997-01-16 22:05:33 +000042 PyObject_HEAD
43 DB *di_bsddb;
44 int di_size; /* -1 means recompute */
Guido van Rossum4f199ea1998-04-09 20:56:35 +000045#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +000046 PyThread_type_lock di_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +000047#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +000048} bsddbobject;
49
Guido van Rossumdfe8ad91996-07-24 00:51:20 +000050staticforward PyTypeObject Bsddbtype;
Guido van Rossum1100dca1995-08-30 23:43:03 +000051
52#define is_bsddbobject(v) ((v)->ob_type == &Bsddbtype)
Guido van Rossum77eecfa1997-07-17 22:56:01 +000053#define check_bsddbobject_open(v) if ((v)->di_bsddb == NULL) \
54 { PyErr_SetString(BsddbError, "BSDDB object has already been closed"); \
55 return NULL; }
Guido van Rossum1100dca1995-08-30 23:43:03 +000056
Guido van Rossumdfe8ad91996-07-24 00:51:20 +000057static PyObject *BsddbError;
Guido van Rossum1100dca1995-08-30 23:43:03 +000058
Guido van Rossumdfe8ad91996-07-24 00:51:20 +000059static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +000060newdbhashobject(char *file, int flags, int mode,
61 int bsize, int ffactor, int nelem, int cachesize, int hash, int lorder)
Guido van Rossum1100dca1995-08-30 23:43:03 +000062{
Roger E. Massed9240d11997-01-16 22:05:33 +000063 bsddbobject *dp;
64 HASHINFO info;
Guido van Rossum1100dca1995-08-30 23:43:03 +000065
Guido van Rossumb18618d2000-05-03 23:44:39 +000066 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL)
Roger E. Massed9240d11997-01-16 22:05:33 +000067 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +000068
Roger E. Massed9240d11997-01-16 22:05:33 +000069 info.bsize = bsize;
70 info.ffactor = ffactor;
71 info.nelem = nelem;
72 info.cachesize = cachesize;
73 info.hash = NULL; /* XXX should derive from hash argument */
74 info.lorder = lorder;
Guido van Rossum1100dca1995-08-30 23:43:03 +000075
Guido van Rossum6beb4791996-09-11 23:22:25 +000076#ifdef O_BINARY
Roger E. Massed9240d11997-01-16 22:05:33 +000077 flags |= O_BINARY;
Guido van Rossum6beb4791996-09-11 23:22:25 +000078#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +000079 Py_BEGIN_ALLOW_THREADS
80 dp->di_bsddb = dbopen(file, flags, mode, DB_HASH, &info);
81 Py_END_ALLOW_THREADS
82 if (dp->di_bsddb == NULL) {
Roger E. Massed9240d11997-01-16 22:05:33 +000083 PyErr_SetFromErrno(BsddbError);
Guido van Rossum4f199ea1998-04-09 20:56:35 +000084#ifdef WITH_THREAD
85 dp->di_lock = NULL;
86#endif
Roger E. Massed9240d11997-01-16 22:05:33 +000087 Py_DECREF(dp);
88 return NULL;
89 }
Guido van Rossum1100dca1995-08-30 23:43:03 +000090
Roger E. Massed9240d11997-01-16 22:05:33 +000091 dp->di_size = -1;
Guido van Rossum4f199ea1998-04-09 20:56:35 +000092#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +000093 dp->di_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +000094 if (dp->di_lock == NULL) {
95 PyErr_SetString(BsddbError, "can't allocate lock");
96 Py_DECREF(dp);
97 return NULL;
98 }
99#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +0000100
Roger E. Massed9240d11997-01-16 22:05:33 +0000101 return (PyObject *)dp;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000102}
103
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000104static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000105newdbbtobject(char *file, int flags, int mode,
106 int btflags, int cachesize, int maxkeypage, int minkeypage, int psize, int lorder)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000107{
Roger E. Massed9240d11997-01-16 22:05:33 +0000108 bsddbobject *dp;
109 BTREEINFO info;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000110
Guido van Rossumb18618d2000-05-03 23:44:39 +0000111 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL)
Roger E. Massed9240d11997-01-16 22:05:33 +0000112 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000113
Roger E. Massed9240d11997-01-16 22:05:33 +0000114 info.flags = btflags;
115 info.cachesize = cachesize;
116 info.maxkeypage = maxkeypage;
117 info.minkeypage = minkeypage;
118 info.psize = psize;
119 info.lorder = lorder;
120 info.compare = 0; /* Use default comparison functions, for now..*/
121 info.prefix = 0;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000122
Guido van Rossum6beb4791996-09-11 23:22:25 +0000123#ifdef O_BINARY
Roger E. Massed9240d11997-01-16 22:05:33 +0000124 flags |= O_BINARY;
Guido van Rossum6beb4791996-09-11 23:22:25 +0000125#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000126 Py_BEGIN_ALLOW_THREADS
127 dp->di_bsddb = dbopen(file, flags, mode, DB_BTREE, &info);
128 Py_END_ALLOW_THREADS
129 if (dp->di_bsddb == NULL) {
Roger E. Massed9240d11997-01-16 22:05:33 +0000130 PyErr_SetFromErrno(BsddbError);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000131#ifdef WITH_THREAD
132 dp->di_lock = NULL;
133#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000134 Py_DECREF(dp);
135 return NULL;
136 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000137
Roger E. Massed9240d11997-01-16 22:05:33 +0000138 dp->di_size = -1;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000139#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000140 dp->di_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000141 if (dp->di_lock == NULL) {
142 PyErr_SetString(BsddbError, "can't allocate lock");
143 Py_DECREF(dp);
144 return NULL;
145 }
146#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +0000147
Roger E. Massed9240d11997-01-16 22:05:33 +0000148 return (PyObject *)dp;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000149}
150
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000151static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000152newdbrnobject(char *file, int flags, int mode,
153 int rnflags, int cachesize, int psize, int lorder, size_t reclen, u_char bval, char *bfname)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000154{
Roger E. Massed9240d11997-01-16 22:05:33 +0000155 bsddbobject *dp;
156 RECNOINFO info;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000157
Guido van Rossumb18618d2000-05-03 23:44:39 +0000158 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL)
Roger E. Massed9240d11997-01-16 22:05:33 +0000159 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000160
Roger E. Massed9240d11997-01-16 22:05:33 +0000161 info.flags = rnflags;
162 info.cachesize = cachesize;
163 info.psize = psize;
164 info.lorder = lorder;
165 info.reclen = reclen;
166 info.bval = bval;
167 info.bfname = bfname;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000168
Guido van Rossum6beb4791996-09-11 23:22:25 +0000169#ifdef O_BINARY
Roger E. Massed9240d11997-01-16 22:05:33 +0000170 flags |= O_BINARY;
Guido van Rossum6beb4791996-09-11 23:22:25 +0000171#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000172 Py_BEGIN_ALLOW_THREADS
173 dp->di_bsddb = dbopen(file, flags, mode, DB_RECNO, &info);
174 Py_END_ALLOW_THREADS
175 if (dp->di_bsddb == NULL) {
Roger E. Massed9240d11997-01-16 22:05:33 +0000176 PyErr_SetFromErrno(BsddbError);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000177#ifdef WITH_THREAD
178 dp->di_lock = NULL;
179#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000180 Py_DECREF(dp);
181 return NULL;
182 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000183
Roger E. Massed9240d11997-01-16 22:05:33 +0000184 dp->di_size = -1;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000185#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000186 dp->di_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000187 if (dp->di_lock == NULL) {
188 PyErr_SetString(BsddbError, "can't allocate lock");
189 Py_DECREF(dp);
190 return NULL;
191 }
192#endif
Guido van Rossum1100dca1995-08-30 23:43:03 +0000193
Roger E. Massed9240d11997-01-16 22:05:33 +0000194 return (PyObject *)dp;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000195}
196
Guido van Rossum1100dca1995-08-30 23:43:03 +0000197static void
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000198bsddb_dealloc(bsddbobject *dp)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000199{
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000200#ifdef WITH_THREAD
201 if (dp->di_lock) {
Guido van Rossum65d5b571998-12-21 19:32:43 +0000202 PyThread_acquire_lock(dp->di_lock, 0);
203 PyThread_release_lock(dp->di_lock);
204 PyThread_free_lock(dp->di_lock);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205 dp->di_lock = NULL;
206 }
207#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000208 if (dp->di_bsddb != NULL) {
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000209 int status;
210 Py_BEGIN_ALLOW_THREADS
211 status = (dp->di_bsddb->close)(dp->di_bsddb);
212 Py_END_ALLOW_THREADS
213 if (status != 0)
Roger E. Massed9240d11997-01-16 22:05:33 +0000214 fprintf(stderr,
215 "Python bsddb: close errno %d in dealloc\n",
216 errno);
217 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000218 PyObject_Del(dp);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000219}
220
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000221#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000222#define BSDDB_BGN_SAVE(_dp) Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(_dp->di_lock,1);
223#define BSDDB_END_SAVE(_dp) PyThread_release_lock(_dp->di_lock); Py_END_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000224#else
225#define BSDDB_BGN_SAVE(_dp) Py_BEGIN_ALLOW_THREADS
226#define BSDDB_END_SAVE(_dp) Py_END_ALLOW_THREADS
227#endif
228
Guido van Rossum1100dca1995-08-30 23:43:03 +0000229static int
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000230bsddb_length(bsddbobject *dp)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000231{
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000232 if (dp->di_bsddb == NULL) {
233 PyErr_SetString(BsddbError, "BSDDB object has already been closed");
234 return -1;
235 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000236 if (dp->di_size < 0) {
237 DBT krec, drec;
238 int status;
239 int size = 0;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000240 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000241 for (status = (dp->di_bsddb->seq)(dp->di_bsddb,
242 &krec, &drec,R_FIRST);
243 status == 0;
244 status = (dp->di_bsddb->seq)(dp->di_bsddb,
245 &krec, &drec, R_NEXT))
246 size++;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000247 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000248 if (status < 0) {
249 PyErr_SetFromErrno(BsddbError);
250 return -1;
251 }
252 dp->di_size = size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000253 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000254 return dp->di_size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000255}
256
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000257static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000258bsddb_subscript(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000259{
Roger E. Massed9240d11997-01-16 22:05:33 +0000260 int status;
261 DBT krec, drec;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000262 char *data,buf[4096];
Roger E. Massed9240d11997-01-16 22:05:33 +0000263 int size;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000264 PyObject *result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000265
Roger E. Massed9240d11997-01-16 22:05:33 +0000266 if (!PyArg_Parse(key, "s#", &data, &size))
267 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000268 check_bsddbobject_open(dp);
269
Roger E. Massed9240d11997-01-16 22:05:33 +0000270 krec.data = data;
271 krec.size = size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000272
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000273 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000274 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000275 if (status == 0) {
276 if (drec.size > sizeof(buf)) data = malloc(drec.size);
277 else data = buf;
278 memcpy(data,drec.data,drec.size);
279 }
280 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000281 if (status != 0) {
282 if (status < 0)
283 PyErr_SetFromErrno(BsddbError);
284 else
285 PyErr_SetObject(PyExc_KeyError, key);
286 return NULL;
287 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000288
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000289 result = PyString_FromStringAndSize(data, (int)drec.size);
290 if (data != buf) free(data);
291 return result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000292}
293
294static int
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000295bsddb_ass_sub(bsddbobject *dp, PyObject *key, PyObject *value)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000296{
Roger E. Massed9240d11997-01-16 22:05:33 +0000297 int status;
298 DBT krec, drec;
299 char *data;
300 int size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000301
Roger E. Massed9240d11997-01-16 22:05:33 +0000302 if (!PyArg_Parse(key, "s#", &data, &size)) {
303 PyErr_SetString(PyExc_TypeError,
304 "bsddb key type must be string");
305 return -1;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000306 }
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000307 if (dp->di_bsddb == NULL) {
308 PyErr_SetString(BsddbError, "BSDDB object has already been closed");
309 return -1;
310 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000311 krec.data = data;
312 krec.size = size;
313 dp->di_size = -1;
314 if (value == NULL) {
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000315 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000316 status = (dp->di_bsddb->del)(dp->di_bsddb, &krec, 0);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000317 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000318 }
319 else {
320 if (!PyArg_Parse(value, "s#", &data, &size)) {
321 PyErr_SetString(PyExc_TypeError,
322 "bsddb value type must be string");
323 return -1;
324 }
325 drec.data = data;
326 drec.size = size;
327#if 0
328 /* For RECNO, put fails with 'No space left on device'
329 after a few short records are added?? Looks fine
330 to this point... linked with 1.85 on Solaris Intel
331 Roger E. Masse 1/16/97
332 */
333 printf("before put data: '%s', size: %d\n",
334 drec.data, drec.size);
335 printf("before put key= '%s', size= %d\n",
336 krec.data, krec.size);
337#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000338 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000339 status = (dp->di_bsddb->put)(dp->di_bsddb, &krec, &drec, 0);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000340 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000341 }
342 if (status != 0) {
343 if (status < 0)
344 PyErr_SetFromErrno(BsddbError);
345 else
346 PyErr_SetObject(PyExc_KeyError, key);
347 return -1;
348 }
349 return 0;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000350}
351
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000352static PyMappingMethods bsddb_as_mapping = {
Roger E. Massed9240d11997-01-16 22:05:33 +0000353 (inquiry)bsddb_length, /*mp_length*/
354 (binaryfunc)bsddb_subscript, /*mp_subscript*/
355 (objobjargproc)bsddb_ass_sub, /*mp_ass_subscript*/
Guido van Rossum1100dca1995-08-30 23:43:03 +0000356};
357
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000358static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000359bsddb_close(bsddbobject *dp, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000360{
Roger E. Massed9240d11997-01-16 22:05:33 +0000361 if (!PyArg_NoArgs(args))
362 return NULL;
363 if (dp->di_bsddb != NULL) {
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000364 int status;
365 BSDDB_BGN_SAVE(dp)
366 status = (dp->di_bsddb->close)(dp->di_bsddb);
367 BSDDB_END_SAVE(dp)
368 if (status != 0) {
Roger E. Massed9240d11997-01-16 22:05:33 +0000369 dp->di_bsddb = NULL;
370 PyErr_SetFromErrno(BsddbError);
371 return NULL;
372 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000373 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000374 dp->di_bsddb = NULL;
375 Py_INCREF(Py_None);
376 return Py_None;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000377}
378
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000379static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000380bsddb_keys(bsddbobject *dp, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000381{
Roger E. Massed9240d11997-01-16 22:05:33 +0000382 PyObject *list, *item;
383 DBT krec, drec;
Guido van Rossum730806d1998-04-10 22:27:42 +0000384 char *data=NULL,buf[4096];
Roger E. Massed9240d11997-01-16 22:05:33 +0000385 int status;
386 int err;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000387
Roger E. Massed9240d11997-01-16 22:05:33 +0000388 if (!PyArg_NoArgs(args))
389 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000390 check_bsddbobject_open(dp);
Roger E. Massed9240d11997-01-16 22:05:33 +0000391 list = PyList_New(0);
392 if (list == NULL)
393 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000394 BSDDB_BGN_SAVE(dp)
395 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_FIRST);
396 if (status == 0) {
397 if (krec.size > sizeof(buf)) data = malloc(krec.size);
398 else data = buf;
399 memcpy(data,krec.data,krec.size);
400 }
401 BSDDB_END_SAVE(dp)
402 while (status == 0) {
403 item = PyString_FromStringAndSize(data, (int)krec.size);
404 if (data != buf) free(data);
Roger E. Massed9240d11997-01-16 22:05:33 +0000405 if (item == NULL) {
406 Py_DECREF(list);
407 return NULL;
408 }
409 err = PyList_Append(list, item);
410 Py_DECREF(item);
411 if (err != 0) {
412 Py_DECREF(list);
413 return NULL;
414 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000415 BSDDB_BGN_SAVE(dp)
416 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_NEXT);
417 if (status == 0) {
418 if (krec.size > sizeof(buf)) data = malloc(krec.size);
419 else data = buf;
420 memcpy(data,krec.data,krec.size);
421 }
422 BSDDB_END_SAVE(dp)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000423 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000424 if (status < 0) {
425 PyErr_SetFromErrno(BsddbError);
426 Py_DECREF(list);
427 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000428 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000429 if (dp->di_size < 0)
430 dp->di_size = PyList_Size(list); /* We just did the work */
431 return list;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000432}
433
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000434static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000435bsddb_has_key(bsddbobject *dp, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000436{
Roger E. Massed9240d11997-01-16 22:05:33 +0000437 DBT krec, drec;
438 int status;
439 char *data;
440 int size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000441
Roger E. Massed9240d11997-01-16 22:05:33 +0000442 if (!PyArg_Parse(args, "s#", &data, &size))
443 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000444 check_bsddbobject_open(dp);
Roger E. Massed9240d11997-01-16 22:05:33 +0000445 krec.data = data;
446 krec.size = size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000447
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000448 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000449 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000450 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000451 if (status < 0) {
452 PyErr_SetFromErrno(BsddbError);
453 return NULL;
454 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000455
Roger E. Massed9240d11997-01-16 22:05:33 +0000456 return PyInt_FromLong(status == 0);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000457}
458
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000459static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000460bsddb_set_location(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000461{
Roger E. Massed9240d11997-01-16 22:05:33 +0000462 int status;
463 DBT krec, drec;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000464 char *data,buf[4096];
Roger E. Massed9240d11997-01-16 22:05:33 +0000465 int size;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000466 PyObject *result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000467
Roger E. Massed9240d11997-01-16 22:05:33 +0000468 if (!PyArg_Parse(key, "s#", &data, &size))
469 return NULL;
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000470 check_bsddbobject_open(dp);
Roger E. Massed9240d11997-01-16 22:05:33 +0000471 krec.data = data;
472 krec.size = size;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000473
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000474 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000475 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000476 if (status == 0) {
477 if (drec.size > sizeof(buf)) data = malloc(drec.size);
478 else data = buf;
479 memcpy(data,drec.data,drec.size);
480 }
481 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000482 if (status != 0) {
483 if (status < 0)
484 PyErr_SetFromErrno(BsddbError);
485 else
486 PyErr_SetObject(PyExc_KeyError, key);
487 return NULL;
488 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000489
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000490 result = Py_BuildValue("s#s#", krec.data, krec.size, data, drec.size);
491 if (data != buf) free(data);
492 return result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000493}
494
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000495static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000496bsddb_seq(bsddbobject *dp, PyObject *args, int sequence_request)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000497{
Roger E. Massed9240d11997-01-16 22:05:33 +0000498 int status;
499 DBT krec, drec;
Guido van Rossum730806d1998-04-10 22:27:42 +0000500 char *kdata=NULL,kbuf[4096];
501 char *ddata=NULL,dbuf[4096];
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000502 PyObject *result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000503
Roger E. Massed9240d11997-01-16 22:05:33 +0000504 if (!PyArg_NoArgs(args))
505 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000506
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000507 check_bsddbobject_open(dp);
Roger E. Massed9240d11997-01-16 22:05:33 +0000508 krec.data = 0;
509 krec.size = 0;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000510
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000511 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000512 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec,
513 &drec, sequence_request);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000514 if (status == 0) {
515 if (krec.size > sizeof(kbuf)) kdata = malloc(krec.size);
516 else kdata = kbuf;
517 memcpy(kdata,krec.data,krec.size);
518 if (drec.size > sizeof(dbuf)) ddata = malloc(drec.size);
519 else ddata = dbuf;
520 memcpy(ddata,drec.data,drec.size);
521 }
522 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000523 if (status != 0) {
524 if (status < 0)
525 PyErr_SetFromErrno(BsddbError);
526 else
527 PyErr_SetObject(PyExc_KeyError, args);
528 return NULL;
529 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000530
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000531 result = Py_BuildValue("s#s#", kdata, krec.size, ddata, drec.size);
532 if (kdata != kbuf) free(kdata);
533 if (ddata != dbuf) free(ddata);
534 return result;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000535}
536
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000537static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000538bsddb_next(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000539{
Roger E. Massed9240d11997-01-16 22:05:33 +0000540 return bsddb_seq(dp, key, R_NEXT);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000541}
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000542static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000543bsddb_previous(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000544{
Roger E. Massed9240d11997-01-16 22:05:33 +0000545 return bsddb_seq(dp, key, R_PREV);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000546}
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000547static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000548bsddb_first(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000549{
Roger E. Massed9240d11997-01-16 22:05:33 +0000550 return bsddb_seq(dp, key, R_FIRST);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000551}
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000552static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000553bsddb_last(bsddbobject *dp, PyObject *key)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000554{
Roger E. Massed9240d11997-01-16 22:05:33 +0000555 return bsddb_seq(dp, key, R_LAST);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000556}
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000557static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000558bsddb_sync(bsddbobject *dp, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000559{
Roger E. Massed9240d11997-01-16 22:05:33 +0000560 int status;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000561
Guido van Rossum77eecfa1997-07-17 22:56:01 +0000562 if (!PyArg_NoArgs(args))
563 return NULL;
564 check_bsddbobject_open(dp);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000565 BSDDB_BGN_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000566 status = (dp->di_bsddb->sync)(dp->di_bsddb, 0);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000567 BSDDB_END_SAVE(dp)
Roger E. Massed9240d11997-01-16 22:05:33 +0000568 if (status != 0) {
569 PyErr_SetFromErrno(BsddbError);
570 return NULL;
571 }
572 return PyInt_FromLong(status = 0);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000573}
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000574static PyMethodDef bsddb_methods[] = {
Roger E. Massed9240d11997-01-16 22:05:33 +0000575 {"close", (PyCFunction)bsddb_close},
576 {"keys", (PyCFunction)bsddb_keys},
577 {"has_key", (PyCFunction)bsddb_has_key},
578 {"set_location", (PyCFunction)bsddb_set_location},
579 {"next", (PyCFunction)bsddb_next},
580 {"previous", (PyCFunction)bsddb_previous},
581 {"first", (PyCFunction)bsddb_first},
582 {"last", (PyCFunction)bsddb_last},
583 {"sync", (PyCFunction)bsddb_sync},
584 {NULL, NULL} /* sentinel */
Guido van Rossum1100dca1995-08-30 23:43:03 +0000585};
586
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000587static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000588bsddb_getattr(PyObject *dp, char *name)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000589{
Roger E. Massed9240d11997-01-16 22:05:33 +0000590 return Py_FindMethod(bsddb_methods, dp, name);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000591}
592
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000593static PyTypeObject Bsddbtype = {
Roger E. Massed9240d11997-01-16 22:05:33 +0000594 PyObject_HEAD_INIT(NULL)
595 0,
596 "bsddb",
597 sizeof(bsddbobject),
598 0,
599 (destructor)bsddb_dealloc, /*tp_dealloc*/
600 0, /*tp_print*/
601 (getattrfunc)bsddb_getattr, /*tp_getattr*/
602 0, /*tp_setattr*/
603 0, /*tp_compare*/
604 0, /*tp_repr*/
605 0, /*tp_as_number*/
606 0, /*tp_as_sequence*/
607 &bsddb_as_mapping, /*tp_as_mapping*/
Guido van Rossum1100dca1995-08-30 23:43:03 +0000608};
609
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000610static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000611bsdhashopen(PyObject *self, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000612{
Roger E. Massed9240d11997-01-16 22:05:33 +0000613 char *file;
614 char *flag = NULL;
615 int flags = O_RDONLY;
616 int mode = 0666;
617 int bsize = 0;
618 int ffactor = 0;
619 int nelem = 0;
620 int cachesize = 0;
621 int hash = 0; /* XXX currently ignored */
622 int lorder = 0;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000623
Guido van Rossum43713e52000-02-29 13:59:29 +0000624 if (!PyArg_ParseTuple(args, "s|siiiiiii:hashopen",
Roger E. Massed9240d11997-01-16 22:05:33 +0000625 &file, &flag, &mode,
626 &bsize, &ffactor, &nelem, &cachesize,
627 &hash, &lorder))
628 return NULL;
629 if (flag != NULL) {
630 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
631 if (flag[0] == 'r')
632 flags = O_RDONLY;
633 else if (flag[0] == 'w')
634 flags = O_RDWR;
635 else if (flag[0] == 'c')
636 flags = O_RDWR|O_CREAT;
637 else if (flag[0] == 'n')
638 flags = O_RDWR|O_CREAT|O_TRUNC;
639 else {
640 PyErr_SetString(BsddbError,
641 "Flag should begin with 'r', 'w', 'c' or 'n'");
642 return NULL;
643 }
644 if (flag[1] == 'l') {
Guido van Rossum1100dca1995-08-30 23:43:03 +0000645#if defined(O_EXLOCK) && defined(O_SHLOCK)
Roger E. Massed9240d11997-01-16 22:05:33 +0000646 if (flag[0] == 'r')
647 flags |= O_SHLOCK;
648 else
649 flags |= O_EXLOCK;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000650#else
Roger E. Massed9240d11997-01-16 22:05:33 +0000651 PyErr_SetString(BsddbError,
652 "locking not supported on this platform");
653 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000654#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000655 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000656 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000657 return newdbhashobject(file, flags, mode,
658 bsize, ffactor, nelem, cachesize, hash, lorder);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000659}
660
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000661static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000662bsdbtopen(PyObject *self, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000663{
Roger E. Massed9240d11997-01-16 22:05:33 +0000664 char *file;
665 char *flag = NULL;
666 int flags = O_RDONLY;
667 int mode = 0666;
668 int cachesize = 0;
669 int maxkeypage = 0;
670 int minkeypage = 0;
671 int btflags = 0;
672 unsigned int psize = 0;
673 int lorder = 0;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000674
Guido van Rossum43713e52000-02-29 13:59:29 +0000675 if (!PyArg_ParseTuple(args, "s|siiiiiii:btopen",
Roger E. Massed9240d11997-01-16 22:05:33 +0000676 &file, &flag, &mode,
677 &btflags, &cachesize, &maxkeypage, &minkeypage,
678 &psize, &lorder))
679 return NULL;
680 if (flag != NULL) {
681 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
682 if (flag[0] == 'r')
683 flags = O_RDONLY;
684 else if (flag[0] == 'w')
685 flags = O_RDWR;
686 else if (flag[0] == 'c')
687 flags = O_RDWR|O_CREAT;
688 else if (flag[0] == 'n')
689 flags = O_RDWR|O_CREAT|O_TRUNC;
690 else {
691 PyErr_SetString(BsddbError,
692 "Flag should begin with 'r', 'w', 'c' or 'n'");
693 return NULL;
694 }
695 if (flag[1] == 'l') {
Guido van Rossum1100dca1995-08-30 23:43:03 +0000696#if defined(O_EXLOCK) && defined(O_SHLOCK)
Roger E. Massed9240d11997-01-16 22:05:33 +0000697 if (flag[0] == 'r')
698 flags |= O_SHLOCK;
699 else
700 flags |= O_EXLOCK;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000701#else
Roger E. Massed9240d11997-01-16 22:05:33 +0000702 PyErr_SetString(BsddbError,
703 "locking not supported on this platform");
704 return NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000705#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000706 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000707 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000708 return newdbbtobject(file, flags, mode,
709 btflags, cachesize, maxkeypage, minkeypage,
710 psize, lorder);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000711}
Guido van Rossumdd96ca71996-05-23 22:57:54 +0000712
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000713static PyObject *
Peter Schneider-Kampcb27c352000-07-10 17:06:38 +0000714bsdrnopen(PyObject *self, PyObject *args)
Guido van Rossum1100dca1995-08-30 23:43:03 +0000715{
Roger E. Massed9240d11997-01-16 22:05:33 +0000716 char *file;
717 char *flag = NULL;
718 int flags = O_RDONLY;
719 int mode = 0666;
720 int cachesize = 0;
721 int rnflags = 0;
722 unsigned int psize = 0;
723 int lorder = 0;
724 size_t reclen = 0;
725 char *bval = "";
726 char *bfname = NULL;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000727
Guido van Rossum43713e52000-02-29 13:59:29 +0000728 if (!PyArg_ParseTuple(args, "s|siiiiiiss:rnopen",
Roger E. Massed9240d11997-01-16 22:05:33 +0000729 &file, &flag, &mode,
730 &rnflags, &cachesize, &psize, &lorder,
731 &reclen, &bval, &bfname))
732 return NULL;
733
734# if 0
735 printf("file: %s\n", file);
736 printf("flag: %s\n", flag);
737 printf("mode: %d\n", mode);
738 printf("rnflags: 0x%x\n", rnflags);
739 printf("cachesize: %d\n", cachesize);
740 printf("psize: %d\n", psize);
741 printf("lorder: %d\n", 0);
742 printf("reclen: %d\n", reclen);
743 printf("bval: %c\n", bval[0]);
744 printf("bfname %s\n", bfname);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000745#endif
Roger E. Massed9240d11997-01-16 22:05:33 +0000746
747 if (flag != NULL) {
748 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
749 if (flag[0] == 'r')
750 flags = O_RDONLY;
751 else if (flag[0] == 'w')
752 flags = O_RDWR;
753 else if (flag[0] == 'c')
754 flags = O_RDWR|O_CREAT;
755 else if (flag[0] == 'n')
756 flags = O_RDWR|O_CREAT|O_TRUNC;
757 else {
758 PyErr_SetString(BsddbError,
759 "Flag should begin with 'r', 'w', 'c' or 'n'");
760 return NULL;
761 }
762 if (flag[1] == 'l') {
763#if defined(O_EXLOCK) && defined(O_SHLOCK)
764 if (flag[0] == 'r')
765 flags |= O_SHLOCK;
766 else
767 flags |= O_EXLOCK;
768#else
769 PyErr_SetString(BsddbError,
770 "locking not supported on this platform");
771 return NULL;
772#endif
773 }
774 else if (flag[1] != '\0') {
775 PyErr_SetString(BsddbError,
776 "Flag char 2 should be 'l' or absent");
777 return NULL;
778 }
Guido van Rossum1100dca1995-08-30 23:43:03 +0000779 }
Roger E. Massed9240d11997-01-16 22:05:33 +0000780 return newdbrnobject(file, flags, mode, rnflags, cachesize,
781 psize, lorder, reclen, bval[0], bfname);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000782}
783
Guido van Rossumdfe8ad91996-07-24 00:51:20 +0000784static PyMethodDef bsddbmodule_methods[] = {
Roger E. Massed9240d11997-01-16 22:05:33 +0000785 {"hashopen", (PyCFunction)bsdhashopen, 1},
786 {"btopen", (PyCFunction)bsdbtopen, 1},
787 {"rnopen", (PyCFunction)bsdrnopen, 1},
788 {0, 0},
Guido van Rossum1100dca1995-08-30 23:43:03 +0000789};
790
Guido van Rossum3886bb61998-12-04 18:50:17 +0000791DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +0000792initbsddb(void) {
Roger E. Massed9240d11997-01-16 22:05:33 +0000793 PyObject *m, *d;
Guido van Rossum1100dca1995-08-30 23:43:03 +0000794
Roger E. Massed9240d11997-01-16 22:05:33 +0000795 Bsddbtype.ob_type = &PyType_Type;
796 m = Py_InitModule("bsddb", bsddbmodule_methods);
797 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000798 BsddbError = PyErr_NewException("bsddb.error", NULL, NULL);
799 if (BsddbError != NULL)
800 PyDict_SetItemString(d, "error", BsddbError);
Guido van Rossum1100dca1995-08-30 23:43:03 +0000801}