## root/libdb/db.h

/* [<][>][^][v][top][bottom][index][help] */

## INCLUDED FROM

    /*-
     * Copyright (c) 1990, 1993, 1994
     *      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. 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.
     *
     *      @(#)db.h        8.7 (Berkeley) 6/16/94
     */

    #ifndef _DB_H_
    #define _DB_H_

    #include <sys/types.h>

    #ifdef HAVE_LIMITS_H
    #include <limits.h>
    #endif
    #ifdef HAVE_UNISTD_H
    #include <unistd.h>
    #endif

    #include "compat.h"

    #define RET_ERROR       -1              /* Return values. */
    #define RET_SUCCESS      0
    #define RET_SPECIAL      1

    #define MAX_PAGE_NUMBER 0xffffffff      /* >= # of pages in a file */
    #define pgno_t          u_int32_t
    #define MAX_PAGE_OFFSET 65535           /* >= # of bytes in a page */
    #define indx_t          u_int16_t
    #define MAX_REC_NUMBER  0xffffffff      /* >= # of records in a tree */
    #define recno_t         u_int32_t

    /* Key/data structure -- a Data-Base Thang. */
    typedef struct {
            void    *data;                  /* data */
            size_t   size;                  /* data length */
    } DBT;

    /* Routine flags. */
    #define R_CURSOR        1               /* del, put, seq */
    #define __R_UNUSED      2               /* UNUSED */
    #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) */
    #define R_RECNOSYNC     11              /* sync (RECNO) */

    typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;

    /*
     * !!!
     * The following flags are included in the dbopen(3) call as part of the
     * open(2) flags.  In order to avoid conflicts with the open flags, start
     * at the top of the 16 or 32-bit number space and work our way down.  If
     * the open flags were significantly expanded in the future, it could be
     * a problem.  Wish I'd left another flags word in the dbopen call.
     *
     * !!!
     * None of this stuff is implemented yet.  The only reason that it's here
     * is so that the access methods can skip copying the key/data pair when
     * the DB_LOCK flag isn't set.
     */
    #if UINT_MAX > 65535
    #define DB_LOCK         0x20000000      /* Do locking. */
    #define DB_SHMEM        0x40000000      /* Use shared memory. */
    #define DB_TXN          0x80000000      /* Do transactions. */
    #else
    #define DB_LOCK             0x2000      /* Do locking. */
    #define DB_SHMEM            0x4000      /* Use shared memory. */
    #define DB_TXN              0x8000      /* Do transactions. */
    #endif

    /* Access method description structure. */
    typedef struct __db {
            DBTYPE type;                    /* Underlying db type. */
            /* The 2nd argument was added in order to
               avoid useless writing just before unlink. */
            int (*close)    (struct __db *, int);
            int (*del)      (const struct __db *, const DBT *, u_int);
            int (*get)      (const struct __db *, const DBT *, DBT *, u_int);
            int (*put)      (const struct __db *, DBT *, const DBT *, u_int);
            int (*seq)      (const struct __db *, DBT *, DBT *, u_int);
            int (*sync)     (const struct __db *, u_int);
            void *internal;                 /* Access method private. */
            int (*fd)       (const struct __db *);
    } DB;

    #define BTREEMAGIC      0x053162
    #define BTREEVERSION    3
    #define R_DUP           0x01    /* duplicate keys */

    /* Structure used to pass parameters to the btree routines. */
    typedef struct {
            u_long  flags;
            u_int   cachesize;      /* bytes to cache */
            int     maxkeypage;     /* maximum keys per page */
            int     minkeypage;     /* minimum keys per page */
            u_int   psize;          /* page size */
            int     (*compare)      /* comparison function */
               (const DBT *, const DBT *);
            size_t  (*prefix)       /* prefix function */
               (const DBT *, const DBT *);
            int     lorder;         /* byte order */
    } BTREEINFO;

    #define HASHMAGIC       0x061561
    #define HASHVERSION     2

    /* Structure used to pass parameters to the hashing routines. */
    typedef struct {
            u_int   bsize;          /* bucket size */
            u_int   ffactor;        /* fill factor */
            u_int   nelem;          /* number of elements */
            u_int   cachesize;      /* bytes to cache */
            u_int32_t               /* hash function */
                    (*hash)(const void *, size_t);
            int     lorder;         /* byte order */
    } HASHINFO;

    #define R_FIXEDLEN      0x01    /* fixed-length records */
    #define R_NOKEY         0x02    /* key not required */
    #define R_SNAPSHOT      0x04    /* snapshot the input */

    /* Structure used to pass parameters to the record routines. */
    typedef struct {
            u_long  flags;
            u_int   cachesize;      /* bytes to cache */
            u_int   psize;          /* page size */
            int     lorder;         /* byte order */
            size_t  reclen;         /* record length (fixed-length records) */
            u_char  bval;           /* delimiting byte (variable-length records */
            char    *bfname;        /* btree file name */
    } RECNOINFO;

    /*
     * Little endian <==> big endian 32-bit swap macros.
     *      M_32_SWAP       swap a memory location
     *      P_32_SWAP       swap a referenced memory location
     *      P_32_COPY       swap from one location to another
     */
    #define M_32_SWAP(a) {                                                  \
            u_int32_t _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 P_32_SWAP(a) {                                                  \
            u_int32_t _tmp = *(u_int32_t *)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 P_32_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 16-bit swap macros.
     *      M_16_SWAP       swap a memory location
     *      P_16_SWAP       swap a referenced memory location
     *      P_16_COPY       swap from one location to another
     */
    #define M_16_SWAP(a) {                                                  \
            u_int16_t _tmp = a;                                             \
            ((char *)&a)[0] = ((char *)&_tmp)[1];                           \
            ((char *)&a)[1] = ((char *)&_tmp)[0];                           \
    }
    #define P_16_SWAP(a) {                                                  \
            u_int16_t _tmp = *(u_int16_t *)a;                               \
            ((char *)a)[0] = ((char *)&_tmp)[1];                            \
            ((char *)a)[1] = ((char *)&_tmp)[0];                            \
    }
    #define P_16_COPY(a, b) {                                               \
            ((char *)&(b))[0] = ((char *)&(a))[1];                          \
            ((char *)&(b))[1] = ((char *)&(a))[0];                          \
    }

    DB      *dbopen(const char *, int, int, DBTYPE, const void *);

    DB      *__bt_open(const char *, int, int, const BTREEINFO *, int);
    DB      *__hash_open(const char *, int, int, const HASHINFO *, int);
    DB      *__rec_open(const char *, int, int, const RECNOINFO *, int);
    void     __dbpanic(DB *dbp);
    #endif /* !_DB_H_ */

/* [<][>][^][v][top][bottom][index][help] */