4 /* If using the DB3 emulation, ENTER is defined both
5 * by DB3 and Perl. We drop the Perl definition now.
6 * See also INSTALL section on DB3.
7 * -- Stanislav Brabec <utx@penguin.cz> */
13 SV * filter_fetch_key ;
14 SV * filter_store_key ;
15 SV * filter_fetch_value ;
16 SV * filter_store_value ;
20 typedef NDBM_File_type * NDBM_File ;
21 typedef datum datum_key ;
22 typedef datum datum_value ;
24 #define ckFilter(arg,type,name) \
27 /* printf("filtering %s\n", name) ;*/ \
29 croak("recursion detected in %s", name) ; \
30 db->filtering = TRUE ; \
31 save_defsv = newSVsv(DEFSV) ; \
32 sv_setsv(DEFSV, arg) ; \
34 (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
35 sv_setsv(arg, DEFSV) ; \
36 sv_setsv(DEFSV, save_defsv) ; \
37 SvREFCNT_dec(save_defsv) ; \
38 db->filtering = FALSE ; \
39 /*printf("end of filtering %s\n", name) ;*/ \
43 MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_
46 ndbm_TIEHASH(dbtype, filename, flags, mode)
56 if ((dbp = dbm_open(filename, flags, mode))) {
57 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
58 Zero(RETVAL, 1, NDBM_File_type) ;
73 #define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key)
79 #define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags)
81 ndbm_STORE(db, key, value, flags = DBM_REPLACE)
88 if (RETVAL < 0 && errno == EPERM)
89 croak("No write permission to ndbm file");
90 croak("ndbm store returned %d, errno %d, key \"%s\"",
91 RETVAL,errno,key.dptr);
92 dbm_clearerr(db->dbp);
95 #define ndbm_DELETE(db,key) dbm_delete(db->dbp,key)
101 #define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp)
106 #define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp)
108 ndbm_NEXTKEY(db, key)
110 datum_key key = NO_INIT
112 #define ndbm_error(db) dbm_error(db->dbp)
117 #define ndbm_clearerr(db) dbm_clearerr(db->dbp)
123 #define setFilter(type) \
126 RETVAL = sv_mortalcopy(db->type) ; \
128 if (db->type && (code == &PL_sv_undef)) { \
129 SvREFCNT_dec(db->type) ; \
134 sv_setsv(db->type, code) ; \
136 db->type = newSVsv(code) ; \
143 filter_fetch_key(db, code)
146 SV * RETVAL = &PL_sv_undef ;
148 setFilter(filter_fetch_key) ;
151 filter_store_key(db, code)
154 SV * RETVAL = &PL_sv_undef ;
156 setFilter(filter_store_key) ;
159 filter_fetch_value(db, code)
162 SV * RETVAL = &PL_sv_undef ;
164 setFilter(filter_fetch_value) ;
167 filter_store_value(db, code)
170 SV * RETVAL = &PL_sv_undef ;
172 setFilter(filter_store_value) ;