
/*  bplus.h - data structures and constants  */


#define IX_OK       1
#define IX_FAIL     0
#define EOIX       (-2)
#define MAXKEY      100
#define NUM_BUFS    8
#define MAX_LEVELS  8
#define IXB_SIZE    1024
#define IXB_SPACE  (IXB_SIZE - sizeof(int) - sizeof(long) * 2)

typedef long RECPOS;

typedef struct                    /*  entry structure in index        */
  {  RECPOS   idxptr;             /*  points to lower index level     */
     RECPOS   recptr;             /*  points to data record           */
     char     key[MAXKEY];        /*  start of record key             */
  }  ENTRY;

typedef struct                    /*  index record format             */
  {  RECPOS   brec;               /*  position in index file          */
                                  /*  or location of next free block  */
     int      bend;               /*  first unused block location     */
     RECPOS   p0;                 /*  points to next level            */
     char     entries[IXB_SPACE]; /*  here are the key entries        */
  }  BLOCK;

typedef struct                    /*  disk file info                  */
  {  RECPOS   ff;                 /*  location of first free block    */
     int      nl;                 /*  number of index levels          */
  }  IX_DISK;

typedef struct                    /*  memory buffer pool of indx blks */
  {  int      dirty;              /*  true if changed                 */
     int      handle;             /*  index file handle               */
     int      count;              /*  number of times referenced      */
     BLOCK    mb;
  }  MEMBLOCK;

typedef struct
  {  MEMBLOCK     cache [ NUM_BUFS ];
  }  IX_BUFFER;

typedef struct                    /*  in-memory index descriptor      */
  {  int      ixfile;
     int      level;              /*  level in btree                  */
     int      duplicate;          /*  no duplicate keys if 0          */
     struct
       {  RECPOS    cblock;       /*  position in index file          */
          int       coffset;      /*  current offset within block     */
       }  pos [ MAX_LEVELS ];
     BLOCK    root;               /*  root index record               */
     IX_DISK  dx;
  }  IX_DESC;

int cdecl open_index(char *,IX_DESC *, int);
int cdecl close_index(IX_DESC *);
int cdecl make_index(char *,IX_DESC *, int);
int cdecl first_key(IX_DESC *);
int cdecl last_key(IX_DESC *);
int cdecl next_key(ENTRY *, IX_DESC *);
int cdecl prev_key(ENTRY *, IX_DESC *);
int cdecl find_key(ENTRY *, IX_DESC *);
int cdecl add_key(ENTRY *, IX_DESC *);
int cdecl locate_key(ENTRY *, IX_DESC *);
int cdecl delete_key(ENTRY *, IX_DESC *);
int cdecl find_exact(ENTRY *, IX_DESC *);

