diff options
| author | proven <proven@NetBSD.org> | 1993-04-18 21:48:37 +0000 |
|---|---|---|
| committer | proven <proven@NetBSD.org> | 1993-04-18 21:48:37 +0000 |
| commit | e75cc16e7707ae16a4936ba0aa0b35e7253a8243 (patch) | |
| tree | cc00571abad833a2912680d6e26d5e5a2b0067b3 /include | |
| parent | 27fc4b0b9761d17f531fcf1b90d17a582b151f3a (diff) | |
Updated header files for libdb.
Diffstat (limited to 'include')
| -rw-r--r-- | include/db.h | 169 | ||||
| -rw-r--r-- | include/mpool.h | 135 | ||||
| -rw-r--r-- | include/ndbm.h | 5 |
3 files changed, 249 insertions, 60 deletions
diff --git a/include/db.h b/include/db.h index 6a30111d53f..9a05e1ffee1 100644 --- a/include/db.h +++ b/include/db.h @@ -30,75 +30,84 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)db.h 5.10 (Berkeley) 4/2/91 - * - * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE - * -------------------- ----- ---------------------- - * CURRENT PATCH LEVEL: 1 00093 - * -------------------- ----- ---------------------- - * - * 27 Feb 93 Charles Hannum Better byte-swapping macros for - * i386/i486. + * @(#)db.h 5.21 (Berkeley) 2/14/93 */ #ifndef _DB_H_ #define _DB_H_ -#include <machine/endian.h> +#include <sys/types.h> #include <sys/cdefs.h> -/* flags for DB.put() call */ -#define R_IBEFORE 1 /* RECNO */ -#define R_IAFTER 2 /* RECNO */ -#define R_NOOVERWRITE 3 /* BTREE, HASH, RECNO */ -#define R_PUT 4 /* BTREE, HASH, RECNO */ +#include "compat.h" + +#define RET_ERROR -1 /* Return values. */ +#define RET_SUCCESS 0 +#define RET_SPECIAL 1 -/* flags for DB.seq() call */ -#define R_CURSOR 1 /* BTREE, RECNO */ -#define R_FIRST 2 /* BTREE, HASH, RECNO */ -#define R_LAST 3 /* BTREE, RECNO */ -#define R_NEXT 4 /* BTREE, HASH, RECNO */ -#define R_PREV 5 /* BTREE, RECNO */ +#define MAX_PAGE_NUMBER ULONG_MAX /* >= # of pages in a file */ +typedef u_long pgno_t; +#define MAX_PAGE_OFFSET USHRT_MAX /* >= # of bytes in a page */ +typedef u_short indx_t; +#define MAX_REC_NUMBER ULONG_MAX /* >= # of records in a tree */ +typedef u_long recno_t; -/* key/data structure -- a data-base thang */ +/* Key/data structure -- a Data-Base Thang. */ typedef struct { - void *data; - int size; + void *data; /* data */ + size_t size; /* data length */ } DBT; -/* access method description structure */ +/* Routine flags. */ +#define R_CURSOR 1 /* del, put, seq */ +#define R_CURSORLOG 2 /* put (RECNO) */ +#define R_FIRST 3 /* seq */ +#define R_IAFTER 4 /* put (RECNO) */ +#define R_IBEFORE 5 /* put (RECNO) */ +#define R_LAST 6 /* seq (BTREE, RECNO) */ +#define R_NEXT 7 /* seq */ +#define R_NOOVERWRITE 8 /* put */ +#define R_PREV 9 /* seq (BTREE, RECNO) */ +#define R_SETCURSOR 10 /* put (RECNO) */ + +typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; + +#define __USE_OPEN_FLAGS \ + (O_CREAT|O_EXCL|O_EXLOCK|O_RDONLY|O_RDWR|O_SHLOCK|O_TRUNC) + +/* Access method description structure. */ typedef struct __db { - void *internal; /* access method private */ -#define DB_BTREE 1 -#define DB_HASH 2 -#define DB_RECNO 3 - int type; /* type of underlying db */ - int (*close) __P((const struct __db *)); - int (*del) __P((const struct __db *, const DBT *, unsigned int)); - int (*get) __P((const struct __db *, DBT *, DBT *, unsigned int)); - int (*put) __P((const struct __db *, const DBT *, const DBT *, - unsigned int)); - int (*seq) __P((const struct __db *, DBT *, DBT *, unsigned int)); - int (*sync) __P((const struct __db *)); + DBTYPE type; /* underlying db type */ + int (*close) __P((struct __db *)); + int (*del) __P((const struct __db *, const DBT *, u_int)); + int (*get) __P((const struct __db *, const DBT *, DBT *, u_int)); + int (*put) __P((const struct __db *, DBT *, const DBT *, u_int)); + int (*seq) __P((const struct __db *, DBT *, DBT *, u_int)); + int (*sync) __P((const struct __db *)); + void *internal; /* access method private */ } DB; #define BTREEMAGIC 0x053162 -#define BTREEVERSION 2 +#define BTREEVERSION 3 -/* structure used to pass parameters to the btree routines */ +/* Structure used to pass parameters to the btree routines. */ typedef struct { #define R_DUP 0x01 /* duplicate keys */ u_long flags; int cachesize; /* bytes to cache */ + int maxkeypage; /* maximum keys per page */ + int minkeypage; /* minimum keys per page */ int psize; /* page size */ - int (*compare)(); /* compare function */ + /* comparison, prefix functions */ + int (*compare) __P((const DBT *, const DBT *)); + int (*prefix) __P((const DBT *, const DBT *)); int lorder; /* byte order */ } BTREEINFO; #define HASHMAGIC 0x061561 -#define HASHVERSION 1 +#define HASHVERSION 2 -/* structure used to pass parameters to the hashing routines */ +/* Structure used to pass parameters to the hashing routines. */ typedef struct { int bsize; /* bucket size */ int ffactor; /* fill factor */ @@ -108,16 +117,19 @@ typedef struct { int lorder; /* byte order */ } HASHINFO; -/* structure used to pass parameters to the record routines */ +/* Structure used to pass parameters to the record routines. */ typedef struct { #define R_FIXEDLEN 0x01 /* fixed-length records */ +#define R_NOKEY 0x02 /* key not required */ +#define R_SNAPSHOT 0x04 /* snapshot the input */ u_long flags; int cachesize; /* bytes to cache */ + int lorder; /* byte order */ size_t reclen; /* record length (fixed-length records) */ u_char bval; /* delimiting byte (variable-length records */ } RECNOINFO; -/* key structure for the record routines */ +/* Key structure for the record routines. */ typedef struct { u_long number; u_long offset; @@ -128,21 +140,62 @@ typedef struct { u_char valid; } RECNOKEY; -/* Little endian <--> big endian long swap macros. */ -#define BLSWAP(X) {(X) = __byte_swap_long(X);} -#define BLSWAP_COPY(X,Y) {(Y) = __byte_swap_long(X);} - -/* Little endian <--> big endian short swap macros. */ -#define BSSWAP(X) {(X) = __byte_swap_word(X);} -#define BSSWAP_COPY(X,Y) {(Y) = __byte_swap_word(X);} +/* + * Little endian <==> big endian long swap macros. + * BLSWAP swap a memory location + * BLPSWAP swap a referenced memory location + * BLSWAP_COPY swap from one location to another + */ +#define BLSWAP(a) { \ + u_long _tmp = a; \ + ((char *)&a)[0] = ((char *)&_tmp)[3]; \ + ((char *)&a)[1] = ((char *)&_tmp)[2]; \ + ((char *)&a)[2] = ((char *)&_tmp)[1]; \ + ((char *)&a)[3] = ((char *)&_tmp)[0]; \ +} +#define BLPSWAP(a) { \ + u_long _tmp = *(u_long *)a; \ + ((char *)a)[0] = ((char *)&_tmp)[3]; \ + ((char *)a)[1] = ((char *)&_tmp)[2]; \ + ((char *)a)[2] = ((char *)&_tmp)[1]; \ + ((char *)a)[3] = ((char *)&_tmp)[0]; \ +} +#define BLSWAP_COPY(a, b) { \ + ((char *)&(b))[0] = ((char *)&(a))[3]; \ + ((char *)&(b))[1] = ((char *)&(a))[2]; \ + ((char *)&(b))[2] = ((char *)&(a))[1]; \ + ((char *)&(b))[3] = ((char *)&(a))[0]; \ +} + +/* + * Little endian <==> big endian short swap macros. + * BSSWAP swap a memory location + * BSPSWAP swap a referenced memory location + * BSSWAP_COPY swap from one location to another + */ +#define BSSWAP(a) { \ + u_short _tmp = a; \ + ((char *)&a)[0] = ((char *)&_tmp)[1]; \ + ((char *)&a)[1] = ((char *)&_tmp)[0]; \ +} +#define BSPSWAP(a) { \ + u_short _tmp = *(u_short *)a; \ + ((char *)a)[0] = ((char *)&_tmp)[1]; \ + ((char *)a)[1] = ((char *)&_tmp)[0]; \ +} +#define BSSWAP_COPY(a, b) { \ + ((char *)&(b))[0] = ((char *)&(a))[1]; \ + ((char *)&(b))[1] = ((char *)&(a))[0]; \ +} __BEGIN_DECLS -DB *btree_open - __P((const char *, int, int, const BTREEINFO *)); -DB *hash_open - __P((const char *, int, int, const HASHINFO *)); -DB *recno_open - __P((const char *, int, int, const RECNOINFO *)); +DB *dbopen __P((const char *, int, int, DBTYPE, const void *)); + +#ifdef __DBINTERFACE_PRIVATE +DB *__bt_open __P((const char *, int, int, const BTREEINFO *)); +DB *__hash_open __P((const char *, int, int, const HASHINFO *)); +DB *__rec_open __P((const char *, int, int, const RECNOINFO *)); +void __dbpanic __P((DB *dbp)); +#endif __END_DECLS - #endif /* !_DB_H_ */ diff --git a/include/mpool.h b/include/mpool.h new file mode 100644 index 00000000000..6358549444c --- /dev/null +++ b/include/mpool.h @@ -0,0 +1,135 @@ +/*- + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mpool.h 5.2 (Berkeley) 2/14/93 + */ + +/* + * The memory pool scheme is a simple one. Each in memory page is referenced + * by a bucket which is threaded in three ways. All active pages are threaded + * on a hash chain (hashed by the page number) and an lru chain. Inactive + * pages are threaded on a free chain. Each reference to a memory pool is + * handed an MPOOL which is the opaque cookie passed to all of the memory + * routines. + */ +#define HASHSIZE 128 +#define HASHKEY(pgno) ((pgno - 1) % HASHSIZE) + +/* The BKT structures are the elements of the lists. */ +typedef struct BKT { + struct BKT *hnext; /* next hash bucket */ + struct BKT *hprev; /* previous hash bucket */ + struct BKT *cnext; /* next free/lru bucket */ + struct BKT *cprev; /* previous free/lru bucket */ + void *page; /* page */ + pgno_t pgno; /* page number */ + +#define MPOOL_DIRTY 0x01 /* page needs to be written */ +#define MPOOL_PINNED 0x02 /* page is pinned into memory */ + unsigned long flags; /* flags */ +} BKT; + +/* The BKTHDR structures are the heads of the lists. */ +typedef struct BKTHDR { + struct BKT *hnext; /* next hash bucket */ + struct BKT *hprev; /* previous hash bucket */ + struct BKT *cnext; /* next free/lru bucket */ + struct BKT *cprev; /* previous free/lru bucket */ +} BKTHDR; + +typedef struct MPOOL { + BKTHDR free; /* The free list. */ + BKTHDR lru; /* The LRU list. */ + BKTHDR hashtable[HASHSIZE]; /* Hashed list by page number. */ + pgno_t curcache; /* Current number of cached pages. */ + pgno_t maxcache; /* Max number of cached pages. */ + pgno_t npages; /* Number of pages in the file. */ + indx_t pagesize; /* File page size. */ + int fd; /* File descriptor. */ + /* Page in conversion routine. */ + void (*pgin) __P((void *, pgno_t, void *)); + /* Page out conversion routine. */ + void (*pgout) __P((void *, pgno_t, void *)); + void *pgcookie; /* Cookie for page in/out routines. */ +#ifdef STATISTICS + unsigned long cachehit; + unsigned long cachemiss; + unsigned long pagealloc; + unsigned long pageflush; + unsigned long pageget; + unsigned long pagenew; + unsigned long pageput; + unsigned long pageread; + unsigned long pagewrite; +#endif +} MPOOL; + +#ifdef __MPOOLINTERFACE_PRIVATE +/* Macros to insert/delete into/from hash chain. */ +#define rmhash(bp) { \ + (bp)->hprev->hnext = (bp)->hnext; \ + (bp)->hnext->hprev = (bp)->hprev; \ +} +#define inshash(bp, pg) { \ + hp = &mp->hashtable[HASHKEY(pg)]; \ + (bp)->hnext = hp->hnext; \ + (bp)->hprev = (struct BKT *)hp; \ + hp->hnext->hprev = (bp); \ + hp->hnext = (bp); \ +} + +/* Macros to insert/delete into/from lru and free chains. */ +#define rmchain(bp) { \ + (bp)->cprev->cnext = (bp)->cnext; \ + (bp)->cnext->cprev = (bp)->cprev; \ +} +#define inschain(bp, dp) { \ + (bp)->cnext = (dp)->cnext; \ + (bp)->cprev = (struct BKT *)(dp); \ + (dp)->cnext->cprev = (bp); \ + (dp)->cnext = (bp); \ +} +#endif + +__BEGIN_DECLS +MPOOL *mpool_open __P((DBT *, int, pgno_t, pgno_t)); +void mpool_filter __P((MPOOL *, void (*)(void *, pgno_t, void *), + void (*)(void *, pgno_t, void *), void *)); +void *mpool_new __P((MPOOL *, pgno_t *)); +void *mpool_get __P((MPOOL *, pgno_t, u_int)); +int mpool_put __P((MPOOL *, void *, u_int)); +int mpool_sync __P((MPOOL *)); +int mpool_close __P((MPOOL *)); +#ifdef STATISTICS +void mpool_stat __P((MPOOL *)); +#endif +__END_DECLS diff --git a/include/ndbm.h b/include/ndbm.h index 67f0293742a..2171d30e169 100644 --- a/include/ndbm.h +++ b/include/ndbm.h @@ -33,13 +33,12 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)ndbm.h 5.6 (Berkeley) 4/3/91 + * @(#)ndbm.h 5.8 (Berkeley) 4/25/92 */ #ifndef _NDBM_H_ #define _NDBM_H_ -#include <sys/cdefs.h> #include <db.h> /* Map dbm interface onto db(3). */ @@ -61,6 +60,7 @@ typedef struct { } datum; typedef DB DBM; +#define dbm_pagfno(a) DBM_PAGFNO_NOT_AVAILABLE __BEGIN_DECLS void dbm_close __P((DBM *)); @@ -71,6 +71,7 @@ long dbm_forder __P((DBM *, datum)); datum dbm_nextkey __P((DBM *)); DBM *dbm_open __P((const char *, int, int)); int dbm_store __P((DBM *, datum, datum, int)); +int dbm_dirfno __P((DBM *)); __END_DECLS #endif /* !_NDBM_H_ */ |
