Test for the right signal should use the constant for that signal.
[p5sagit/p5-mst-13.2.git] / ext / SDBM_File / SDBM_File.xs
CommitLineData
c5be433b 1#define PERL_NO_GET_CONTEXT
a0d0e21e 2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5#include "sdbm/sdbm.h"
6
9fe6733a 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
a0d0e21e 20#define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
9fe6733a 21#define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key)
22#define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags)
23#define sdbm_DELETE(db,key) sdbm_delete(db->dbp,key)
24#define sdbm_EXISTS(db,key) sdbm_exists(db->dbp,key)
25#define sdbm_FIRSTKEY(db) sdbm_firstkey(db->dbp)
26#define sdbm_NEXTKEY(db,key) sdbm_nextkey(db->dbp)
a0d0e21e 27
28
29MODULE = SDBM_File PACKAGE = SDBM_File PREFIX = sdbm_
30
31SDBM_File
32sdbm_TIEHASH(dbtype, filename, flags, mode)
33 char * dbtype
34 char * filename
35 int flags
36 int mode
9fe6733a 37 CODE:
38 {
39 DBM * dbp ;
40
41 RETVAL = NULL ;
8063af02 42 if ((dbp = sdbm_open(filename,flags,mode))) {
9fe6733a 43 RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
44 Zero(RETVAL, 1, SDBM_File_type) ;
45 RETVAL->dbp = dbp ;
46 }
47
48 }
49 OUTPUT:
50 RETVAL
a0d0e21e 51
52void
53sdbm_DESTROY(db)
54 SDBM_File db
55 CODE:
9fe6733a 56 sdbm_close(db->dbp);
57 if (db->filter_fetch_key)
58 SvREFCNT_dec(db->filter_fetch_key) ;
59 if (db->filter_store_key)
60 SvREFCNT_dec(db->filter_store_key) ;
61 if (db->filter_fetch_value)
62 SvREFCNT_dec(db->filter_fetch_value) ;
63 if (db->filter_store_value)
64 SvREFCNT_dec(db->filter_store_value) ;
eb99164f 65 safefree(db) ;
a0d0e21e 66
9fe6733a 67datum_value
a0d0e21e 68sdbm_FETCH(db, key)
69 SDBM_File db
9fe6733a 70 datum_key key
a0d0e21e 71
72int
73sdbm_STORE(db, key, value, flags = DBM_REPLACE)
74 SDBM_File db
9fe6733a 75 datum_key key
76 datum_value value
a0d0e21e 77 int flags
78 CLEANUP:
79 if (RETVAL) {
80 if (RETVAL < 0 && errno == EPERM)
81 croak("No write permission to sdbm file");
748a9306 82 croak("sdbm store returned %d, errno %d, key \"%s\"",
a0d0e21e 83 RETVAL,errno,key.dptr);
9fe6733a 84 sdbm_clearerr(db->dbp);
a0d0e21e 85 }
86
87int
88sdbm_DELETE(db, key)
89 SDBM_File db
d1a52ffb 90 datum_key key
a0d0e21e 91
f4b9d880 92int
93sdbm_EXISTS(db,key)
94 SDBM_File db
9fe6733a 95 datum_key key
f4b9d880 96
9fe6733a 97datum_key
a0d0e21e 98sdbm_FIRSTKEY(db)
99 SDBM_File db
100
9fe6733a 101datum_key
a0d0e21e 102sdbm_NEXTKEY(db, key)
103 SDBM_File db
aa0165af 104 datum_key key;
a0d0e21e 105
106int
107sdbm_error(db)
108 SDBM_File db
9fe6733a 109 CODE:
110 RETVAL = sdbm_error(db->dbp) ;
111 OUTPUT:
112 RETVAL
a0d0e21e 113
114int
115sdbm_clearerr(db)
116 SDBM_File db
9fe6733a 117 CODE:
118 RETVAL = sdbm_clearerr(db->dbp) ;
119 OUTPUT:
120 RETVAL
121
122
9fe6733a 123SV *
124filter_fetch_key(db, code)
125 SDBM_File db
126 SV * code
127 SV * RETVAL = &PL_sv_undef ;
128 CODE:
6a31061a 129 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a 130
131SV *
132filter_store_key(db, code)
133 SDBM_File db
134 SV * code
135 SV * RETVAL = &PL_sv_undef ;
136 CODE:
6a31061a 137 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a 138
139SV *
140filter_fetch_value(db, code)
141 SDBM_File db
142 SV * code
143 SV * RETVAL = &PL_sv_undef ;
144 CODE:
6a31061a 145 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a 146
147SV *
148filter_store_value(db, code)
149 SDBM_File db
150 SV * code
151 SV * RETVAL = &PL_sv_undef ;
152 CODE:
6a31061a 153 DBM_setFilter(db->filter_store_value, code) ;
a0d0e21e 154