Commit | Line | Data |
---|---|---|
a0d0e21e LW |
1 | #include "EXTERN.h" |
2 | #include "perl.h" | |
3 | #include "XSUB.h" | |
4 | ||
5 | #include <gdbm.h> | |
6 | #include <fcntl.h> | |
7 | ||
9fe6733a PM |
8 | typedef struct { |
9 | GDBM_FILE dbp ; | |
10 | SV * filter_fetch_key ; | |
11 | SV * filter_store_key ; | |
12 | SV * filter_fetch_value ; | |
13 | SV * filter_store_value ; | |
14 | int filtering ; | |
15 | } GDBM_File_type; | |
16 | ||
17 | typedef GDBM_File_type * GDBM_File ; | |
18 | typedef datum datum_key ; | |
19 | typedef datum datum_value ; | |
0bf2e707 | 20 | typedef datum datum_key_copy; |
9fe6733a | 21 | |
9fe6733a | 22 | #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */ |
a0d0e21e | 23 | |
12f917ad | 24 | typedef void (*FATALFUNC)(); |
a0d0e21e | 25 | |
8063af02 | 26 | #ifndef GDBM_FAST |
a0d0e21e | 27 | static int |
f0f333f4 | 28 | not_here(char *s) |
a0d0e21e LW |
29 | { |
30 | croak("GDBM_File::%s not implemented on this architecture", s); | |
31 | return -1; | |
32 | } | |
8063af02 | 33 | #endif |
a0d0e21e | 34 | |
097d66a9 GS |
35 | /* GDBM allocates the datum with system malloc() and expects the user |
36 | * to free() it. So we either have to free() it immediately, or have | |
37 | * perl free() it when it deallocates the SV, depending on whether | |
38 | * perl uses malloc()/free() or not. */ | |
39 | static void | |
caa0600b | 40 | output_datum(pTHX_ SV *arg, char *str, int size) |
097d66a9 | 41 | { |
097d66a9 | 42 | sv_setpvn(arg, str, size); |
e46b65ad | 43 | # undef free |
77b7876f | 44 | free(str); |
097d66a9 GS |
45 | } |
46 | ||
e50aee73 AD |
47 | /* Versions of gdbm prior to 1.7x might not have the gdbm_sync, |
48 | gdbm_exists, and gdbm_setopt functions. Apparently Slackware | |
49 | (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991). | |
50 | */ | |
51 | #ifndef GDBM_FAST | |
52 | #define gdbm_exists(db,key) not_here("gdbm_exists") | |
53 | #define gdbm_sync(db) (void) not_here("gdbm_sync") | |
54 | #define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt") | |
55 | #endif | |
56 | ||
1cb0fb50 | 57 | #include "const-c.inc" |
a0d0e21e LW |
58 | |
59 | MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_ | |
60 | ||
1cb0fb50 | 61 | INCLUDE: const-xs.inc |
a0d0e21e LW |
62 | |
63 | GDBM_File | |
64 | gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak) | |
65 | char * dbtype | |
66 | char * name | |
67 | int read_write | |
68 | int mode | |
69 | FATALFUNC fatal_func | |
9fe6733a PM |
70 | CODE: |
71 | { | |
72 | GDBM_FILE dbp ; | |
a0d0e21e | 73 | |
9fe6733a | 74 | RETVAL = NULL ; |
8063af02 | 75 | if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func))) { |
9fe6733a PM |
76 | RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ; |
77 | Zero(RETVAL, 1, GDBM_File_type) ; | |
78 | RETVAL->dbp = dbp ; | |
79 | } | |
80 | ||
81 | } | |
82 | OUTPUT: | |
83 | RETVAL | |
84 | ||
85 | ||
86 | #define gdbm_close(db) gdbm_close(db->dbp) | |
a0d0e21e LW |
87 | void |
88 | gdbm_close(db) | |
89 | GDBM_File db | |
90 | CLEANUP: | |
91 | ||
92 | void | |
93 | gdbm_DESTROY(db) | |
94 | GDBM_File db | |
95 | CODE: | |
96 | gdbm_close(db); | |
11d95c64 NC |
97 | if (db->filter_fetch_key) |
98 | SvREFCNT_dec(db->filter_fetch_key) ; | |
99 | if (db->filter_store_key) | |
100 | SvREFCNT_dec(db->filter_store_key) ; | |
101 | if (db->filter_fetch_value) | |
102 | SvREFCNT_dec(db->filter_fetch_value) ; | |
103 | if (db->filter_store_value) | |
104 | SvREFCNT_dec(db->filter_store_value) ; | |
eb99164f | 105 | safefree(db); |
a0d0e21e | 106 | |
9fe6733a PM |
107 | #define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key) |
108 | datum_value | |
a0d0e21e LW |
109 | gdbm_FETCH(db, key) |
110 | GDBM_File db | |
0bf2e707 | 111 | datum_key_copy key |
a0d0e21e | 112 | |
9fe6733a | 113 | #define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags) |
a0d0e21e LW |
114 | int |
115 | gdbm_STORE(db, key, value, flags = GDBM_REPLACE) | |
116 | GDBM_File db | |
9fe6733a PM |
117 | datum_key key |
118 | datum_value value | |
a0d0e21e LW |
119 | int flags |
120 | CLEANUP: | |
121 | if (RETVAL) { | |
122 | if (RETVAL < 0 && errno == EPERM) | |
123 | croak("No write permission to gdbm file"); | |
748a9306 | 124 | croak("gdbm store returned %d, errno %d, key \"%.*s\"", |
a0d0e21e | 125 | RETVAL,errno,key.dsize,key.dptr); |
a0d0e21e LW |
126 | } |
127 | ||
9fe6733a | 128 | #define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key) |
a0d0e21e LW |
129 | int |
130 | gdbm_DELETE(db, key) | |
131 | GDBM_File db | |
9fe6733a | 132 | datum_key key |
a0d0e21e | 133 | |
9fe6733a PM |
134 | #define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp) |
135 | datum_key | |
a0d0e21e LW |
136 | gdbm_FIRSTKEY(db) |
137 | GDBM_File db | |
138 | ||
9fe6733a PM |
139 | #define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key) |
140 | datum_key | |
a0d0e21e LW |
141 | gdbm_NEXTKEY(db, key) |
142 | GDBM_File db | |
0bf2e707 | 143 | datum_key key |
a0d0e21e | 144 | |
9fe6733a | 145 | #define gdbm_reorganize(db) gdbm_reorganize(db->dbp) |
a0d0e21e LW |
146 | int |
147 | gdbm_reorganize(db) | |
148 | GDBM_File db | |
149 | ||
3b35bae3 | 150 | |
9fe6733a | 151 | #define gdbm_sync(db) gdbm_sync(db->dbp) |
3b35bae3 AD |
152 | void |
153 | gdbm_sync(db) | |
154 | GDBM_File db | |
155 | ||
9fe6733a | 156 | #define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key) |
3b35bae3 | 157 | int |
c07a80fd | 158 | gdbm_EXISTS(db, key) |
3b35bae3 | 159 | GDBM_File db |
9fe6733a | 160 | datum_key key |
3b35bae3 | 161 | |
9fe6733a | 162 | #define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen) |
3b35bae3 AD |
163 | int |
164 | gdbm_setopt (db, optflag, optval, optlen) | |
165 | GDBM_File db | |
166 | int optflag | |
167 | int &optval | |
168 | int optlen | |
169 | ||
9fe6733a | 170 | |
9fe6733a PM |
171 | SV * |
172 | filter_fetch_key(db, code) | |
173 | GDBM_File db | |
174 | SV * code | |
175 | SV * RETVAL = &PL_sv_undef ; | |
176 | CODE: | |
6a31061a | 177 | DBM_setFilter(db->filter_fetch_key, code) ; |
9fe6733a PM |
178 | |
179 | SV * | |
180 | filter_store_key(db, code) | |
181 | GDBM_File db | |
182 | SV * code | |
183 | SV * RETVAL = &PL_sv_undef ; | |
184 | CODE: | |
6a31061a | 185 | DBM_setFilter(db->filter_store_key, code) ; |
9fe6733a PM |
186 | |
187 | SV * | |
188 | filter_fetch_value(db, code) | |
189 | GDBM_File db | |
190 | SV * code | |
191 | SV * RETVAL = &PL_sv_undef ; | |
192 | CODE: | |
6a31061a | 193 | DBM_setFilter(db->filter_fetch_value, code) ; |
9fe6733a PM |
194 | |
195 | SV * | |
196 | filter_store_value(db, code) | |
197 | GDBM_File db | |
198 | SV * code | |
199 | SV * RETVAL = &PL_sv_undef ; | |
200 | CODE: | |
6a31061a | 201 | DBM_setFilter(db->filter_store_value, code) ; |
9fe6733a | 202 |