File Coverage

ext/SDBM_File/SDBM_File.xs
Criterion Covered Total %
statement 11 16 68.8
branch n/a
condition n/a
subroutine n/a
total 11 16 68.8


line stmt bran cond sub time code
1           #define PERL_NO_GET_CONTEXT
2           #include "EXTERN.h"
3           #include "perl.h"
4           #include "XSUB.h"
5           #include "sdbm/sdbm.h"
6            
7           #define fetch_key 0
8           #define store_key 1
9           #define fetch_value 2
10           #define store_value 3
11            
12           typedef struct {
13           DBM * dbp ;
14           SV * filter[4];
15           int filtering ;
16           } SDBM_File_type;
17            
18           typedef SDBM_File_type * SDBM_File ;
19           typedef datum datum_key ;
20           typedef datum datum_value ;
21            
22           #define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
23           #define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key)
24           #define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags)
25           #define sdbm_DELETE(db,key) sdbm_delete(db->dbp,key)
26           #define sdbm_EXISTS(db,key) sdbm_exists(db->dbp,key)
27           #define sdbm_FIRSTKEY(db) sdbm_firstkey(db->dbp)
28           #define sdbm_NEXTKEY(db,key) sdbm_nextkey(db->dbp)
29            
30            
31           MODULE = SDBM_File PACKAGE = SDBM_File PREFIX = sdbm_
32            
33           SDBM_File
34           sdbm_TIEHASH(dbtype, filename, flags, mode)
35           char * dbtype
36           char * filename
37           int flags
38           int mode
39           CODE:
40           {
41           DBM * dbp ;
42            
43           RETVAL = NULL ;
44 128         if ((dbp = sdbm_open(filename,flags,mode))) {
45 112         RETVAL = (SDBM_File)safecalloc(1, sizeof(SDBM_File_type));
46 112         RETVAL->dbp = dbp ;
47           }
48          
49           }
50           OUTPUT:
51           RETVAL
52            
53           void
54           sdbm_DESTROY(db)
55           SDBM_File db
56           CODE:
57 112         if (db) {
58           int i = store_value;
59 112         sdbm_close(db->dbp);
60           do {
61 448         if (db->filter[i])
62 158         SvREFCNT_dec(db->filter[i]);
63 448         } while (i-- > 0);
64 112         safefree(db) ;
65           }
66            
67           datum_value
68           sdbm_FETCH(db, key)
69           SDBM_File db
70           datum_key key
71            
72           int
73           sdbm_STORE(db, key, value, flags = DBM_REPLACE)
74           SDBM_File db
75           datum_key key
76           datum_value value
77           int flags
78           CLEANUP:
79 1984         if (RETVAL) {
80 0         if (RETVAL < 0 && errno == EPERM)
81 0         croak("No write permission to sdbm file");
82 0         croak("sdbm store returned %d, errno %d, key \"%s\"",
83 0         RETVAL,errno,key.dptr);
84           sdbm_clearerr(db->dbp);
85           }
86            
87           int
88           sdbm_DELETE(db, key)
89           SDBM_File db
90           datum_key key
91            
92           int
93           sdbm_EXISTS(db,key)
94           SDBM_File db
95           datum_key key
96            
97           datum_key
98           sdbm_FIRSTKEY(db)
99           SDBM_File db
100            
101           datum_key
102           sdbm_NEXTKEY(db, key)
103           SDBM_File db
104           datum_key key;
105            
106           int
107           sdbm_error(db)
108           SDBM_File db
109           ALIAS:
110           sdbm_clearerr = 1
111           CODE:
112 0         RETVAL = ix ? sdbm_clearerr(db->dbp) : sdbm_error(db->dbp);
113           OUTPUT:
114           RETVAL
115            
116           SV *
117           filter_fetch_key(db, code)
118           SDBM_File db
119           SV * code
120           SV * RETVAL = &PL_sv_undef ;
121           ALIAS:
122           SDBM_File::filter_fetch_key = fetch_key
123           SDBM_File::filter_store_key = store_key
124           SDBM_File::filter_fetch_value = fetch_value
125           SDBM_File::filter_store_value = store_value
126           CODE:
127 574         DBM_setFilter(db->filter[ix], code);