This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge the XS code for Hash::Util::{hidden,legal}_ref_keys.
[perl5.git] / ext / GDBM_File / GDBM_File.xs
CommitLineData
a0d0e21e
LW
1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
5#include <gdbm.h>
6#include <fcntl.h>
7
9fe6733a
PM
8typedef struct {
9 GDBM_FILE dbp ;
10 SV * filter_fetch_key ;
11 SV * filter_store_key ;
12 SV * filter_fetch_value ;
13 SV * filter_store_value ;
14 int filtering ;
15 } GDBM_File_type;
16
17typedef GDBM_File_type * GDBM_File ;
18typedef datum datum_key ;
19typedef datum datum_value ;
0bf2e707 20typedef datum datum_key_copy;
9fe6733a 21
9fe6733a 22#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
a0d0e21e 23
12f917ad 24typedef void (*FATALFUNC)();
a0d0e21e 25
8063af02 26#ifndef GDBM_FAST
a0d0e21e 27static int
f0f333f4 28not_here(char *s)
a0d0e21e
LW
29{
30 croak("GDBM_File::%s not implemented on this architecture", s);
31 return -1;
32}
8063af02 33#endif
a0d0e21e 34
097d66a9
GS
35/* GDBM allocates the datum with system malloc() and expects the user
36 * to free() it. So we either have to free() it immediately, or have
37 * perl free() it when it deallocates the SV, depending on whether
38 * perl uses malloc()/free() or not. */
39static void
caa0600b 40output_datum(pTHX_ SV *arg, char *str, int size)
097d66a9 41{
097d66a9 42 sv_setpvn(arg, str, size);
e46b65ad 43# undef free
77b7876f 44 free(str);
097d66a9
GS
45}
46
e50aee73
AD
47/* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
48 gdbm_exists, and gdbm_setopt functions. Apparently Slackware
49 (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
50*/
51#ifndef GDBM_FAST
52#define gdbm_exists(db,key) not_here("gdbm_exists")
53#define gdbm_sync(db) (void) not_here("gdbm_sync")
54#define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt")
55#endif
56
1cb0fb50 57#include "const-c.inc"
a0d0e21e
LW
58
59MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
60
1cb0fb50 61INCLUDE: const-xs.inc
a0d0e21e
LW
62
63GDBM_File
64gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
65 char * dbtype
66 char * name
67 int read_write
68 int mode
69 FATALFUNC fatal_func
9fe6733a
PM
70 CODE:
71 {
72 GDBM_FILE dbp ;
a0d0e21e 73
9fe6733a 74 RETVAL = NULL ;
8063af02 75 if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func))) {
9fe6733a
PM
76 RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ;
77 Zero(RETVAL, 1, GDBM_File_type) ;
78 RETVAL->dbp = dbp ;
79 }
80
81 }
82 OUTPUT:
83 RETVAL
84
85
86#define gdbm_close(db) gdbm_close(db->dbp)
a0d0e21e
LW
87void
88gdbm_close(db)
89 GDBM_File db
90 CLEANUP:
91
92void
93gdbm_DESTROY(db)
94 GDBM_File db
95 CODE:
96 gdbm_close(db);
11d95c64
NC
97 if (db->filter_fetch_key)
98 SvREFCNT_dec(db->filter_fetch_key) ;
99 if (db->filter_store_key)
100 SvREFCNT_dec(db->filter_store_key) ;
101 if (db->filter_fetch_value)
102 SvREFCNT_dec(db->filter_fetch_value) ;
103 if (db->filter_store_value)
104 SvREFCNT_dec(db->filter_store_value) ;
eb99164f 105 safefree(db);
a0d0e21e 106
9fe6733a
PM
107#define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
108datum_value
a0d0e21e
LW
109gdbm_FETCH(db, key)
110 GDBM_File db
0bf2e707 111 datum_key_copy key
a0d0e21e 112
9fe6733a 113#define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
a0d0e21e
LW
114int
115gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
116 GDBM_File db
9fe6733a
PM
117 datum_key key
118 datum_value value
a0d0e21e
LW
119 int flags
120 CLEANUP:
121 if (RETVAL) {
122 if (RETVAL < 0 && errno == EPERM)
123 croak("No write permission to gdbm file");
748a9306 124 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
a0d0e21e 125 RETVAL,errno,key.dsize,key.dptr);
a0d0e21e
LW
126 }
127
9fe6733a 128#define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
a0d0e21e
LW
129int
130gdbm_DELETE(db, key)
131 GDBM_File db
9fe6733a 132 datum_key key
a0d0e21e 133
9fe6733a
PM
134#define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
135datum_key
a0d0e21e
LW
136gdbm_FIRSTKEY(db)
137 GDBM_File db
138
9fe6733a
PM
139#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
140datum_key
a0d0e21e
LW
141gdbm_NEXTKEY(db, key)
142 GDBM_File db
0bf2e707 143 datum_key key
a0d0e21e 144
9fe6733a 145#define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
a0d0e21e
LW
146int
147gdbm_reorganize(db)
148 GDBM_File db
149
3b35bae3 150
9fe6733a 151#define gdbm_sync(db) gdbm_sync(db->dbp)
3b35bae3
AD
152void
153gdbm_sync(db)
154 GDBM_File db
155
9fe6733a 156#define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
3b35bae3 157int
c07a80fd 158gdbm_EXISTS(db, key)
3b35bae3 159 GDBM_File db
9fe6733a 160 datum_key key
3b35bae3 161
9fe6733a 162#define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
3b35bae3
AD
163int
164gdbm_setopt (db, optflag, optval, optlen)
165 GDBM_File db
166 int optflag
167 int &optval
168 int optlen
169
9fe6733a 170
9fe6733a
PM
171SV *
172filter_fetch_key(db, code)
173 GDBM_File db
174 SV * code
175 SV * RETVAL = &PL_sv_undef ;
176 CODE:
6a31061a 177 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a
PM
178
179SV *
180filter_store_key(db, code)
181 GDBM_File db
182 SV * code
183 SV * RETVAL = &PL_sv_undef ;
184 CODE:
6a31061a 185 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a
PM
186
187SV *
188filter_fetch_value(db, code)
189 GDBM_File db
190 SV * code
191 SV * RETVAL = &PL_sv_undef ;
192 CODE:
6a31061a 193 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a
PM
194
195SV *
196filter_store_value(db, code)
197 GDBM_File db
198 SV * code
199 SV * RETVAL = &PL_sv_undef ;
200 CODE:
6a31061a 201 DBM_setFilter(db->filter_store_value, code) ;
9fe6733a 202