Commit | Line | Data |
a0d0e21e |
1 | #include "EXTERN.h" |
2 | #include "perl.h" |
3 | #include "XSUB.h" |
4 | |
5 | #include <gdbm.h> |
6 | #include <fcntl.h> |
7 | |
8 | typedef GDBM_FILE GDBM_File; |
9 | |
10 | #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */ |
11 | #define gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func) \ |
12 | gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func) |
13 | |
14 | #define gdbm_FETCH(db,key) gdbm_fetch(db,key) |
15 | #define gdbm_STORE(db,key,value,flags) gdbm_store(db,key,value,flags) |
16 | #define gdbm_DELETE(db,key) gdbm_delete(db,key) |
17 | #define gdbm_FIRSTKEY(db) gdbm_firstkey(db) |
18 | #define gdbm_NEXTKEY(db,key) gdbm_nextkey(db,key) |
4633a7c4 |
19 | #define gdbm_EXISTS(db,key) gdbm_exists(db,key) |
a0d0e21e |
20 | |
21 | typedef datum gdatum; |
22 | |
12f917ad |
23 | typedef void (*FATALFUNC)(); |
a0d0e21e |
24 | |
25 | static int |
f0f333f4 |
26 | not_here(char *s) |
a0d0e21e |
27 | { |
28 | croak("GDBM_File::%s not implemented on this architecture", s); |
29 | return -1; |
30 | } |
31 | |
e50aee73 |
32 | /* Versions of gdbm prior to 1.7x might not have the gdbm_sync, |
33 | gdbm_exists, and gdbm_setopt functions. Apparently Slackware |
34 | (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991). |
35 | */ |
36 | #ifndef GDBM_FAST |
37 | #define gdbm_exists(db,key) not_here("gdbm_exists") |
38 | #define gdbm_sync(db) (void) not_here("gdbm_sync") |
39 | #define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt") |
40 | #endif |
41 | |
a0d0e21e |
42 | static double |
f0f333f4 |
43 | constant(char *name, int arg) |
a0d0e21e |
44 | { |
45 | errno = 0; |
46 | switch (*name) { |
47 | case 'A': |
48 | break; |
49 | case 'B': |
50 | break; |
51 | case 'C': |
52 | break; |
53 | case 'D': |
54 | break; |
55 | case 'E': |
56 | break; |
57 | case 'F': |
58 | break; |
59 | case 'G': |
60 | if (strEQ(name, "GDBM_CACHESIZE")) |
61 | #ifdef GDBM_CACHESIZE |
62 | return GDBM_CACHESIZE; |
63 | #else |
64 | goto not_there; |
65 | #endif |
66 | if (strEQ(name, "GDBM_FAST")) |
67 | #ifdef GDBM_FAST |
68 | return GDBM_FAST; |
69 | #else |
70 | goto not_there; |
71 | #endif |
72 | if (strEQ(name, "GDBM_FASTMODE")) |
73 | #ifdef GDBM_FASTMODE |
74 | return GDBM_FASTMODE; |
75 | #else |
76 | goto not_there; |
77 | #endif |
78 | if (strEQ(name, "GDBM_INSERT")) |
79 | #ifdef GDBM_INSERT |
80 | return GDBM_INSERT; |
81 | #else |
82 | goto not_there; |
83 | #endif |
84 | if (strEQ(name, "GDBM_NEWDB")) |
85 | #ifdef GDBM_NEWDB |
86 | return GDBM_NEWDB; |
87 | #else |
88 | goto not_there; |
89 | #endif |
90 | if (strEQ(name, "GDBM_READER")) |
91 | #ifdef GDBM_READER |
92 | return GDBM_READER; |
93 | #else |
94 | goto not_there; |
95 | #endif |
96 | if (strEQ(name, "GDBM_REPLACE")) |
97 | #ifdef GDBM_REPLACE |
98 | return GDBM_REPLACE; |
99 | #else |
100 | goto not_there; |
101 | #endif |
102 | if (strEQ(name, "GDBM_WRCREAT")) |
103 | #ifdef GDBM_WRCREAT |
104 | return GDBM_WRCREAT; |
105 | #else |
106 | goto not_there; |
107 | #endif |
108 | if (strEQ(name, "GDBM_WRITER")) |
109 | #ifdef GDBM_WRITER |
110 | return GDBM_WRITER; |
111 | #else |
112 | goto not_there; |
113 | #endif |
114 | break; |
115 | case 'H': |
116 | break; |
117 | case 'I': |
118 | break; |
119 | case 'J': |
120 | break; |
121 | case 'K': |
122 | break; |
123 | case 'L': |
124 | break; |
125 | case 'M': |
126 | break; |
127 | case 'N': |
128 | break; |
129 | case 'O': |
130 | break; |
131 | case 'P': |
132 | break; |
133 | case 'Q': |
134 | break; |
135 | case 'R': |
136 | break; |
137 | case 'S': |
138 | break; |
139 | case 'T': |
140 | break; |
141 | case 'U': |
142 | break; |
143 | case 'V': |
144 | break; |
145 | case 'W': |
146 | break; |
147 | case 'X': |
148 | break; |
149 | case 'Y': |
150 | break; |
151 | case 'Z': |
152 | break; |
153 | } |
154 | errno = EINVAL; |
155 | return 0; |
156 | |
157 | not_there: |
158 | errno = ENOENT; |
159 | return 0; |
160 | } |
161 | |
162 | MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_ |
163 | |
164 | double |
165 | constant(name,arg) |
166 | char * name |
167 | int arg |
168 | |
169 | |
170 | GDBM_File |
171 | gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak) |
172 | char * dbtype |
173 | char * name |
174 | int read_write |
175 | int mode |
176 | FATALFUNC fatal_func |
177 | |
178 | void |
179 | gdbm_close(db) |
180 | GDBM_File db |
181 | CLEANUP: |
182 | |
183 | void |
184 | gdbm_DESTROY(db) |
185 | GDBM_File db |
186 | CODE: |
187 | gdbm_close(db); |
188 | |
189 | gdatum |
190 | gdbm_FETCH(db, key) |
191 | GDBM_File db |
192 | datum key |
193 | |
194 | int |
195 | gdbm_STORE(db, key, value, flags = GDBM_REPLACE) |
196 | GDBM_File db |
197 | datum key |
198 | datum value |
199 | int flags |
200 | CLEANUP: |
201 | if (RETVAL) { |
202 | if (RETVAL < 0 && errno == EPERM) |
203 | croak("No write permission to gdbm file"); |
748a9306 |
204 | croak("gdbm store returned %d, errno %d, key \"%.*s\"", |
a0d0e21e |
205 | RETVAL,errno,key.dsize,key.dptr); |
206 | /* gdbm_clearerr(db); */ |
207 | } |
208 | |
209 | int |
210 | gdbm_DELETE(db, key) |
211 | GDBM_File db |
212 | datum key |
213 | |
214 | gdatum |
215 | gdbm_FIRSTKEY(db) |
216 | GDBM_File db |
217 | |
218 | gdatum |
219 | gdbm_NEXTKEY(db, key) |
220 | GDBM_File db |
221 | datum key |
222 | |
223 | int |
224 | gdbm_reorganize(db) |
225 | GDBM_File db |
226 | |
3b35bae3 |
227 | |
228 | void |
229 | gdbm_sync(db) |
230 | GDBM_File db |
231 | |
232 | int |
c07a80fd |
233 | gdbm_EXISTS(db, key) |
3b35bae3 |
234 | GDBM_File db |
235 | datum key |
236 | |
237 | int |
238 | gdbm_setopt (db, optflag, optval, optlen) |
239 | GDBM_File db |
240 | int optflag |
241 | int &optval |
242 | int optlen |
243 | |