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