Merge branch 'vincent/rvalue_stmt_given' into blead
[p5sagit/p5-mst-13.2.git] / ext / GDBM_File / GDBM_File.xs
CommitLineData
a0d0e21e 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
5#include <gdbm.h>
6#include <fcntl.h>
7
9fe6733a 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 29{
30 croak("GDBM_File::%s not implemented on this architecture", s);
31 return -1;
32}
8063af02 33#endif
a0d0e21e 34
097d66a9 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 45}
46
e50aee73 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 58
59MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
60
1cb0fb50 61INCLUDE: const-xs.inc
a0d0e21e 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 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 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 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);
eb99164f 97 safefree(db);
a0d0e21e 98
9fe6733a 99#define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
100datum_value
a0d0e21e 101gdbm_FETCH(db, key)
102 GDBM_File db
0bf2e707 103 datum_key_copy key
a0d0e21e 104
9fe6733a 105#define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
a0d0e21e 106int
107gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
108 GDBM_File db
9fe6733a 109 datum_key key
110 datum_value value
a0d0e21e 111 int flags
112 CLEANUP:
113 if (RETVAL) {
114 if (RETVAL < 0 && errno == EPERM)
115 croak("No write permission to gdbm file");
748a9306 116 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
a0d0e21e 117 RETVAL,errno,key.dsize,key.dptr);
a0d0e21e 118 }
119
9fe6733a 120#define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
a0d0e21e 121int
122gdbm_DELETE(db, key)
123 GDBM_File db
9fe6733a 124 datum_key key
a0d0e21e 125
9fe6733a 126#define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
127datum_key
a0d0e21e 128gdbm_FIRSTKEY(db)
129 GDBM_File db
130
9fe6733a 131#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
132datum_key
a0d0e21e 133gdbm_NEXTKEY(db, key)
134 GDBM_File db
0bf2e707 135 datum_key key
a0d0e21e 136
9fe6733a 137#define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
a0d0e21e 138int
139gdbm_reorganize(db)
140 GDBM_File db
141
3b35bae3 142
9fe6733a 143#define gdbm_sync(db) gdbm_sync(db->dbp)
3b35bae3 144void
145gdbm_sync(db)
146 GDBM_File db
147
9fe6733a 148#define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
3b35bae3 149int
c07a80fd 150gdbm_EXISTS(db, key)
3b35bae3 151 GDBM_File db
9fe6733a 152 datum_key key
3b35bae3 153
9fe6733a 154#define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
3b35bae3 155int
156gdbm_setopt (db, optflag, optval, optlen)
157 GDBM_File db
158 int optflag
159 int &optval
160 int optlen
161
9fe6733a 162
9fe6733a 163SV *
164filter_fetch_key(db, code)
165 GDBM_File db
166 SV * code
167 SV * RETVAL = &PL_sv_undef ;
168 CODE:
6a31061a 169 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a 170
171SV *
172filter_store_key(db, code)
173 GDBM_File db
174 SV * code
175 SV * RETVAL = &PL_sv_undef ;
176 CODE:
6a31061a 177 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a 178
179SV *
180filter_fetch_value(db, code)
181 GDBM_File db
182 SV * code
183 SV * RETVAL = &PL_sv_undef ;
184 CODE:
6a31061a 185 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a 186
187SV *
188filter_store_value(db, code)
189 GDBM_File db
190 SV * code
191 SV * RETVAL = &PL_sv_undef ;
192 CODE:
6a31061a 193 DBM_setFilter(db->filter_store_value, code) ;
9fe6733a 194