This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fwd: CPAN Upload: S/SA/SAPER/Sys-Syslog-0.22.tar.gz
[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
a0d0e21e 20#define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
9fe6733a
PM
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
LW
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
PM
37 CODE:
38 {
39 DBM * dbp ;
40
41 RETVAL = NULL ;
8063af02 42 if ((dbp = sdbm_open(filename,flags,mode))) {
9fe6733a
PM
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
LW
51
52void
53sdbm_DESTROY(db)
54 SDBM_File db
55 CODE:
8a0b16eb
RGS
56 if (db) {
57 sdbm_close(db->dbp);
58 if (db->filter_fetch_key)
59 SvREFCNT_dec(db->filter_fetch_key) ;
60 if (db->filter_store_key)
61 SvREFCNT_dec(db->filter_store_key) ;
62 if (db->filter_fetch_value)
63 SvREFCNT_dec(db->filter_fetch_value) ;
64 if (db->filter_store_value)
65 SvREFCNT_dec(db->filter_store_value) ;
66 safefree(db) ;
67 }
a0d0e21e 68
9fe6733a 69datum_value
a0d0e21e
LW
70sdbm_FETCH(db, key)
71 SDBM_File db
9fe6733a 72 datum_key key
a0d0e21e
LW
73
74int
75sdbm_STORE(db, key, value, flags = DBM_REPLACE)
76 SDBM_File db
9fe6733a
PM
77 datum_key key
78 datum_value value
a0d0e21e
LW
79 int flags
80 CLEANUP:
81 if (RETVAL) {
82 if (RETVAL < 0 && errno == EPERM)
83 croak("No write permission to sdbm file");
748a9306 84 croak("sdbm store returned %d, errno %d, key \"%s\"",
a0d0e21e 85 RETVAL,errno,key.dptr);
9fe6733a 86 sdbm_clearerr(db->dbp);
a0d0e21e
LW
87 }
88
89int
90sdbm_DELETE(db, key)
91 SDBM_File db
d1a52ffb 92 datum_key key
a0d0e21e 93
f4b9d880
RA
94int
95sdbm_EXISTS(db,key)
96 SDBM_File db
9fe6733a 97 datum_key key
f4b9d880 98
9fe6733a 99datum_key
a0d0e21e
LW
100sdbm_FIRSTKEY(db)
101 SDBM_File db
102
9fe6733a 103datum_key
a0d0e21e
LW
104sdbm_NEXTKEY(db, key)
105 SDBM_File db
aa0165af 106 datum_key key;
a0d0e21e
LW
107
108int
109sdbm_error(db)
110 SDBM_File db
9fe6733a
PM
111 CODE:
112 RETVAL = sdbm_error(db->dbp) ;
113 OUTPUT:
114 RETVAL
a0d0e21e
LW
115
116int
117sdbm_clearerr(db)
118 SDBM_File db
9fe6733a
PM
119 CODE:
120 RETVAL = sdbm_clearerr(db->dbp) ;
121 OUTPUT:
122 RETVAL
123
124
9fe6733a
PM
125SV *
126filter_fetch_key(db, code)
127 SDBM_File db
128 SV * code
129 SV * RETVAL = &PL_sv_undef ;
130 CODE:
6a31061a 131 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a
PM
132
133SV *
134filter_store_key(db, code)
135 SDBM_File db
136 SV * code
137 SV * RETVAL = &PL_sv_undef ;
138 CODE:
6a31061a 139 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a
PM
140
141SV *
142filter_fetch_value(db, code)
143 SDBM_File db
144 SV * code
145 SV * RETVAL = &PL_sv_undef ;
146 CODE:
6a31061a 147 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a
PM
148
149SV *
150filter_store_value(db, code)
151 SDBM_File db
152 SV * code
153 SV * RETVAL = &PL_sv_undef ;
154 CODE:
6a31061a 155 DBM_setFilter(db->filter_store_value, code) ;
a0d0e21e 156