12 typedef void* ODBM_File;
14 #define odbm_fetch(db,key) fetch(key)
15 #define odbm_store(db,key,value,flags) store(key,value)
16 #define odbm_delete(db,key) delete(key)
17 #define odbm_firstkey(db) firstkey()
18 #define odbm_nextkey(db,key) nextkey(key)
25 XS_ODBM_File_odbm_new(ix, sp, items)
30 if (items < 4 || items > 4) {
31 croak("Usage: ODBM_File::new(dbtype, filename, flags, mode)");
34 char * dbtype = SvPV(ST(1),na);
35 char * filename = SvPV(ST(2),na);
36 int flags = (int)SvIV(ST(3));
37 int mode = (int)SvIV(ST(4));
42 croak("Old dbm can only open one database");
43 sprintf(tmpbuf,"%s.dir",filename);
44 if (stat(tmpbuf, &statbuf) < 0) {
45 if (flags & O_CREAT) {
46 if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
47 croak("ODBM_File: Can't create %s", filename);
48 sprintf(tmpbuf,"%s.pag",filename);
49 if (close(creat(tmpbuf,mode)) < 0)
50 croak("ODBM_File: Can't create %s", filename);
53 croak("ODBM_FILE: Can't open %s", filename);
55 RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
56 ST(0) = sv_mortalcopy(&sv_undef);
57 sv_setptrobj(ST(0), RETVAL, "ODBM_File");
64 XS_ODBM_File_DESTROY(ix, sp, items)
69 if (items < 1 || items > 1) {
70 croak("Usage: ODBM_File::DESTROY(db)");
75 if (sv_isa(ST(1), "ODBM_File"))
76 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
78 croak("db is not of type ODBM_File");
86 XS_ODBM_File_odbm_fetch(ix, sp, items)
91 if (items < 2 || items > 2) {
92 croak("Usage: ODBM_File::fetch(db, key)");
99 if (sv_isa(ST(1), "ODBM_File"))
100 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
102 croak("db is not of type ODBM_File");
104 key.dptr = SvPV(ST(2), key.dsize);;
106 RETVAL = odbm_fetch(db, key);
107 ST(0) = sv_mortalcopy(&sv_undef);
108 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
114 XS_ODBM_File_odbm_store(ix, sp, items)
119 if (items < 3 || items > 4) {
120 croak("Usage: ODBM_File::store(db, key, value, flags = DBM_REPLACE)");
129 if (sv_isa(ST(1), "ODBM_File"))
130 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
132 croak("db is not of type ODBM_File");
134 key.dptr = SvPV(ST(2), key.dsize);;
136 value.dptr = SvPV(ST(3), value.dsize);;
141 flags = (int)SvIV(ST(4));
144 RETVAL = odbm_store(db, key, value, flags);
145 ST(0) = sv_mortalcopy(&sv_undef);
146 sv_setiv(ST(0), (I32)RETVAL);
152 XS_ODBM_File_odbm_delete(ix, sp, items)
157 if (items < 2 || items > 2) {
158 croak("Usage: ODBM_File::delete(db, key)");
165 if (sv_isa(ST(1), "ODBM_File"))
166 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
168 croak("db is not of type ODBM_File");
170 key.dptr = SvPV(ST(2), key.dsize);;
172 RETVAL = odbm_delete(db, key);
173 ST(0) = sv_mortalcopy(&sv_undef);
174 sv_setiv(ST(0), (I32)RETVAL);
180 XS_ODBM_File_odbm_firstkey(ix, sp, items)
185 if (items < 1 || items > 1) {
186 croak("Usage: ODBM_File::firstkey(db)");
192 if (sv_isa(ST(1), "ODBM_File"))
193 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
195 croak("db is not of type ODBM_File");
197 RETVAL = odbm_firstkey(db);
198 ST(0) = sv_mortalcopy(&sv_undef);
199 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
205 XS_ODBM_File_odbm_nextkey(ix, sp, items)
210 if (items < 2 || items > 2) {
211 croak("Usage: ODBM_File::nextkey(db, key)");
218 if (sv_isa(ST(1), "ODBM_File"))
219 db = (ODBM_File)(unsigned long)SvNV((SV*)SvANY(ST(1)));
221 croak("db is not of type ODBM_File");
223 key.dptr = SvPV(ST(2), key.dsize);;
225 RETVAL = odbm_nextkey(db, key);
226 ST(0) = sv_mortalcopy(&sv_undef);
227 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
232 int init_ODBM_File(ix,sp,items)
237 char* file = __FILE__;
239 newXSUB("ODBM_File::new", 0, XS_ODBM_File_odbm_new, file);
240 newXSUB("ODBM_File::DESTROY", 0, XS_ODBM_File_DESTROY, file);
241 newXSUB("ODBM_File::fetch", 0, XS_ODBM_File_odbm_fetch, file);
242 newXSUB("ODBM_File::store", 0, XS_ODBM_File_odbm_store, file);
243 newXSUB("ODBM_File::delete", 0, XS_ODBM_File_odbm_delete, file);
244 newXSUB("ODBM_File::firstkey", 0, XS_ODBM_File_odbm_firstkey, file);
245 newXSUB("ODBM_File::nextkey", 0, XS_ODBM_File_odbm_nextkey, file);