1 /*
2 * mydbm.h: database interface definitions and prototypes.
3 *
4 * Copyright (C) 1994, 1995, Graeme W. Wilford. (Wilf.)
5 *
6 * This file is part of man-db.
7 *
8 * man-db is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * man-db is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with man-db; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * Header file to make programming independent of db type used
23 *
24 * Currently satisfies:
25 *
26 * *hash based*
27 * GNU dbm: (gdbm & ndbm)
28 * Berkeley db: (ndbm)
29 * `native': (ndbm)
30 *
31 * *binary tree based*
32 * Berkeley db: (BTREE)
33 *
34 * Tue Apr 26 12:56:44 BST 1994 Wilf. (G.Wilford@ee.surrey.ac.uk)
35 */
36
37 #ifndef MYDBM_H
38 # define MYDBM_H
39
40 # include <stdbool.h>
41
42 # include "timespec.h"
43 # include "xvasprintf.h"
44
45 # if defined(GDBM) && !defined(NDBM) && !defined(BTREE)
46
47 # include <gdbm.h>
48
49 # ifndef HAVE_GDBM_EXISTS
50 extern int gdbm_exists (GDBM_FILE db, datum key);
51 # endif /* !HAVE_GDBM_EXISTS */
52
53 /* gdbm_nextkey() is not lexicographically sorted, so we need to keep the
54 * filename around to use as a hash key.
55 */
56 typedef struct {
57 char *name;
58 GDBM_FILE file;
59 struct timespec *mtime;
60 } *man_gdbm_wrapper;
61
62 man_gdbm_wrapper man_gdbm_new (const char *name);
63 bool man_gdbm_open_wrapper (man_gdbm_wrapper wrap, int flags);
64 datum man_gdbm_firstkey (man_gdbm_wrapper wrap);
65 datum man_gdbm_nextkey (man_gdbm_wrapper wrap, datum key);
66 struct timespec man_gdbm_get_time (man_gdbm_wrapper wrap);
67 void man_gdbm_free (man_gdbm_wrapper wrap);
68
69 # define BLK_SIZE 0 /* to invoke normal fs block size */
70 # define DB_EXT ".db"
71 # define MYDBM_FILE man_gdbm_wrapper
72 # define MYDBM_NEW(file) man_gdbm_new(file)
73 # define MYDBM_DPTR(d) ((d).dptr)
74 # define MYDBM_SET_DPTR(d, value) ((d).dptr = (value))
75 # define MYDBM_DSIZE(d) ((d).dsize)
76 # define MYDBM_CTRWOPEN(wrap) \
77 man_gdbm_open_wrapper(wrap, GDBM_NEWDB|GDBM_FAST)
78 # define MYDBM_RWOPEN(wrap) \
79 man_gdbm_open_wrapper(wrap, GDBM_WRITER|GDBM_FAST)
80 # define MYDBM_RDOPEN(wrap) \
81 man_gdbm_open_wrapper(wrap, GDBM_READER)
82 # define MYDBM_INSERT(db, key, cont) gdbm_store((db)->file, key, cont, GDBM_INSERT)
83 # define MYDBM_REPLACE(db, key, cont) gdbm_store((db)->file, key, cont, GDBM_REPLACE)
84 # define MYDBM_EXISTS(db, key) gdbm_exists((db)->file, key)
85 # define MYDBM_DELETE(db, key) gdbm_delete((db)->file, key)
86 # define MYDBM_FETCH(db, key) gdbm_fetch((db)->file, key)
87 # define MYDBM_FREE(db) man_gdbm_free(db)
88 # define MYDBM_FIRSTKEY(db) man_gdbm_firstkey(db)
89 # define MYDBM_NEXTKEY(db, key) man_gdbm_nextkey(db, key)
90 # define MYDBM_GET_TIME(db) man_gdbm_get_time(db)
91
92 # elif defined(NDBM) && !defined(GDBM) && !defined(BTREE)
93
94 # include <fcntl.h>
95 # include <ndbm.h>
96
97 /* Berkeley db routines emulate ndbm but don't add .dir & .pag, just .db! */
98 # ifdef _DB_H_ /* has Berkeley db.h been included? */
99 # define BERKELEY_DB
100 # endif /* _DB_H_ */
101
102 typedef struct {
103 char *name;
104 DBM *file;
105 struct timespec *mtime;
106 } *man_ndbm_wrapper;
107
108 extern man_ndbm_wrapper man_ndbm_new (const char *name);
109 extern bool man_ndbm_open (man_ndbm_wrapper wrap, int flags, int mode);
110 extern datum man_ndbm_firstkey (man_ndbm_wrapper wrap);
111 extern datum man_ndbm_nextkey (man_ndbm_wrapper wrap, datum key);
112 extern struct timespec man_ndbm_get_time (man_ndbm_wrapper wrap);
113 extern void man_ndbm_free (man_ndbm_wrapper wrap);
114
115 # define DB_EXT ""
116 # define MYDBM_FILE man_ndbm_wrapper
117 # define MYDBM_NEW(file) man_ndbm_new(file)
118 # define MYDBM_DPTR(d) ((d).dptr)
119 # define MYDBM_SET_DPTR(d, value) ((d).dptr = (value))
120 # define MYDBM_DSIZE(d) ((d).dsize)
121 # define MYDBM_CTRWOPEN(wrap) man_ndbm_open(wrap, O_TRUNC|O_CREAT|O_RDWR, DBMODE)
122 # define MYDBM_RWOPEN(wrap) man_ndbm_open(wrap, O_RDWR, DBMODE)
123 # define MYDBM_RDOPEN(wrap) man_ndbm_open(wrap, O_RDONLY, DBMODE)
124 # define MYDBM_INSERT(db, key, cont) dbm_store((db)->file, key, cont, DBM_INSERT)
125 # define MYDBM_REPLACE(db, key, cont) dbm_store((db)->file, key, cont, DBM_REPLACE)
126 # define MYDBM_EXISTS(db, key) (dbm_fetch((db)->file, key).dptr != NULL)
127 # define MYDBM_DELETE(db, key) dbm_delete((db)->file, key)
128 # define MYDBM_FETCH(db, key) copy_datum(dbm_fetch((db)->file, key))
129 # define MYDBM_FREE(db) man_ndbm_free(db)
130 # define MYDBM_FIRSTKEY(db) man_ndbm_firstkey(db)
131 # define MYDBM_NEXTKEY(db, key) man_ndbm_nextkey(db, key)
132 # define MYDBM_GET_TIME(db) man_ndbm_get_time(db)
133
134 # elif defined(BTREE) && !defined(NDBM) && !defined(GDBM)
135
136 # include <sys/types.h>
137 # include <fcntl.h>
138 # include <limits.h>
139 # include BDB_H
140
141 typedef struct {
142 char *name;
143 DB *file;
144 struct timespec *mtime;
145 } *man_btree_wrapper;
146
147 typedef DBT datum;
148
149 extern man_btree_wrapper man_btree_new (const char *filename);
150 extern bool man_btree_open (man_btree_wrapper wrap, int flags, int mode);
151 extern void man_btree_free (man_btree_wrapper wrap);
152 extern int man_btree_exists (man_btree_wrapper wrap, datum key);
153 extern datum man_btree_fetch (man_btree_wrapper wrap, datum key);
154 extern int man_btree_insert (man_btree_wrapper wrap, datum key, datum cont);
155 extern datum man_btree_firstkey (man_btree_wrapper wrap);
156 extern datum man_btree_nextkey (man_btree_wrapper wrap);
157 extern int man_btree_replace (man_btree_wrapper wrap,
158 datum key, datum content);
159 extern int man_btree_nextkeydata (man_btree_wrapper wrap,
160 datum *key, datum *cont);
161 extern struct timespec man_btree_get_time (man_btree_wrapper wrap);
162
163 # define DB_EXT ".bt"
164 # define MYDBM_FILE man_btree_wrapper
165 # define MYDBM_NEW(file) man_btree_new(file)
166 # define MYDBM_DPTR(d) ((char *) (d).data)
167 # define MYDBM_SET_DPTR(d, value) ((d).data = (char *) (value))
168 # define MYDBM_DSIZE(d) ((d).size)
169 # define MYDBM_CTRWOPEN(wrap) man_btree_open(wrap, O_TRUNC|O_CREAT|O_RDWR, DBMODE)
170 # define MYDBM_RWOPEN(wrap) man_btree_open(wrap, O_RDWR, DBMODE)
171 # define MYDBM_RDOPEN(wrap) man_btree_open(wrap, O_RDONLY, DBMODE)
172 # define MYDBM_INSERT(db, key, cont) man_btree_insert(db, key, cont)
173 # define MYDBM_REPLACE(db, key, cont) man_btree_replace(db, key, cont)
174 # define MYDBM_EXISTS(db, key) man_btree_exists(db, key)
175 # define MYDBM_DELETE(db, key) (((db)->file->del)((db)->file, &key, 0) ? -1 : 0)
176 # define MYDBM_FETCH(db, key) man_btree_fetch(db, key)
177 # define MYDBM_FREE(db) man_btree_free(db)
178 # define MYDBM_FIRSTKEY(db) man_btree_firstkey(db)
179 # define MYDBM_NEXTKEY(db, key) man_btree_nextkey(db)
180 # define MYDBM_GET_TIME(db) man_btree_get_time(db)
181
182 # else /* not GDBM or NDBM or BTREE */
183 # error Define either GDBM, NDBM or BTREE before including mydbm.h
184 # endif /* not GDBM or NDBM or BTREE */
185
186 #define MYDBM_RESET_DSIZE(d) (MYDBM_DSIZE(d) = strlen(MYDBM_DPTR(d)) + 1)
187 #define MYDBM_SET(d, value) do { MYDBM_SET_DPTR(d, value); MYDBM_RESET_DSIZE(d); } while (0)
188 #define MYDBM_FREE_DPTR(d) do { free (MYDBM_DPTR (d)); MYDBM_SET_DPTR (d, NULL); } while (0)
189
190 /* db_lookup.c */
191 extern datum copy_datum (datum dat);
192
193 /* db_ver.c */
194 extern void dbver_wr(MYDBM_FILE dbfile);
195 extern int dbver_rd(MYDBM_FILE dbfile);
196
197 #define MAN_DB "/index" DB_EXT
198 #define mkdbname(path) xasprintf ("%s%s", path, MAN_DB)
199
200 #endif /* MYDBM_H */