This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix broken link
[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
f4603e30
NC
7#define fetch_key 0
8#define store_key 1
9#define fetch_value 2
10#define store_value 3
11
9fe6733a
PM
12typedef struct {
13 DBM * dbp ;
f4603e30 14 SV * filter[4];
9fe6733a
PM
15 int filtering ;
16 } SDBM_File_type;
17
18typedef SDBM_File_type * SDBM_File ;
19typedef datum datum_key ;
20typedef datum datum_value ;
21
a0d0e21e 22#define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
9fe6733a
PM
23#define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key)
24#define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags)
25#define sdbm_DELETE(db,key) sdbm_delete(db->dbp,key)
26#define sdbm_EXISTS(db,key) sdbm_exists(db->dbp,key)
27#define sdbm_FIRSTKEY(db) sdbm_firstkey(db->dbp)
28#define sdbm_NEXTKEY(db,key) sdbm_nextkey(db->dbp)
a0d0e21e
LW
29
30
31MODULE = SDBM_File PACKAGE = SDBM_File PREFIX = sdbm_
32
33SDBM_File
34sdbm_TIEHASH(dbtype, filename, flags, mode)
35 char * dbtype
36 char * filename
37 int flags
38 int mode
9fe6733a
PM
39 CODE:
40 {
41 DBM * dbp ;
42
43 RETVAL = NULL ;
8063af02 44 if ((dbp = sdbm_open(filename,flags,mode))) {
a5c6857c 45 RETVAL = (SDBM_File)safecalloc(1, sizeof(SDBM_File_type));
9fe6733a
PM
46 RETVAL->dbp = dbp ;
47 }
48
49 }
50 OUTPUT:
51 RETVAL
a0d0e21e
LW
52
53void
54sdbm_DESTROY(db)
55 SDBM_File db
56 CODE:
8a0b16eb 57 if (db) {
f4603e30 58 int i = store_value;
8a0b16eb 59 sdbm_close(db->dbp);
f4603e30
NC
60 do {
61 if (db->filter[i])
62 SvREFCNT_dec(db->filter[i]);
63 } while (i-- > 0);
8a0b16eb
RGS
64 safefree(db) ;
65 }
a0d0e21e 66
9fe6733a 67datum_value
a0d0e21e
LW
68sdbm_FETCH(db, key)
69 SDBM_File db
9fe6733a 70 datum_key key
a0d0e21e
LW
71
72int
73sdbm_STORE(db, key, value, flags = DBM_REPLACE)
74 SDBM_File db
9fe6733a
PM
75 datum_key key
76 datum_value value
a0d0e21e
LW
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
LW
85 }
86
87int
88sdbm_DELETE(db, key)
89 SDBM_File db
d1a52ffb 90 datum_key key
a0d0e21e 91
f4b9d880
RA
92int
93sdbm_EXISTS(db,key)
94 SDBM_File db
9fe6733a 95 datum_key key
f4b9d880 96
9fe6733a 97datum_key
a0d0e21e
LW
98sdbm_FIRSTKEY(db)
99 SDBM_File db
100
9fe6733a 101datum_key
a0d0e21e
LW
102sdbm_NEXTKEY(db, key)
103 SDBM_File db
aa0165af 104 datum_key key;
a0d0e21e
LW
105
106int
107sdbm_error(db)
108 SDBM_File db
157486ae
NC
109 ALIAS:
110 sdbm_clearerr = 1
9fe6733a 111 CODE:
157486ae 112 RETVAL = ix ? sdbm_clearerr(db->dbp) : sdbm_error(db->dbp);
9fe6733a
PM
113 OUTPUT:
114 RETVAL
115
9fe6733a
PM
116SV *
117filter_fetch_key(db, code)
118 SDBM_File db
119 SV * code
120 SV * RETVAL = &PL_sv_undef ;
f4603e30
NC
121 ALIAS:
122 SDBM_File::filter_fetch_key = fetch_key
123 SDBM_File::filter_store_key = store_key
124 SDBM_File::filter_fetch_value = fetch_value
125 SDBM_File::filter_store_value = store_value
9fe6733a 126 CODE:
f4603e30 127 DBM_setFilter(db->filter[ix], code);