10 SV * filter_fetch_key ;
11 SV * filter_store_key ;
12 SV * filter_fetch_value ;
13 SV * filter_store_value ;
17 typedef GDBM_File_type * GDBM_File ;
18 typedef datum datum_key ;
19 typedef datum datum_value ;
21 #define ckFilter(arg,type,name) \
24 /* printf("filtering %s\n", name) ;*/ \
26 croak("recursion detected in %s", name) ; \
27 db->filtering = TRUE ; \
28 save_defsv = newSVsv(DEFSV) ; \
29 sv_setsv(DEFSV, arg) ; \
31 (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
32 sv_setsv(arg, DEFSV) ; \
33 sv_setsv(DEFSV, save_defsv) ; \
34 SvREFCNT_dec(save_defsv) ; \
35 db->filtering = FALSE ; \
36 /*printf("end of filtering %s\n", name) ;*/ \
41 #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
43 typedef void (*FATALFUNC)();
49 croak("GDBM_File::%s not implemented on this architecture", s);
54 /* GDBM allocates the datum with system malloc() and expects the user
55 * to free() it. So we either have to free() it immediately, or have
56 * perl free() it when it deallocates the SV, depending on whether
57 * perl uses malloc()/free() or not. */
59 output_datum(pTHX_ SV *arg, char *str, int size)
61 #if (!defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC))) && !defined(LEAKTEST)
62 sv_usepvn(arg, str, size);
64 sv_setpvn(arg, str, size);
69 /* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
70 gdbm_exists, and gdbm_setopt functions. Apparently Slackware
71 (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
74 #define gdbm_exists(db,key) not_here("gdbm_exists")
75 #define gdbm_sync(db) (void) not_here("gdbm_sync")
76 #define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt")
80 constant(char *name, int arg)
97 if (strEQ(name, "GDBM_CACHESIZE"))
99 return GDBM_CACHESIZE;
103 if (strEQ(name, "GDBM_FAST"))
109 if (strEQ(name, "GDBM_FASTMODE"))
111 return GDBM_FASTMODE;
115 if (strEQ(name, "GDBM_INSERT"))
121 if (strEQ(name, "GDBM_NEWDB"))
127 if (strEQ(name, "GDBM_NOLOCK"))
133 if (strEQ(name, "GDBM_READER"))
139 if (strEQ(name, "GDBM_REPLACE"))
145 if (strEQ(name, "GDBM_WRCREAT"))
151 if (strEQ(name, "GDBM_WRITER"))
205 MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
214 gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
225 if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func))) {
226 RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ;
227 Zero(RETVAL, 1, GDBM_File_type) ;
236 #define gdbm_close(db) gdbm_close(db->dbp)
249 #define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
255 #define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
257 gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
264 if (RETVAL < 0 && errno == EPERM)
265 croak("No write permission to gdbm file");
266 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
267 RETVAL,errno,key.dsize,key.dptr);
270 #define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
276 #define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
281 #define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
283 gdbm_NEXTKEY(db, key)
287 #define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
293 #define gdbm_sync(db) gdbm_sync(db->dbp)
298 #define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
304 #define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
306 gdbm_setopt (db, optflag, optval, optlen)
313 #define setFilter(type) \
316 RETVAL = sv_mortalcopy(db->type) ; \
318 if (db->type && (code == &PL_sv_undef)) { \
319 SvREFCNT_dec(db->type) ; \
324 sv_setsv(db->type, code) ; \
326 db->type = newSVsv(code) ; \
333 filter_fetch_key(db, code)
336 SV * RETVAL = &PL_sv_undef ;
338 setFilter(filter_fetch_key) ;
341 filter_store_key(db, code)
344 SV * RETVAL = &PL_sv_undef ;
346 setFilter(filter_store_key) ;
349 filter_fetch_value(db, code)
352 SV * RETVAL = &PL_sv_undef ;
354 setFilter(filter_fetch_value) ;
357 filter_store_value(db, code)
360 SV * RETVAL = &PL_sv_undef ;
362 setFilter(filter_store_value) ;