1 #define PERL_NO_GET_CONTEXT
21 typedef GDBM_File_type * GDBM_File ;
22 typedef datum datum_key ;
23 typedef datum datum_value ;
24 typedef datum datum_key_copy;
26 #if defined(GDBM_VERSION_MAJOR) && defined(GDBM_VERSION_MINOR) \
27 && GDBM_VERSION_MAJOR > 1 || \
28 (GDBM_VERSION_MAJOR == 1 && GDBM_VERSION_MINOR >= 9)
29 typedef void (*FATALFUNC)(const char *);
31 typedef void (*FATALFUNC)();
38 croak("GDBM_File::%s not implemented on this architecture", s);
43 /* GDBM allocates the datum with system malloc() and expects the user
44 * to free() it. So we either have to free() it immediately, or have
45 * perl free() it when it deallocates the SV, depending on whether
46 * perl uses malloc()/free() or not. */
48 output_datum(pTHX_ SV *arg, char *str, int size)
50 sv_setpvn(arg, str, size);
55 /* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
56 gdbm_exists, and gdbm_setopt functions. Apparently Slackware
57 (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
60 #define gdbm_exists(db,key) not_here("gdbm_exists")
61 #define gdbm_sync(db) (void) not_here("gdbm_sync")
62 #define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt")
66 croak_string(const char *message) {
67 Perl_croak_nocontext("%s", message);
70 #include "const-c.inc"
72 MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
77 gdbm_TIEHASH(dbtype, name, read_write, mode)
85 dbp = gdbm_open(name, 0, read_write, mode, (FATALFUNC)croak_string);
86 if (!dbp && gdbm_errno == GDBM_BLOCK_SIZE_ERROR) {
88 * By specifying a block size of 0 above, we asked gdbm to
89 * default to the filesystem's block size. That's usually the
90 * right size to choose. But some versions of gdbm require
91 * a power-of-two block size, and some unusual filesystems
92 * or devices have a non-power-of-two size that cause this
93 * defaulting to fail. In that case, force an acceptable
96 dbp = gdbm_open(name, 4096, read_write, mode,
97 (FATALFUNC)croak_string);
100 RETVAL = (GDBM_File)safecalloc(1, sizeof(GDBM_File_type));
109 #define gdbm_close(db) gdbm_close(db->dbp)
124 SvREFCNT_dec(db->filter[i]);
128 #define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
134 #define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
136 gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
143 if (RETVAL < 0 && errno == EPERM)
144 croak("No write permission to gdbm file");
145 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
146 RETVAL,errno,key.dsize,key.dptr);
149 #define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
155 #define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
160 #define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
162 gdbm_NEXTKEY(db, key)
166 #define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
172 #define gdbm_sync(db) gdbm_sync(db->dbp)
177 #define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
183 #define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
185 gdbm_setopt (db, optflag, optval, optlen)
193 filter_fetch_key(db, code)
196 SV * RETVAL = &PL_sv_undef ;
198 GDBM_File::filter_fetch_key = fetch_key
199 GDBM_File::filter_store_key = store_key
200 GDBM_File::filter_fetch_value = fetch_value
201 GDBM_File::filter_store_value = store_value
203 DBM_setFilter(db->filter[ix], code);