summaryrefslogtreecommitdiffstats
path: root/libdb/mydbm.h
diff options
context:
space:
mode:
Diffstat (limited to 'libdb/mydbm.h')
-rw-r--r--libdb/mydbm.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/libdb/mydbm.h b/libdb/mydbm.h
new file mode 100644
index 0000000..370a91a
--- /dev/null
+++ b/libdb/mydbm.h
@@ -0,0 +1,200 @@
+/*
+ * mydbm.h: database interface definitions and prototypes.
+ *
+ * Copyright (C) 1994, 1995, Graeme W. Wilford. (Wilf.)
+ *
+ * This file is part of man-db.
+ *
+ * man-db is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * man-db is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with man-db; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Header file to make programming independent of db type used
+ *
+ * Currently satisfies:
+ *
+ * *hash based*
+ * GNU dbm: (gdbm & ndbm)
+ * Berkeley db: (ndbm)
+ * `native': (ndbm)
+ *
+ * *binary tree based*
+ * Berkeley db: (BTREE)
+ *
+ * Tue Apr 26 12:56:44 BST 1994 Wilf. (G.Wilford@ee.surrey.ac.uk)
+ */
+
+#ifndef MYDBM_H
+# define MYDBM_H
+
+# include <stdbool.h>
+
+# include "timespec.h"
+# include "xvasprintf.h"
+
+# if defined(GDBM) && !defined(NDBM) && !defined(BTREE)
+
+# include <gdbm.h>
+
+# ifndef HAVE_GDBM_EXISTS
+extern int gdbm_exists (GDBM_FILE db, datum key);
+# endif /* !HAVE_GDBM_EXISTS */
+
+/* gdbm_nextkey() is not lexicographically sorted, so we need to keep the
+ * filename around to use as a hash key.
+ */
+typedef struct {
+ char *name;
+ GDBM_FILE file;
+ struct timespec *mtime;
+} *man_gdbm_wrapper;
+
+man_gdbm_wrapper man_gdbm_new (const char *name);
+bool man_gdbm_open_wrapper (man_gdbm_wrapper wrap, int flags);
+datum man_gdbm_firstkey (man_gdbm_wrapper wrap);
+datum man_gdbm_nextkey (man_gdbm_wrapper wrap, datum key);
+struct timespec man_gdbm_get_time (man_gdbm_wrapper wrap);
+void man_gdbm_free (man_gdbm_wrapper wrap);
+
+# define BLK_SIZE 0 /* to invoke normal fs block size */
+# define DB_EXT ".db"
+# define MYDBM_FILE man_gdbm_wrapper
+# define MYDBM_NEW(file) man_gdbm_new(file)
+# define MYDBM_DPTR(d) ((d).dptr)
+# define MYDBM_SET_DPTR(d, value) ((d).dptr = (value))
+# define MYDBM_DSIZE(d) ((d).dsize)
+# define MYDBM_CTRWOPEN(wrap) \
+ man_gdbm_open_wrapper(wrap, GDBM_NEWDB|GDBM_FAST)
+# define MYDBM_RWOPEN(wrap) \
+ man_gdbm_open_wrapper(wrap, GDBM_WRITER|GDBM_FAST)
+# define MYDBM_RDOPEN(wrap) \
+ man_gdbm_open_wrapper(wrap, GDBM_READER)
+# define MYDBM_INSERT(db, key, cont) gdbm_store((db)->file, key, cont, GDBM_INSERT)
+# define MYDBM_REPLACE(db, key, cont) gdbm_store((db)->file, key, cont, GDBM_REPLACE)
+# define MYDBM_EXISTS(db, key) gdbm_exists((db)->file, key)
+# define MYDBM_DELETE(db, key) gdbm_delete((db)->file, key)
+# define MYDBM_FETCH(db, key) gdbm_fetch((db)->file, key)
+# define MYDBM_FREE(db) man_gdbm_free(db)
+# define MYDBM_FIRSTKEY(db) man_gdbm_firstkey(db)
+# define MYDBM_NEXTKEY(db, key) man_gdbm_nextkey(db, key)
+# define MYDBM_GET_TIME(db) man_gdbm_get_time(db)
+
+# elif defined(NDBM) && !defined(GDBM) && !defined(BTREE)
+
+# include <fcntl.h>
+# include <ndbm.h>
+
+/* Berkeley db routines emulate ndbm but don't add .dir & .pag, just .db! */
+# ifdef _DB_H_ /* has Berkeley db.h been included? */
+# define BERKELEY_DB
+# endif /* _DB_H_ */
+
+typedef struct {
+ char *name;
+ DBM *file;
+ struct timespec *mtime;
+} *man_ndbm_wrapper;
+
+extern man_ndbm_wrapper man_ndbm_new (const char *name);
+extern bool man_ndbm_open (man_ndbm_wrapper wrap, int flags, int mode);
+extern datum man_ndbm_firstkey (man_ndbm_wrapper wrap);
+extern datum man_ndbm_nextkey (man_ndbm_wrapper wrap, datum key);
+extern struct timespec man_ndbm_get_time (man_ndbm_wrapper wrap);
+extern void man_ndbm_free (man_ndbm_wrapper wrap);
+
+# define DB_EXT ""
+# define MYDBM_FILE man_ndbm_wrapper
+# define MYDBM_NEW(file) man_ndbm_new(file)
+# define MYDBM_DPTR(d) ((d).dptr)
+# define MYDBM_SET_DPTR(d, value) ((d).dptr = (value))
+# define MYDBM_DSIZE(d) ((d).dsize)
+# define MYDBM_CTRWOPEN(wrap) man_ndbm_open(wrap, O_TRUNC|O_CREAT|O_RDWR, DBMODE)
+# define MYDBM_RWOPEN(wrap) man_ndbm_open(wrap, O_RDWR, DBMODE)
+# define MYDBM_RDOPEN(wrap) man_ndbm_open(wrap, O_RDONLY, DBMODE)
+# define MYDBM_INSERT(db, key, cont) dbm_store((db)->file, key, cont, DBM_INSERT)
+# define MYDBM_REPLACE(db, key, cont) dbm_store((db)->file, key, cont, DBM_REPLACE)
+# define MYDBM_EXISTS(db, key) (dbm_fetch((db)->file, key).dptr != NULL)
+# define MYDBM_DELETE(db, key) dbm_delete((db)->file, key)
+# define MYDBM_FETCH(db, key) copy_datum(dbm_fetch((db)->file, key))
+# define MYDBM_FREE(db) man_ndbm_free(db)
+# define MYDBM_FIRSTKEY(db) man_ndbm_firstkey(db)
+# define MYDBM_NEXTKEY(db, key) man_ndbm_nextkey(db, key)
+# define MYDBM_GET_TIME(db) man_ndbm_get_time(db)
+
+# elif defined(BTREE) && !defined(NDBM) && !defined(GDBM)
+
+# include <sys/types.h>
+# include <fcntl.h>
+# include <limits.h>
+# include BDB_H
+
+typedef struct {
+ char *name;
+ DB *file;
+ struct timespec *mtime;
+} *man_btree_wrapper;
+
+typedef DBT datum;
+
+extern man_btree_wrapper man_btree_new (const char *filename);
+extern bool man_btree_open (man_btree_wrapper wrap, int flags, int mode);
+extern void man_btree_free (man_btree_wrapper wrap);
+extern int man_btree_exists (man_btree_wrapper wrap, datum key);
+extern datum man_btree_fetch (man_btree_wrapper wrap, datum key);
+extern int man_btree_insert (man_btree_wrapper wrap, datum key, datum cont);
+extern datum man_btree_firstkey (man_btree_wrapper wrap);
+extern datum man_btree_nextkey (man_btree_wrapper wrap);
+extern int man_btree_replace (man_btree_wrapper wrap,
+ datum key, datum content);
+extern int man_btree_nextkeydata (man_btree_wrapper wrap,
+ datum *key, datum *cont);
+extern struct timespec man_btree_get_time (man_btree_wrapper wrap);
+
+# define DB_EXT ".bt"
+# define MYDBM_FILE man_btree_wrapper
+# define MYDBM_NEW(file) man_btree_new(file)
+# define MYDBM_DPTR(d) ((char *) (d).data)
+# define MYDBM_SET_DPTR(d, value) ((d).data = (char *) (value))
+# define MYDBM_DSIZE(d) ((d).size)
+# define MYDBM_CTRWOPEN(wrap) man_btree_open(wrap, O_TRUNC|O_CREAT|O_RDWR, DBMODE)
+# define MYDBM_RWOPEN(wrap) man_btree_open(wrap, O_RDWR, DBMODE)
+# define MYDBM_RDOPEN(wrap) man_btree_open(wrap, O_RDONLY, DBMODE)
+# define MYDBM_INSERT(db, key, cont) man_btree_insert(db, key, cont)
+# define MYDBM_REPLACE(db, key, cont) man_btree_replace(db, key, cont)
+# define MYDBM_EXISTS(db, key) man_btree_exists(db, key)
+# define MYDBM_DELETE(db, key) (((db)->file->del)((db)->file, &key, 0) ? -1 : 0)
+# define MYDBM_FETCH(db, key) man_btree_fetch(db, key)
+# define MYDBM_FREE(db) man_btree_free(db)
+# define MYDBM_FIRSTKEY(db) man_btree_firstkey(db)
+# define MYDBM_NEXTKEY(db, key) man_btree_nextkey(db)
+# define MYDBM_GET_TIME(db) man_btree_get_time(db)
+
+# else /* not GDBM or NDBM or BTREE */
+# error Define either GDBM, NDBM or BTREE before including mydbm.h
+# endif /* not GDBM or NDBM or BTREE */
+
+#define MYDBM_RESET_DSIZE(d) (MYDBM_DSIZE(d) = strlen(MYDBM_DPTR(d)) + 1)
+#define MYDBM_SET(d, value) do { MYDBM_SET_DPTR(d, value); MYDBM_RESET_DSIZE(d); } while (0)
+#define MYDBM_FREE_DPTR(d) do { free (MYDBM_DPTR (d)); MYDBM_SET_DPTR (d, NULL); } while (0)
+
+/* db_lookup.c */
+extern datum copy_datum (datum dat);
+
+/* db_ver.c */
+extern void dbver_wr(MYDBM_FILE dbfile);
+extern int dbver_rd(MYDBM_FILE dbfile);
+
+#define MAN_DB "/index" DB_EXT
+#define mkdbname(path) xasprintf ("%s%s", path, MAN_DB)
+
+#endif /* MYDBM_H */