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) |
19 | |
20 | typedef datum gdatum; |
21 | |
22 | typedef void (*FATALFUNC)(); |
23 | |
24 | static int |
25 | not_here(s) |
26 | char *s; |
27 | { |
28 | croak("GDBM_File::%s not implemented on this architecture", s); |
29 | return -1; |
30 | } |
31 | |
32 | static double |
33 | constant(name, arg) |
34 | char *name; |
35 | int arg; |
36 | { |
37 | errno = 0; |
38 | switch (*name) { |
39 | case 'A': |
40 | break; |
41 | case 'B': |
42 | break; |
43 | case 'C': |
44 | break; |
45 | case 'D': |
46 | break; |
47 | case 'E': |
48 | break; |
49 | case 'F': |
50 | break; |
51 | case 'G': |
52 | if (strEQ(name, "GDBM_CACHESIZE")) |
53 | #ifdef GDBM_CACHESIZE |
54 | return GDBM_CACHESIZE; |
55 | #else |
56 | goto not_there; |
57 | #endif |
58 | if (strEQ(name, "GDBM_FAST")) |
59 | #ifdef GDBM_FAST |
60 | return GDBM_FAST; |
61 | #else |
62 | goto not_there; |
63 | #endif |
64 | if (strEQ(name, "GDBM_FASTMODE")) |
65 | #ifdef GDBM_FASTMODE |
66 | return GDBM_FASTMODE; |
67 | #else |
68 | goto not_there; |
69 | #endif |
70 | if (strEQ(name, "GDBM_INSERT")) |
71 | #ifdef GDBM_INSERT |
72 | return GDBM_INSERT; |
73 | #else |
74 | goto not_there; |
75 | #endif |
76 | if (strEQ(name, "GDBM_NEWDB")) |
77 | #ifdef GDBM_NEWDB |
78 | return GDBM_NEWDB; |
79 | #else |
80 | goto not_there; |
81 | #endif |
82 | if (strEQ(name, "GDBM_READER")) |
83 | #ifdef GDBM_READER |
84 | return GDBM_READER; |
85 | #else |
86 | goto not_there; |
87 | #endif |
88 | if (strEQ(name, "GDBM_REPLACE")) |
89 | #ifdef GDBM_REPLACE |
90 | return GDBM_REPLACE; |
91 | #else |
92 | goto not_there; |
93 | #endif |
94 | if (strEQ(name, "GDBM_WRCREAT")) |
95 | #ifdef GDBM_WRCREAT |
96 | return GDBM_WRCREAT; |
97 | #else |
98 | goto not_there; |
99 | #endif |
100 | if (strEQ(name, "GDBM_WRITER")) |
101 | #ifdef GDBM_WRITER |
102 | return GDBM_WRITER; |
103 | #else |
104 | goto not_there; |
105 | #endif |
106 | break; |
107 | case 'H': |
108 | break; |
109 | case 'I': |
110 | break; |
111 | case 'J': |
112 | break; |
113 | case 'K': |
114 | break; |
115 | case 'L': |
116 | break; |
117 | case 'M': |
118 | break; |
119 | case 'N': |
120 | break; |
121 | case 'O': |
122 | break; |
123 | case 'P': |
124 | break; |
125 | case 'Q': |
126 | break; |
127 | case 'R': |
128 | break; |
129 | case 'S': |
130 | break; |
131 | case 'T': |
132 | break; |
133 | case 'U': |
134 | break; |
135 | case 'V': |
136 | break; |
137 | case 'W': |
138 | break; |
139 | case 'X': |
140 | break; |
141 | case 'Y': |
142 | break; |
143 | case 'Z': |
144 | break; |
145 | } |
146 | errno = EINVAL; |
147 | return 0; |
148 | |
149 | not_there: |
150 | errno = ENOENT; |
151 | return 0; |
152 | } |
153 | |
154 | MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_ |
155 | |
156 | double |
157 | constant(name,arg) |
158 | char * name |
159 | int arg |
160 | |
161 | |
162 | GDBM_File |
163 | gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak) |
164 | char * dbtype |
165 | char * name |
166 | int read_write |
167 | int mode |
168 | FATALFUNC fatal_func |
169 | |
170 | void |
171 | gdbm_close(db) |
172 | GDBM_File db |
173 | CLEANUP: |
174 | |
175 | void |
176 | gdbm_DESTROY(db) |
177 | GDBM_File db |
178 | CODE: |
179 | gdbm_close(db); |
180 | |
181 | gdatum |
182 | gdbm_FETCH(db, key) |
183 | GDBM_File db |
184 | datum key |
185 | |
186 | int |
187 | gdbm_STORE(db, key, value, flags = GDBM_REPLACE) |
188 | GDBM_File db |
189 | datum key |
190 | datum value |
191 | int flags |
192 | CLEANUP: |
193 | if (RETVAL) { |
194 | if (RETVAL < 0 && errno == EPERM) |
195 | croak("No write permission to gdbm file"); |
196 | warn("gdbm store returned %d, errno %d, key \"%.*s\"", |
197 | RETVAL,errno,key.dsize,key.dptr); |
198 | /* gdbm_clearerr(db); */ |
199 | } |
200 | |
201 | int |
202 | gdbm_DELETE(db, key) |
203 | GDBM_File db |
204 | datum key |
205 | |
206 | gdatum |
207 | gdbm_FIRSTKEY(db) |
208 | GDBM_File db |
209 | |
210 | gdatum |
211 | gdbm_NEXTKEY(db, key) |
212 | GDBM_File db |
213 | datum key |
214 | |
215 | int |
216 | gdbm_reorganize(db) |
217 | GDBM_File db |
218 | |