This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
avoid use of %caller::EXPORT
[perl5.git] / ext / SDBM_File / SDBM_File.xs
CommitLineData
c5be433b 1#define PERL_NO_GET_CONTEXT
a0d0e21e
LW
2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5#include "sdbm/sdbm.h"
6
9fe6733a
PM
7typedef struct {
8 DBM * dbp ;
9 SV * filter_fetch_key ;
10 SV * filter_store_key ;
11 SV * filter_fetch_value ;
12 SV * filter_store_value ;
13 int filtering ;
14 } SDBM_File_type;
15
16typedef SDBM_File_type * SDBM_File ;
17typedef datum datum_key ;
18typedef datum datum_value ;
19
20#define ckFilter(arg,type,name) \
21 if (db->type) { \
22 SV * save_defsv ; \
23 /* printf("filtering %s\n", name) ;*/ \
24 if (db->filtering) \
25 croak("recursion detected in %s", name) ; \
26 db->filtering = TRUE ; \
9fe6733a
PM
27 save_defsv = newSVsv(DEFSV) ; \
28 sv_setsv(DEFSV, arg) ; \
29 PUSHMARK(sp) ; \
30 (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
9fe6733a
PM
31 sv_setsv(arg, DEFSV) ; \
32 sv_setsv(DEFSV, save_defsv) ; \
33 SvREFCNT_dec(save_defsv) ; \
9fe6733a
PM
34 db->filtering = FALSE ; \
35 /*printf("end of filtering %s\n", name) ;*/ \
36 }
37
a0d0e21e 38#define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
9fe6733a
PM
39#define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key)
40#define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags)
41#define sdbm_DELETE(db,key) sdbm_delete(db->dbp,key)
42#define sdbm_EXISTS(db,key) sdbm_exists(db->dbp,key)
43#define sdbm_FIRSTKEY(db) sdbm_firstkey(db->dbp)
44#define sdbm_NEXTKEY(db,key) sdbm_nextkey(db->dbp)
a0d0e21e
LW
45
46
47MODULE = SDBM_File PACKAGE = SDBM_File PREFIX = sdbm_
48
49SDBM_File
50sdbm_TIEHASH(dbtype, filename, flags, mode)
51 char * dbtype
52 char * filename
53 int flags
54 int mode
9fe6733a
PM
55 CODE:
56 {
57 DBM * dbp ;
58
59 RETVAL = NULL ;
8063af02 60 if ((dbp = sdbm_open(filename,flags,mode))) {
9fe6733a
PM
61 RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
62 Zero(RETVAL, 1, SDBM_File_type) ;
63 RETVAL->dbp = dbp ;
64 }
65
66 }
67 OUTPUT:
68 RETVAL
a0d0e21e
LW
69
70void
71sdbm_DESTROY(db)
72 SDBM_File db
73 CODE:
9fe6733a
PM
74 sdbm_close(db->dbp);
75 if (db->filter_fetch_key)
76 SvREFCNT_dec(db->filter_fetch_key) ;
77 if (db->filter_store_key)
78 SvREFCNT_dec(db->filter_store_key) ;
79 if (db->filter_fetch_value)
80 SvREFCNT_dec(db->filter_fetch_value) ;
81 if (db->filter_store_value)
82 SvREFCNT_dec(db->filter_store_value) ;
eb99164f 83 safefree(db) ;
a0d0e21e 84
9fe6733a 85datum_value
a0d0e21e
LW
86sdbm_FETCH(db, key)
87 SDBM_File db
9fe6733a 88 datum_key key
a0d0e21e
LW
89
90int
91sdbm_STORE(db, key, value, flags = DBM_REPLACE)
92 SDBM_File db
9fe6733a
PM
93 datum_key key
94 datum_value value
a0d0e21e
LW
95 int flags
96 CLEANUP:
97 if (RETVAL) {
98 if (RETVAL < 0 && errno == EPERM)
99 croak("No write permission to sdbm file");
748a9306 100 croak("sdbm store returned %d, errno %d, key \"%s\"",
a0d0e21e 101 RETVAL,errno,key.dptr);
9fe6733a 102 sdbm_clearerr(db->dbp);
a0d0e21e
LW
103 }
104
105int
106sdbm_DELETE(db, key)
107 SDBM_File db
d1a52ffb 108 datum_key key
a0d0e21e 109
f4b9d880
RA
110int
111sdbm_EXISTS(db,key)
112 SDBM_File db
9fe6733a 113 datum_key key
f4b9d880 114
9fe6733a 115datum_key
a0d0e21e
LW
116sdbm_FIRSTKEY(db)
117 SDBM_File db
118
9fe6733a 119datum_key
a0d0e21e
LW
120sdbm_NEXTKEY(db, key)
121 SDBM_File db
074a95ad 122 datum_key key = key; /* never used - silence picky compilers. */
a0d0e21e
LW
123
124int
125sdbm_error(db)
126 SDBM_File db
9fe6733a
PM
127 CODE:
128 RETVAL = sdbm_error(db->dbp) ;
129 OUTPUT:
130 RETVAL
a0d0e21e
LW
131
132int
133sdbm_clearerr(db)
134 SDBM_File db
9fe6733a
PM
135 CODE:
136 RETVAL = sdbm_clearerr(db->dbp) ;
137 OUTPUT:
138 RETVAL
139
140
141#define setFilter(type) \
142 { \
143 if (db->type) \
e62f7e43
PM
144 RETVAL = sv_mortalcopy(db->type) ; \
145 ST(0) = RETVAL ; \
9fe6733a
PM
146 if (db->type && (code == &PL_sv_undef)) { \
147 SvREFCNT_dec(db->type) ; \
148 db->type = NULL ; \
149 } \
150 else if (code) { \
151 if (db->type) \
152 sv_setsv(db->type, code) ; \
153 else \
154 db->type = newSVsv(code) ; \
155 } \
156 }
157
158
159
160SV *
161filter_fetch_key(db, code)
162 SDBM_File db
163 SV * code
164 SV * RETVAL = &PL_sv_undef ;
165 CODE:
166 setFilter(filter_fetch_key) ;
9fe6733a
PM
167
168SV *
169filter_store_key(db, code)
170 SDBM_File db
171 SV * code
172 SV * RETVAL = &PL_sv_undef ;
173 CODE:
174 setFilter(filter_store_key) ;
9fe6733a
PM
175
176SV *
177filter_fetch_value(db, code)
178 SDBM_File db
179 SV * code
180 SV * RETVAL = &PL_sv_undef ;
181 CODE:
182 setFilter(filter_fetch_value) ;
9fe6733a
PM
183
184SV *
185filter_store_value(db, code)
186 SDBM_File db
187 SV * code
188 SV * RETVAL = &PL_sv_undef ;
189 CODE:
190 setFilter(filter_store_value) ;
a0d0e21e 191