annotate Modules/bsddbmodule.c @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents 65d2d8e67da3
children e74b607a5996
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /***********************************************************
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 The Netherlands.
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 All Rights Reserved
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
8 documentation for any purpose and without fee is hereby granted,
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 provided that the above copyright notice appear in all copies and that
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
10 both that copyright notice and this permission notice appear in
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
12 Centrum or CWI or Corporation for National Research Initiatives or
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
13 CNRI not be used in advertising or publicity pertaining to
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
14 distribution of the software without specific, written prior
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
15 permission.
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
17 While CWI is the initial source for this software, a modified version
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
18 is made available by the Corporation for National Research Initiatives
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
19 (CNRI) at the Internet address ftp://ftp.python.org.
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
20
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4295
diff changeset
28 PERFORMANCE OF THIS SOFTWARE.
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 ******************************************************************/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 /* Berkeley DB interface.
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 Author: Michael McLay
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 Hacked: Guido van Rossum
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 Btree and Recno additions plus sequence methods: David Ely
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 XXX To do:
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 - provide interface to the B-tree and record libraries too
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 - provide a way to access the various hash functions
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 - support more open flags
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
43 #include "Python.h"
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 #include <sys/types.h>
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 #include <sys/stat.h>
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 #include <fcntl.h>
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 #include <db.h>
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 /* Please don't include internal header files of the Berkeley db package
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 (it messes up the info required in the Setup file) */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 typedef struct {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
53 PyObject_HEAD
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 DB *di_bsddb;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 int di_size; /* -1 means recompute */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 } bsddbobject;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
58 staticforward PyTypeObject Bsddbtype;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #define is_bsddbobject(v) ((v)->ob_type == &Bsddbtype)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
62 static PyObject *BsddbError;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
64 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 newdbhashobject(file, flags, mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 bsize, ffactor, nelem, cachesize, hash, lorder)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 int flags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 int mode;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 int bsize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 int ffactor;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 int nelem;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 int cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 int hash; /* XXX ignored */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 int lorder;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 bsddbobject *dp;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 HASHINFO info;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
80 if ((dp = PyObject_NEW(bsddbobject, &Bsddbtype)) == NULL)
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 info.bsize = bsize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 info.ffactor = ffactor;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 info.nelem = nelem;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 info.cachesize = cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 info.hash = NULL; /* XXX should derive from hash argument */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 info.lorder = lorder;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
4295
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
90 #ifdef O_BINARY
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
91 flags |= O_BINARY;
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
92 #endif
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 if ((dp->di_bsddb = dbopen(file, flags, mode, DB_HASH, &info)) == NULL) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
94 PyErr_SetFromErrno(BsddbError);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
95 Py_DECREF(dp);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 dp->di_size = -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
101 return (PyObject *)dp;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
104 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 newdbbtobject(file, flags, mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 btflags, cachesize, maxkeypage, minkeypage, psize, lorder)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 int flags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 int mode;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 int btflags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 int cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 int maxkeypage;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 int minkeypage;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 int psize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 int lorder;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 bsddbobject *dp;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 BTREEINFO info;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
120 if ((dp = PyObject_NEW(bsddbobject, &Bsddbtype)) == NULL)
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 info.flags = btflags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 info.cachesize = cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 info.maxkeypage = maxkeypage;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 info.minkeypage = minkeypage;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 info.psize = psize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 info.lorder = lorder;
4295
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
129 info.compare = 0; /* Use default comparison functions, for now..*/
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 info.prefix = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
4295
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
132 #ifdef O_BINARY
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
133 flags |= O_BINARY;
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
134 #endif
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if ((dp->di_bsddb = dbopen(file, flags, mode, DB_BTREE, &info)) == NULL) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
136 PyErr_SetFromErrno(BsddbError);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
137 Py_DECREF(dp);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 dp->di_size = -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
143 return (PyObject *)dp;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
146 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 newdbrnobject(file, flags, mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 rnflags, cachesize, psize, lorder, reclen, bval, bfname)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 int flags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 int mode;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 int rnflags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 int cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 int psize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 int lorder;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 size_t reclen;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 u_char bval;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 char *bfname;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 bsddbobject *dp;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 RECNOINFO info;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
163 if ((dp = PyObject_NEW(bsddbobject, &Bsddbtype)) == NULL)
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 info.flags = rnflags;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 info.cachesize = cachesize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 info.psize = psize;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 info.lorder = lorder;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 info.reclen = reclen;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 info.bval = bval;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 info.bfname = bfname;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173
4295
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
174 #ifdef O_BINARY
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
175 flags |= O_BINARY;
008b9fc565bf Force O_BINARY in flags if defined, for e.g. Microsoft platforms.
Guido van Rossum <guido@python.org>
parents: 4294
diff changeset
176 #endif
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 if ((dp->di_bsddb = dbopen(file, flags, mode, DB_RECNO, &info)) == NULL) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
178 PyErr_SetFromErrno(BsddbError);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
179 Py_DECREF(dp);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 dp->di_size = -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
185 return (PyObject *)dp;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 static void
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 bsddb_dealloc(dp)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 bsddbobject *dp;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 if (dp->di_bsddb != NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 if ((dp->di_bsddb->close)(dp->di_bsddb) != 0)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 fprintf(stderr,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 "Python bsddb: close errno %s in dealloc\n", errno);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
198 PyMem_DEL(dp);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 static int
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 bsddb_length(dp)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 bsddbobject *dp;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 if (dp->di_size < 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 int size = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 for (status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec,R_FIRST);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 status == 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_NEXT))
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 size++;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 if (status < 0) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
214 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 return -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 dp->di_size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 return dp->di_size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
222 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 bsddb_subscript(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
225 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 int status;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
228 PyObject *v;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 char *data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 int size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
233 if (!PyArg_Parse(key, "s#", &data, &size))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 krec.data = data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 krec.size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 if (status != 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 if (status < 0)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
241 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
243 PyErr_SetObject(PyExc_KeyError, key);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
247 return PyString_FromStringAndSize((char *)drec.data, (int)drec.size);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 static int
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 bsddb_ass_sub(dp, key, value)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
253 PyObject *key, *value;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 char *data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 int size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
260 if (!PyArg_Parse(key, "s#", &data, &size)) {
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
261 PyErr_SetString(PyExc_TypeError, "bsddb key type must be string");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 return -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 krec.data = data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 krec.size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 dp->di_size = -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 if (value == NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 status = (dp->di_bsddb->del)(dp->di_bsddb, &krec, 0);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 else {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
271 if (!PyArg_Parse(value, "s#", &data, &size)) {
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
272 PyErr_SetString(PyExc_TypeError, "bsddb value type must be string");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 return -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 drec.data = data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 drec.size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 status = (dp->di_bsddb->put)(dp->di_bsddb, &krec, &drec, 0);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 if (status != 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 if (status < 0)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
281 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
283 PyErr_SetObject(PyExc_KeyError, key);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 return -1;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 return 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
289 static PyMappingMethods bsddb_as_mapping = {
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 (inquiry)bsddb_length, /*mp_length*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 (binaryfunc)bsddb_subscript, /*mp_subscript*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 (objobjargproc)bsddb_ass_sub, /*mp_ass_subscript*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 };
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
295 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 bsddb_close(dp, args)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
298 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
300 if (!PyArg_NoArgs(args))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 if (dp->di_bsddb != NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 if ((dp->di_bsddb->close)(dp->di_bsddb) != 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 dp->di_bsddb = NULL;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
305 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 dp->di_bsddb = NULL;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
310 Py_INCREF(Py_None);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
311 return Py_None;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
314 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 bsddb_keys(dp, args)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
317 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
319 PyObject *list, *item;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 int err;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
324 if (!PyArg_NoArgs(args))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 return NULL;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
326 list = PyList_New(0);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 if (list == NULL)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 for (status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_FIRST);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 status == 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_NEXT)) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
332 item = PyString_FromStringAndSize((char *)krec.data, (int)krec.size);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 if (item == NULL) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
334 Py_DECREF(list);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
337 err = PyList_Append(list, item);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
338 Py_DECREF(item);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 if (err != 0) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
340 Py_DECREF(list);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 if (status < 0) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
345 PyErr_SetFromErrno(BsddbError);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
346 Py_DECREF(list);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 if (dp->di_size < 0)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
350 dp->di_size = PyList_Size(list); /* We just did the work for this... */
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 return list;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
354 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 bsddb_has_key(dp, args)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
357 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 char *data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 int size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
364 if (!PyArg_Parse(args, "s#", &data, &size))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 krec.data = data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 krec.size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 if (status < 0) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
371 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
375 return PyInt_FromLong(status == 0);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
378 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 bsddb_set_location(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
381 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 int status;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
384 PyObject *v;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 char *data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 int size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
389 if (!PyArg_Parse(key, "s#", &data, &size))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 krec.data = data;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 krec.size = size;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 if (status != 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 if (status < 0)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
397 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
399 PyErr_SetObject(PyExc_KeyError, key);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
403 return Py_BuildValue("s#s#", krec.data, krec.size, drec.data, drec.size);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
406 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 bsddb_seq(dp, args, sequence_request)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
409 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 int sequence_request;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 DBT krec, drec;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
415 if (!PyArg_NoArgs(args))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 krec.data = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 krec.size = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, sequence_request);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 if (status != 0) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 if (status < 0)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
424 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
426 PyErr_SetObject(PyExc_KeyError, args);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
430 return Py_BuildValue("s#s#", krec.data, krec.size, drec.data, drec.size);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
433 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 bsddb_next(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
436 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 return bsddb_seq(dp, key, R_NEXT);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
440 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 bsddb_previous(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
443 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 return bsddb_seq(dp, key, R_PREV);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
447 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 bsddb_first(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
450 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 return bsddb_seq(dp, key, R_FIRST);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
454 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 bsddb_last(dp, key)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
457 PyObject *key;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 return bsddb_seq(dp, key, R_LAST);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
461 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 bsddb_sync(dp, args)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 bsddbobject *dp;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
464 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 int status;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 status = (dp->di_bsddb->sync)(dp->di_bsddb, 0);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 if (status != 0) {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
470 PyErr_SetFromErrno(BsddbError);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
473 return PyInt_FromLong(status = 0);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 }
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
475 static PyMethodDef bsddb_methods[] = {
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
476 {"close", (PyCFunction)bsddb_close},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
477 {"keys", (PyCFunction)bsddb_keys},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
478 {"has_key", (PyCFunction)bsddb_has_key},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
479 {"set_location", (PyCFunction)bsddb_set_location},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
480 {"next", (PyCFunction)bsddb_next},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
481 {"previous", (PyCFunction)bsddb_previous},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
482 {"first", (PyCFunction)bsddb_first},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
483 {"last", (PyCFunction)bsddb_last},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
484 {"sync", (PyCFunction)bsddb_sync},
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 {NULL, NULL} /* sentinel */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 };
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
488 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 bsddb_getattr(dp, name)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
490 PyObject *dp;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 char *name;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
493 return Py_FindMethod(bsddb_methods, dp, name);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
496 static PyTypeObject Bsddbtype = {
4294
520ddcb3d5d6 Dynamically initialize ob_type field, for Windows DLL
Guido van Rossum <guido@python.org>
parents: 3803
diff changeset
497 PyObject_HEAD_INIT(NULL)
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 0,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 "bsddb",
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 sizeof(bsddbobject),
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 0,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 (destructor)bsddb_dealloc, /*tp_dealloc*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 0, /*tp_print*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 (getattrfunc)bsddb_getattr, /*tp_getattr*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 0, /*tp_setattr*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 0, /*tp_compare*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 0, /*tp_repr*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 0, /*tp_as_number*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 0, /*tp_as_sequence*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 &bsddb_as_mapping, /*tp_as_mapping*/
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 };
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
513 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 bsdhashopen(self, args)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
515 PyObject *self;
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
516 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 char *flag = NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 int flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 int mode = 0666;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 int bsize = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 int ffactor = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 int nelem = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 int cachesize = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 int hash = 0; /* XXX currently ignored */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 int lorder = 0;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
529 if (!PyArg_ParseTuple(args, "s|siiiiiii",
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 &file, &flag, &mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 &bsize, &ffactor, &nelem, &cachesize, &hash, &lorder))
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 if (flag != NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 /* XXX need a way to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 else if (flag[0] == 'w')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 flags = O_RDWR;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 else if (flag[0] == 'c')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 flags = O_RDWR|O_CREAT;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
541 else if (flag[0] == 'n')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542 flags = O_RDWR|O_CREAT|O_TRUNC;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 else {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
544 PyErr_SetString(BsddbError,
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 "Flag should begin with 'r', 'w', 'c' or 'n'");
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 if (flag[1] == 'l') {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 #if defined(O_EXLOCK) && defined(O_SHLOCK)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 flags |= O_SHLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 else
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 flags |= O_EXLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 #else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
555 PyErr_SetString(BsddbError, "locking not supported on this platform");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 #endif
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 return newdbhashobject(file, flags, mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 bsize, ffactor, nelem, cachesize, hash, lorder);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
563
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
564 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 bsdbtopen(self, args)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
566 PyObject *self;
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
567 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
569 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 char *flag = NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
571 int flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 int mode = 0666;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 int cachesize = 0;
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
574 int maxkeypage = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
575 int minkeypage = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
576 int btflags = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
577 unsigned int psize = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
578 int lorder = 0;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
580 if (!PyArg_ParseTuple(args, "s|siiiiiii",
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
581 &file, &flag, &mode,
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
582 &btflags, &cachesize, &maxkeypage, &minkeypage,
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
583 &psize, &lorder))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
585 if (flag != NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 /* XXX need a way to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
589 else if (flag[0] == 'w')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 flags = O_RDWR;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 else if (flag[0] == 'c')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
592 flags = O_RDWR|O_CREAT;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 else if (flag[0] == 'n')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 flags = O_RDWR|O_CREAT|O_TRUNC;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 else {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
596 PyErr_SetString(BsddbError,
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 "Flag should begin with 'r', 'w', 'c' or 'n'");
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 if (flag[1] == 'l') {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 #if defined(O_EXLOCK) && defined(O_SHLOCK)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 flags |= O_SHLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 else
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 flags |= O_EXLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 #else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
607 PyErr_SetString(BsddbError, "locking not supported on this platform");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 #endif
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 return newdbbtobject(file, flags, mode,
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
613 btflags, cachesize, maxkeypage, minkeypage,
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
614 psize, lorder);
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 }
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
616
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
617 static PyObject *
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 bsdrnopen(self, args)
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
619 PyObject *self;
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
620 PyObject *args;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 char *file;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623 char *flag = NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 int flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 int mode = 0666;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 int cachesize = 0;
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
627 int rnflags = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
628 unsigned int psize = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
629 int lorder = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
630 size_t reclen = 0;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
631 char *bval = "";
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
632 char *bfname = NULL;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
634 if (!PyArg_ParseTuple(args, "s|siiiiiiss",
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
635 &file, &flag, &mode,
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
636 &rnflags, &cachesize, &psize, &lorder,
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
637 &reclen, &bval, &bfname))
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639 if (flag != NULL) {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 /* XXX need a way to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 flags = O_RDONLY;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 else if (flag[0] == 'w')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 flags = O_RDWR;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 else if (flag[0] == 'c')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 flags = O_RDWR|O_CREAT;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 else if (flag[0] == 'n')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 flags = O_RDWR|O_CREAT|O_TRUNC;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 else {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
650 PyErr_SetString(BsddbError,
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 "Flag should begin with 'r', 'w', 'c' or 'n'");
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 if (flag[1] == 'l') {
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 #if defined(O_EXLOCK) && defined(O_SHLOCK)
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 if (flag[0] == 'r')
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 flags |= O_SHLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 else
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 flags |= O_EXLOCK;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 #else
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
661 PyErr_SetString(BsddbError, "locking not supported on this platform");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 return NULL;
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 #endif
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 }
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
665 else if (flag[1] != '\0') {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
666 PyErr_SetString(BsddbError,
3600
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
667 "Flag char 2 should be 'l' or absent");
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
668 return NULL;
7c5711a6a475 Be more careful about default args.
Guido van Rossum <guido@python.org>
parents: 3034
diff changeset
669 }
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 return newdbrnobject(file, flags, mode,
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
672 rnflags, cachesize, psize, lorder, bval[0], bfname);
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 }
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
675 static PyMethodDef bsddbmodule_methods[] = {
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
676 {"hashopen", (PyCFunction)bsdhashopen, 1},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
677 {"btopen", (PyCFunction)bsdbtopen, 1},
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
678 {"rnopen", (PyCFunction)bsdrnopen, 1},
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 {0, 0},
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 };
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 void
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 initbsddb() {
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
684 PyObject *m, *d;
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685
4294
520ddcb3d5d6 Dynamically initialize ob_type field, for Windows DLL
Guido van Rossum <guido@python.org>
parents: 3803
diff changeset
686 Bsddbtype.ob_type = &PyType_Type;
3803
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
687 m = Py_InitModule("bsddb", bsddbmodule_methods);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
688 d = PyModule_GetDict(m);
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
689 BsddbError = PyString_FromString("bsddb.error");
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
690 if (BsddbError == NULL || PyDict_SetItemString(d, "error", BsddbError))
2eaa00860edc Converted to new style names by Skip Montanaro
Guido van Rossum <guido@python.org>
parents: 3600
diff changeset
691 Py_FatalError("can't define bsddb.error");
3034
b838d2b95201 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 }