c6dc484fa15f1c44b22b0093390a36f5dde42546
[p5sagit/p5-mst-13.2.git] / ext / GDBM_File / GDBM_File.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include <gdbm.h>
6 #include <fcntl.h>
7
8 typedef GDBM_FILE GDBM_File;
9
10 #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
11 #define gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func) \
12         gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)
13
14 #define gdbm_FETCH(db,key)                      gdbm_fetch(db,key)
15 #define gdbm_STORE(db,key,value,flags)          gdbm_store(db,key,value,flags)
16 #define gdbm_DELETE(db,key)                     gdbm_delete(db,key)
17 #define gdbm_FIRSTKEY(db)                       gdbm_firstkey(db)
18 #define gdbm_NEXTKEY(db,key)                    gdbm_nextkey(db,key)
19
20 typedef datum gdatum;
21
22 typedef void (*FATALFUNC)();
23
24 static int
25 not_here(s)
26 char *s;
27 {
28     croak("GDBM_File::%s not implemented on this architecture", s);
29     return -1;
30 }
31
32 static double
33 constant(name, arg)
34 char *name;
35 int arg;
36 {
37     errno = 0;
38     switch (*name) {
39     case 'A':
40         break;
41     case 'B':
42         break;
43     case 'C':
44         break;
45     case 'D':
46         break;
47     case 'E':
48         break;
49     case 'F':
50         break;
51     case 'G':
52         if (strEQ(name, "GDBM_CACHESIZE"))
53 #ifdef GDBM_CACHESIZE
54             return GDBM_CACHESIZE;
55 #else
56             goto not_there;
57 #endif
58         if (strEQ(name, "GDBM_FAST"))
59 #ifdef GDBM_FAST
60             return GDBM_FAST;
61 #else
62             goto not_there;
63 #endif
64         if (strEQ(name, "GDBM_FASTMODE"))
65 #ifdef GDBM_FASTMODE
66             return GDBM_FASTMODE;
67 #else
68             goto not_there;
69 #endif
70         if (strEQ(name, "GDBM_INSERT"))
71 #ifdef GDBM_INSERT
72             return GDBM_INSERT;
73 #else
74             goto not_there;
75 #endif
76         if (strEQ(name, "GDBM_NEWDB"))
77 #ifdef GDBM_NEWDB
78             return GDBM_NEWDB;
79 #else
80             goto not_there;
81 #endif
82         if (strEQ(name, "GDBM_READER"))
83 #ifdef GDBM_READER
84             return GDBM_READER;
85 #else
86             goto not_there;
87 #endif
88         if (strEQ(name, "GDBM_REPLACE"))
89 #ifdef GDBM_REPLACE
90             return GDBM_REPLACE;
91 #else
92             goto not_there;
93 #endif
94         if (strEQ(name, "GDBM_WRCREAT"))
95 #ifdef GDBM_WRCREAT
96             return GDBM_WRCREAT;
97 #else
98             goto not_there;
99 #endif
100         if (strEQ(name, "GDBM_WRITER"))
101 #ifdef GDBM_WRITER
102             return GDBM_WRITER;
103 #else
104             goto not_there;
105 #endif
106         break;
107     case 'H':
108         break;
109     case 'I':
110         break;
111     case 'J':
112         break;
113     case 'K':
114         break;
115     case 'L':
116         break;
117     case 'M':
118         break;
119     case 'N':
120         break;
121     case 'O':
122         break;
123     case 'P':
124         break;
125     case 'Q':
126         break;
127     case 'R':
128         break;
129     case 'S':
130         break;
131     case 'T':
132         break;
133     case 'U':
134         break;
135     case 'V':
136         break;
137     case 'W':
138         break;
139     case 'X':
140         break;
141     case 'Y':
142         break;
143     case 'Z':
144         break;
145     }
146     errno = EINVAL;
147     return 0;
148
149 not_there:
150     errno = ENOENT;
151     return 0;
152 }
153
154 MODULE = GDBM_File      PACKAGE = GDBM_File     PREFIX = gdbm_
155
156 double
157 constant(name,arg)
158         char *          name
159         int             arg
160
161
162 GDBM_File
163 gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
164         char *          dbtype
165         char *          name
166         int             read_write
167         int             mode
168         FATALFUNC       fatal_func
169
170 void
171 gdbm_close(db)
172         GDBM_File       db
173         CLEANUP:
174
175 void
176 gdbm_DESTROY(db)
177         GDBM_File       db
178         CODE:
179         gdbm_close(db);
180
181 gdatum
182 gdbm_FETCH(db, key)
183         GDBM_File       db
184         datum           key
185
186 int
187 gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
188         GDBM_File       db
189         datum           key
190         datum           value
191         int             flags
192     CLEANUP:
193         if (RETVAL) {
194             if (RETVAL < 0 && errno == EPERM)
195                 croak("No write permission to gdbm file");
196             warn("gdbm store returned %d, errno %d, key \"%.*s\"",
197                         RETVAL,errno,key.dsize,key.dptr);
198             /* gdbm_clearerr(db); */
199         }
200
201 int
202 gdbm_DELETE(db, key)
203         GDBM_File       db
204         datum           key
205
206 gdatum
207 gdbm_FIRSTKEY(db)
208         GDBM_File       db
209
210 gdatum
211 gdbm_NEXTKEY(db, key)
212         GDBM_File       db
213         datum           key
214
215 int
216 gdbm_reorganize(db)
217         GDBM_File       db
218