c1b405ff89bb7b10a8421fd99c0006852d5a8bdf
[p5sagit/p5-mst-13.2.git] / ext / ODBM_File / ODBM_File.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #ifdef NULL
6 #undef NULL
7 #endif
8 #ifdef I_DBM
9 #  include <dbm.h>
10 #else
11 #  ifdef I_RPCSVC_DBM
12 #    include <rpcsvc/dbm.h>
13 #  endif
14 #endif
15
16 #include <fcntl.h>
17
18 typedef void* ODBM_File;
19
20 #define odbm_FETCH(db,key)                      fetch(key)
21 #define odbm_STORE(db,key,value,flags)          store(key,value)
22 #define odbm_DELETE(db,key)                     delete(key)
23 #define odbm_FIRSTKEY(db)                       firstkey()
24 #define odbm_NEXTKEY(db,key)                    nextkey(key)
25
26 static int dbmrefcnt;
27
28 #ifndef DBM_REPLACE
29 #define DBM_REPLACE 0
30 #endif
31
32 MODULE = ODBM_File      PACKAGE = ODBM_File     PREFIX = odbm_
33
34 ODBM_File
35 odbm_TIEHASH(dbtype, filename, flags, mode)
36         char *          dbtype
37         char *          filename
38         int             flags
39         int             mode
40         CODE:
41         {
42             char tmpbuf[1025];
43             if (dbmrefcnt++)
44                 croak("Old dbm can only open one database");
45             sprintf(tmpbuf,"%s.dir",filename);
46             if (stat(tmpbuf, &statbuf) < 0) {
47                 if (flags & O_CREAT) {
48                     if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
49                         croak("ODBM_File: Can't create %s", filename);
50                     sprintf(tmpbuf,"%s.pag",filename);
51                     if (close(creat(tmpbuf,mode)) < 0)
52                         croak("ODBM_File: Can't create %s", filename);
53                 }
54                 else
55                     croak("ODBM_FILE: Can't open %s", filename);
56             }
57             RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
58             ST(0) = sv_mortalcopy(&sv_undef);
59             sv_setptrobj(ST(0), RETVAL, "ODBM_File");
60         }
61
62 void
63 DESTROY(db)
64         ODBM_File       db
65         CODE:
66         dbmrefcnt--;
67         dbmclose();
68
69 datum
70 odbm_FETCH(db, key)
71         ODBM_File       db
72         datum           key
73
74 int
75 odbm_STORE(db, key, value, flags = DBM_REPLACE)
76         ODBM_File       db
77         datum           key
78         datum           value
79         int             flags
80     CLEANUP:
81         if (RETVAL) {
82             if (RETVAL < 0 && errno == EPERM)
83                 croak("No write permission to odbm file");
84             croak("odbm store returned %d, errno %d, key \"%s\"",
85                         RETVAL,errno,key.dptr);
86         }
87
88 int
89 odbm_DELETE(db, key)
90         ODBM_File       db
91         datum           key
92
93 datum
94 odbm_FIRSTKEY(db)
95         ODBM_File       db
96
97 datum
98 odbm_NEXTKEY(db, key)
99         ODBM_File       db
100         datum           key
101