Fix DBM filters
[p5sagit/p5-mst-13.2.git] / ext / NDBM_File / NDBM_File.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 /* If using the DB3 emulation, ENTER is defined both
5  * by DB3 and Perl.  We drop the Perl definition now.
6  * See also INSTALL section on DB3.
7  * -- Stanislav Brabec <utx@penguin.cz> */
8 #include <ndbm.h>
9
10 typedef struct {
11         DBM *   dbp ;
12         SV *    filter_fetch_key ;
13         SV *    filter_store_key ;
14         SV *    filter_fetch_value ;
15         SV *    filter_store_value ;
16         int     filtering ;
17         } NDBM_File_type;
18
19 typedef NDBM_File_type * NDBM_File ;
20 typedef datum datum_key ;
21 typedef datum datum_value ;
22
23 MODULE = NDBM_File      PACKAGE = NDBM_File     PREFIX = ndbm_
24
25 NDBM_File
26 ndbm_TIEHASH(dbtype, filename, flags, mode)
27         char *          dbtype
28         char *          filename
29         int             flags
30         int             mode
31         CODE:
32         {
33             DBM *       dbp ;
34
35             RETVAL = NULL ;
36             if ((dbp =  dbm_open(filename, flags, mode))) {
37                 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
38                 Zero(RETVAL, 1, NDBM_File_type) ;
39                 RETVAL->dbp = dbp ;
40             }
41             
42         }
43         OUTPUT:
44           RETVAL
45
46 void
47 ndbm_DESTROY(db)
48         NDBM_File       db
49         CODE:
50         dbm_close(db->dbp);
51         safefree(db);
52
53 #define ndbm_FETCH(db,key)                      dbm_fetch(db->dbp,key)
54 datum_value
55 ndbm_FETCH(db, key)
56         NDBM_File       db
57         datum_key       key
58
59 #define ndbm_STORE(db,key,value,flags)          dbm_store(db->dbp,key,value,flags)
60 int
61 ndbm_STORE(db, key, value, flags = DBM_REPLACE)
62         NDBM_File       db
63         datum_key       key
64         datum_value     value
65         int             flags
66     CLEANUP:
67         if (RETVAL) {
68             if (RETVAL < 0 && errno == EPERM)
69                 croak("No write permission to ndbm file");
70             croak("ndbm store returned %d, errno %d, key \"%s\"",
71                         RETVAL,errno,key.dptr);
72             dbm_clearerr(db->dbp);
73         }
74
75 #define ndbm_DELETE(db,key)                     dbm_delete(db->dbp,key)
76 int
77 ndbm_DELETE(db, key)
78         NDBM_File       db
79         datum_key       key
80
81 #define ndbm_FIRSTKEY(db)                       dbm_firstkey(db->dbp)
82 datum_key
83 ndbm_FIRSTKEY(db)
84         NDBM_File       db
85
86 #define ndbm_NEXTKEY(db,key)                    dbm_nextkey(db->dbp)
87 datum_key
88 ndbm_NEXTKEY(db, key)
89         NDBM_File       db
90         datum_key       key = NO_INIT
91
92 #define ndbm_error(db)                          dbm_error(db->dbp)
93 int
94 ndbm_error(db)
95         NDBM_File       db
96
97 #define ndbm_clearerr(db)                       dbm_clearerr(db->dbp)
98 void
99 ndbm_clearerr(db)
100         NDBM_File       db
101
102
103 SV *
104 filter_fetch_key(db, code)
105         NDBM_File       db
106         SV *            code
107         SV *            RETVAL = &PL_sv_undef ;
108         CODE:
109             DBM_setFilter(db->filter_fetch_key, code) ;
110
111 SV *
112 filter_store_key(db, code)
113         NDBM_File       db
114         SV *            code
115         SV *            RETVAL =  &PL_sv_undef ;
116         CODE:
117             DBM_setFilter(db->filter_store_key, code) ;
118
119 SV *
120 filter_fetch_value(db, code)
121         NDBM_File       db
122         SV *            code
123         SV *            RETVAL =  &PL_sv_undef ;
124         CODE:
125             DBM_setFilter(db->filter_fetch_value, code) ;
126
127 SV *
128 filter_store_value(db, code)
129         NDBM_File       db
130         SV *            code
131         SV *            RETVAL =  &PL_sv_undef ;
132         CODE:
133             DBM_setFilter(db->filter_store_value, code) ;
134