(root)/
man-db-2.12.0/
libdb/
mydbm.h
       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 */