/*-
 * Copyright (c) 1990, 1993, 1994
 *  The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Margo Seltzer.
 *
 * 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. ***REMOVED*** - see
 *    ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
 * 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.
 *
 *  @(#)hash.h  8.3 (Berkeley) 5/31/94
 */

/* Operations */

#include <stdio.h>
#include "mcom_db.h"
typedef enum {
    HASH_GET,
    HASH_PUT,
    HASH_PUTNEW,
    HASH_DELETE,
    HASH_FIRST,
    HASH_NEXT
} ACTION;

/* Buffer Management structures */
typedef struct _bufhead BUFHEAD;

struct _bufhead {
    BUFHEAD *prev; /* LRU links */
    BUFHEAD *next; /* LRU links */
    BUFHEAD *ovfl; /* Overflow page buffer header */
    uint32 addr;   /* Address of this page */
    char *page;    /* Actual page data */
    char is_disk;
    char flags;
#define BUF_MOD 0x0001
#define BUF_DISK 0x0002
#define BUF_BUCKET 0x0004
#define BUF_PIN 0x0008
};

#define IS_BUCKET(X) ((X)&BUF_BUCKET)

typedef BUFHEAD **SEGMENT;

typedef int DBFILE_PTR;
#define NO_FILE -1
#ifdef macintosh
#define DBFILE_OPEN(path, flag, mode) open((path), flag)
#define EXISTS(path)
#else
#define DBFILE_OPEN(path, flag, mode) open((path), (flag), (mode))
#endif
/* Hash Table Information */
typedef struct hashhdr {     /* Disk resident portion */
    int32 magic;             /* Magic NO for hash tables */
    int32 version;           /* Version ID */
    uint32 lorder;           /* Byte Order */
    int32 bsize;             /* Bucket/Page Size */
    int32 bshift;            /* Bucket shift */
    int32 dsize;             /* Directory Size */
    int32 ssize;             /* Segment Size */
    int32 sshift;            /* Segment shift */
    int32 ovfl_point;        /* Where overflow pages are being
                              * allocated */
    int32 last_freed;        /* Last overflow page freed */
    int32 max_bucket;        /* ID of Maximum bucket in use */
    int32 high_mask;         /* Mask to modulo into entire table */
    int32 low_mask;          /* Mask to modulo into lower half of
                              * table */
    int32 ffactor;           /* Fill factor */
    int32 nkeys;             /* Number of keys in hash table */
    int32 hdrpages;          /* Size of table header */
    uint32 h_charkey;        /* value of hash(CHARKEY) */
#define NCACHED 32           /* number of bit maps and spare \
                              * points */
    int32 spares[NCACHED];   /* spare pages for overflow */
    uint16 bitmaps[NCACHED]; /* address of overflow page
                              * bitmaps */
} HASHHDR;

typedef struct htab { /* Memory resident data structure */
    HASHHDR hdr;      /* Header */
    int nsegs;        /* Number of allocated segments */
    int exsegs;       /* Number of extra allocated
                       * segments */
    uint32            /* Hash function */
        (*hash)(const void *, size_t);
    int flags;     /* Flag values */
    DBFILE_PTR fp; /* File pointer */
    char *filename;
    char *tmp_buf;         /* Temporary Buffer for BIG data */
    char *tmp_key;         /* Temporary Buffer for BIG keys */
    BUFHEAD *cpage;        /* Current page */
    int cbucket;           /* Current bucket */
    int cndx;              /* Index of next item on cpage */
    int dbmerrno;          /* Error Number -- for DBM
                            * compatability */
    int new_file;          /* Indicates if fd is backing store
                            * or no */
    int save_file;         /* Indicates whether we need to flush
                            * file at
                            * exit */
    uint32 *mapp[NCACHED]; /* Pointers to page maps */
    int nmaps;             /* Initial number of bitmaps */
    int nbufs;             /* Number of buffers left to
                            * allocate */
    BUFHEAD bufhead;       /* Header of buffer lru list */
    SEGMENT *dir;          /* Hash Bucket directory */
    off_t file_size;       /* in bytes */
    char is_temp;          /* unlink file on close */
    char updateEOF;        /* force EOF update on flush */
} HTAB;

/*
 * Constants
 */
#define DATABASE_CORRUPTED_ERROR -999 /* big ugly abort, delete database */
#define OLD_MAX_BSIZE 65536           /* 2^16 */
#define MAX_BSIZE 32l * 1024l         /* 2^15 */
#define MIN_BUFFERS 6
#define MINHDRSIZE 512
#define DEF_BUFSIZE 65536l /* 64 K */
#define DEF_BUCKET_SIZE 4096
#define DEF_BUCKET_SHIFT 12 /* log2(BUCKET) */
#define DEF_SEGSIZE 256
#define DEF_SEGSIZE_SHIFT 8 /* log2(SEGSIZE)     */
#define DEF_DIRSIZE 256
#define DEF_FFACTOR 65536l
#define MIN_FFACTOR 4
#define SPLTMAX 8
#define CHARKEY "%$sniglet^&"
#define NUMKEY 1038583l
#define BYTE_SHIFT 3
#define INT_TO_BYTE 2
#define INT_BYTE_SHIFT 5
#define ALL_SET ((uint32)0xFFFFFFFF)
#define ALL_CLEAR 0

#define PTROF(X) ((ptrdiff_t)(X) == BUF_DISK ? 0 : (X))
#define ISDISK(X) ((X) ? ((ptrdiff_t)(X) == BUF_DISK ? BUF_DISK      \
                                                     : (X)->is_disk) \
                       : 0)

#define BITS_PER_MAP 32

/* Given the address of the beginning of a big map, clear/set the nth bit */
#define CLRBIT(A, N) ((A)[(N) / BITS_PER_MAP] &= ~(1 << ((N) % BITS_PER_MAP)))
#define SETBIT(A, N) ((A)[(N) / BITS_PER_MAP] |= (1 << ((N) % BITS_PER_MAP)))
#define ISSET(A, N) ((A)[(N) / BITS_PER_MAP] & (1 << ((N) % BITS_PER_MAP)))

/* Overflow management */
/*
 * Overflow page numbers are allocated per split point.  At each doubling of
 * the table, we can allocate extra pages.  So, an overflow page number has
 * the top 5 bits indicate which split point and the lower 11 bits indicate
 * which page at that split point is indicated (pages within split points are
 * numberered starting with 1).
 */

#define SPLITSHIFT 11
#define SPLITMASK 0x7FF
#define SPLITNUM(N) (((uint32)(N)) >> SPLITSHIFT)
#define OPAGENUM(N) ((N)&SPLITMASK)
#define OADDR_OF(S, O) ((uint32)((uint32)(S) << SPLITSHIFT) + (O))

#define BUCKET_TO_PAGE(B) \
    (B) + hashp->HDRPAGES + ((B) ? hashp->SPARES[__log2((uint32)((B) + 1)) - 1] : 0)
#define OADDR_TO_PAGE(B) \
    BUCKET_TO_PAGE((1 << SPLITNUM((B))) - 1) + OPAGENUM((B));

/*
 * page.h contains a detailed description of the page format.
 *
 * Normally, keys and data are accessed from offset tables in the top of
 * each page which point to the beginning of the key and data.  There are
 * four flag values which may be stored in these offset tables which indicate
 * the following:
 *
 *
 * OVFLPAGE Rather than a key data pair, this pair contains
 *      the address of an overflow page.  The format of
 *      the pair is:
 *          OVERFLOW_PAGE_NUMBER OVFLPAGE
 *
 * PARTIAL_KEY  This must be the first key/data pair on a page
 *      and implies that page contains only a partial key.
 *      That is, the key is too big to fit on a single page
 *      so it starts on this page and continues on the next.
 *      The format of the page is:
 *          KEY_OFF PARTIAL_KEY OVFL_PAGENO OVFLPAGE
 *
 *          KEY_OFF -- offset of the beginning of the key
 *          PARTIAL_KEY -- 1
 *          OVFL_PAGENO - page number of the next overflow page
 *          OVFLPAGE -- 0
 *
 * FULL_KEY This must be the first key/data pair on the page.  It
 *      is used in two cases.
 *
 *      Case 1:
 *          There is a complete key on the page but no data
 *          (because it wouldn't fit).  The next page contains
 *          the data.
 *
 *          Page format it:
 *          KEY_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
 *
 *          KEY_OFF -- offset of the beginning of the key
 *          FULL_KEY -- 2
 *          OVFL_PAGENO - page number of the next overflow page
 *          OVFLPAGE -- 0
 *
 *      Case 2:
 *          This page contains no key, but part of a large
 *          data field, which is continued on the next page.
 *
 *          Page format it:
 *          DATA_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
 *
 *          KEY_OFF -- offset of the beginning of the data on
 *              this page
 *          FULL_KEY -- 2
 *          OVFL_PAGENO - page number of the next overflow page
 *          OVFLPAGE -- 0
 *
 * FULL_KEY_DATA
 *      This must be the first key/data pair on the page.
 *      There are two cases:
 *
 *      Case 1:
 *          This page contains a key and the beginning of the
 *          data field, but the data field is continued on the
 *          next page.
 *
 *          Page format is:
 *          KEY_OFF FULL_KEY_DATA OVFL_PAGENO DATA_OFF
 *
 *          KEY_OFF -- offset of the beginning of the key
 *          FULL_KEY_DATA -- 3
 *          OVFL_PAGENO - page number of the next overflow page
 *          DATA_OFF -- offset of the beginning of the data
 *
 *      Case 2:
 *          This page contains the last page of a big data pair.
 *          There is no key, only the  tail end of the data
 *          on this page.
 *
 *          Page format is:
 *          DATA_OFF FULL_KEY_DATA <OVFL_PAGENO> <OVFLPAGE>
 *
 *          DATA_OFF -- offset of the beginning of the data on
 *              this page
 *          FULL_KEY_DATA -- 3
 *          OVFL_PAGENO - page number of the next overflow page
 *          OVFLPAGE -- 0
 *
 *          OVFL_PAGENO and OVFLPAGE are optional (they are
 *          not present if there is no next page).
 */

#define OVFLPAGE 0
#define PARTIAL_KEY 1
#define FULL_KEY 2
#define FULL_KEY_DATA 3
#define REAL_KEY 4

/* Short hands for accessing structure */
#undef BSIZE
#define BSIZE hdr.bsize
#undef BSHIFT
#define BSHIFT hdr.bshift
#define DSIZE hdr.dsize
#define SGSIZE hdr.ssize
#define SSHIFT hdr.sshift
#define LORDER hdr.lorder
#define OVFL_POINT hdr.ovfl_point
#define LAST_FREED hdr.last_freed
#define MAX_BUCKET hdr.max_bucket
#define FFACTOR hdr.ffactor
#define HIGH_MASK hdr.high_mask
#define LOW_MASK hdr.low_mask
#define NKEYS hdr.nkeys
#define HDRPAGES hdr.hdrpages
#define SPARES hdr.spares
#define BITMAPS hdr.bitmaps
#define VERSION hdr.version
#define MAGIC hdr.magic
#define NEXT_FREE hdr.next_free
#define H_CHARKEY hdr.h_charkey

extern uint32 (*__default_hash)(const void *, size_t);
void __buf_init(HTAB *hashp, int32 nbytes);
int __big_delete(HTAB *hashp, BUFHEAD *bufp);
BUFHEAD *__get_buf(HTAB *hashp, uint32 addr, BUFHEAD *prev_bp, int newpage);
uint32 __call_hash(HTAB *hashp, char *k, size_t len);
#include "page.h"
extern int __big_split(HTAB *hashp, BUFHEAD *op, BUFHEAD *np,
                       BUFHEAD *big_keyp, uint32 addr, uint32 obucket, SPLIT_RETURN *ret);
void __free_ovflpage(HTAB *hashp, BUFHEAD *obufp);
BUFHEAD *__add_ovflpage(HTAB *hashp, BUFHEAD *bufp);
int __big_insert(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT *val);
int __expand_table(HTAB *hashp);
uint32 __log2(uint32 num);
void __reclaim_buf(HTAB *hashp, BUFHEAD *bp);
int __get_page(HTAB *hashp, char *p, uint32 bucket, int is_bucket, int is_disk, int is_bitmap);
int __put_page(HTAB *hashp, char *p, uint32 bucket, int is_bucket, int is_bitmap);
int __ibitmap(HTAB *hashp, int pnum, int nbits, int ndx);
int __buf_free(HTAB *hashp, int do_free, int to_disk);
int __find_bigpair(HTAB *hashp, BUFHEAD *bufp, int ndx, char *key, int size);
uint16 __find_last_page(HTAB *hashp, BUFHEAD **bpp);
int __addel(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT *val);
int __big_return(HTAB *hashp, BUFHEAD *bufp, int ndx, DBT *val, int set_current);
int __delpair(HTAB *hashp, BUFHEAD *bufp, int ndx);
int __big_keydata(HTAB *hashp, BUFHEAD *bufp, DBT *key, DBT *val, int set);
int __split_page(HTAB *hashp, uint32 obucket, uint32 nbucket);
