home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 125.img / PRO-C4.ZIP / BENCH1.ZIP / BENCH / PROTREE.H < prev    next >
C/C++ Source or Header  |  1990-05-28  |  15KB  |  378 lines

  1. /***( io8.h )****************************************************************
  2. *                    Pro-TREE Prototypes and Definitions                    *
  3. *****************************************************************************
  4. *                                                                           *
  5. *  Pro-TREE v1.10  -  Copyright (c) 1988, 1990 Vestronix Inc.               *
  6. *                                                                           *
  7. *  Features:                                                                *
  8. *     - Dynamic leveling                                                    *
  9. *     - Free list for data file and each key in the index file              *
  10. *     - Single-user or Multi-user with appropriate index file locking       *
  11. *     - Single record locking on the data file                              *
  12. *                                                                           *
  13. *  Original : NIG 24-Feb-88, GEO 23-Mar-88, VVA Dec-88 (indexing functs)    *
  14. *  Changed  : JZ Apr-89                                                     *
  15. *  Changed  : BRC 4-Dec-89 (dynamic levels, free space reuse)               *
  16. *                                                                           *
  17. ****************************************************************************/
  18.  
  19. #include <stdio.h>
  20. #include <iodef.h>
  21. #include <proc.io>
  22. #include <bench.h>
  23. #include <iosup.h>
  24. #include <procerr.h>
  25. #include <fileio.h>
  26. /*#include <memchk.h>*/
  27.  
  28.  
  29. /****************************************************************************
  30. *   Machine Specific Definitions -- SHOULD BE SET FOR EACH NEW MACHINE/OS   *
  31. *---------------------------------------------------------------------------*
  32. *      Use PROTEST to determine the correct settings for the following      *
  33. ****************************************************************************/
  34. #define NO_MULTI_USER           /* record locking is enabled if defined    */
  35. #define    SWAP_WORD8           /* pairs of bytes are swapped              */
  36. #define    SWAP_WORD16          /* pairs of 2-byte words are swapped       */
  37. #define NO_SWAP_WORD32          /* pairs of 4-byte long words are swapped  */
  38. #define    WORD8    char        /* type for a one byte integer             */
  39. #define    WORD16   short       /* type for a two byte integer             */
  40. #define    WORD32   long        /* type for a four byte integer            */
  41. #define    FLOAT32  float       /* type for a four byte integer            */
  42. #define    FLOAT64  double      /* type for a four byte integer            */
  43.  
  44. #define    NO_LOCKDEBUG
  45.  
  46. /****************************************************************************
  47. *                       Global Definitions and Macros                       *
  48. *---------------------------------------------------------------------------*
  49. *  Changes to the following setting should be made WITH EXTREME CAUTION as  *
  50. *  these settings greatly affect the portability and function of Pro-TREE   *
  51. ****************************************************************************/
  52. /* B-Tree configuration settings */
  53. #define MAXELTS        50        /* number of elements pre node    */
  54. #define MAXKEYS        30        /* number of keys per file        */
  55. #define MAXSEGS        5        /* number of segments per key     */
  56. #define DUPSEG        MAXSEGS        /* duplicate segment's home       */
  57.  
  58. /* File and locking settings */
  59. #define MAXLOCKS    0        /* NOTE: range is 0..10 */
  60. #define MAXLOCKTRYS    0        /* number of trys at locking a file */
  61. #define FLUSH_LEVEL    50        /* <=1:write-through, >1:"dangerous" */
  62.  
  63.  
  64. /****************************************************************************
  65. *                          Pro-TREE internal codes                          *
  66. *---------------------------------------------------------------------------*
  67. *       WARNING: ANY CHANGES HERE WILL CAUSE Pro-TREE TO MALFUNCTION        *
  68. ****************************************************************************/
  69. #define CURRENT_VERSION    "110"
  70. #define FIELD_NAME_LEN    10
  71. #define READ_LOCK    1
  72. #define WRITE_LOCK    -1
  73. #define FILE_LOCK    -2
  74. #define PTNOPTR        -1L   /* error indicating no record offset */
  75.  
  76. #ifndef IODATSEEK
  77. extern char *io_tran();
  78. #define IODATSEEK    IOERROR
  79. #define IOIDXSEEK    IOERROR
  80. #define IODATWRITE    IOERROR
  81. #define IOIDXWRITE    IOERROR
  82. #define IODATREAD    IOERROR
  83. #define IOIDXREAD    IOERROR
  84. #define IOOLDVER    IOBADOPEN
  85. #define IONEWVER    IOBADOPEN
  86. #define IODATOPEN    IOBADOPEN
  87. #define IOIDXOPEN    IOBADOPEN
  88. #define IOFLDDEF    IOBADOPEN
  89. #define IOKEYDEF    IOBADOPEN
  90. #define IOFLDPERM    IOERROR
  91. #define IOIDXPERM    IOBADOPEN
  92. #define IODATPERM    IOBADOPEN
  93. #define IOFILLOCK    IOBADOPEN
  94. #define IONOSERVER    IOERROR
  95. #define IOCONFIG    IOBADOPEN
  96. #define IOFTABLE    IOBADOPEN
  97. #define IOILOCKED    IOLOCKED
  98. #define IOINOLOCK    IONOLOCK
  99. #endif
  100.  
  101.  
  102. /****************************************************************************
  103. *         Compiler Specific Setting -- Should not need any tweaking         *
  104. ****************************************************************************/
  105.  
  106. #ifdef MSDOS
  107. #define ttyname(x) "<DOS>"
  108. #endif
  109.  
  110. #ifdef LATTICE
  111. # include <fcntl.h>
  112. # define OPN_FILE(fname) open(fname,O_RAW|O_RDWR)
  113. # define CRT_FILE(fname) open(fname,O_RAW|O_RDWR|O_CREAT,S_IREAD|S_IWRITE)
  114. # define LOCK_BLK(fd,pos,len) lockf(fd,F_LOCK,len)
  115. # define LOCK_TST(fd,pos,len) lockf(fd,F_TLOCK,len)
  116. # define LOCK_REL(fd,pos,len) lockf(fd,F_ULOCK,len)
  117. #endif
  118.  
  119. #ifdef __TURBOC__
  120. # include <ctype.h>
  121. # include <fcntl.h>
  122. # include <sys/stat.h>
  123. # define OPN_FILE(fname) open(fname,O_BINARY|O_RDWR)
  124. # define CRT_FILE(fname) open(fname,O_BINARY|O_RDWR|O_CREAT,S_IREAD|S_IWRITE)
  125. # define LOCK_BLK(fd,pos,len) lock(fd,pos,(long)len)
  126. # define LOCK_TST(fd,pos,len) lock(fd,pos,(long)len)
  127. # define LOCK_REL(fd,pos,len) unlock(fd,pos,(long)len)
  128. #endif
  129.  
  130. #ifdef MSC   /* This has been defined in bench.h */
  131. # include <fcntl.h>
  132. # include <sys\locking.h>
  133. # include <sys\stat.h>
  134. # include <sys\types.h>
  135. # define OPN_FILE(fname) open(fname,O_BINARY|O_RDWR)
  136. # define CRT_FILE(fname) open(fname,O_BINARY|O_RDWR|O_CREAT,S_IREAD|S_IWRITE)
  137. # define LOCK_BLK(fd,pos,len) locking(fd,LK_LOCK,len)
  138. # define LOCK_TST(fd,pos,len) locking(fd,LK_NBLCK,len)
  139. # define LOCK_REL(fd,pos,len) locking(fd,LK_UNLCK,len)
  140. #endif
  141.  
  142. #ifdef __WATCOMC__
  143. # include <fcntl.h>
  144. # include <io.h>
  145. # include <sys\types.h>
  146. # include <sys\stat.h>
  147. # include <stdlib.h>
  148. # define OPN_FILE(fname) open(fname,O_BINARY|O_RDWR|,S_IREAD|S_IWRITE)
  149. # define CRT_FILE(fname) open(fname,O_BINARY|O_RDWR|O_CREAT,S_IREAD|S_IWRITE)
  150. # define LOCK_BLK(fd,pos,len) (0)
  151. # define LOCK_TST(fd,pos,len) (0)
  152. # define LOCK_REL(fd,pos,len) (0)
  153. #endif
  154.  
  155. #ifdef __ZTC__
  156. # include <io.h>
  157. # include <dos.h>
  158. # include <sys\stat.h>
  159. # include <stdlib.h>
  160. # define OPN_FILE(fname) open(fname,O_RDWR)
  161. # define CRT_FILE(fname) creat(fname,S_IREAD|S_IWRITE)
  162. # define LOCK_BLK(fd,pos,len) (0)
  163. # define LOCK_TST(fd,pos,len) (0)
  164. # define LOCK_REL(fd,pos,len) (0)
  165. # define tell(fh) lseek(fh,0L,1)
  166. # define access(name,mode) close(open(name,mode))
  167. #endif
  168.  
  169. #ifdef QNX
  170. # include <ctype.h>
  171. # include <errno.h>
  172. # include <file_io.h>
  173. # define OPN_FILE(fname) sopen(fname,O_BINARY|O_RDWR|O_CACHE,SH_DENYNO)
  174. # define CRT_FILE(fname) sopen(fname,O_BINARY|O_RDWR|O_CACHE|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE)
  175. # define LOCK_BLK(fd,pos,len) lockf(fd,F_LOCK,len)
  176. # define LOCK_TST(fd,pos,len) lockf(fd,F_TLOCK,len)
  177. # define LOCK_REL(fd,pos,len) lockf(fd,F_ULOCK,len)
  178. #endif
  179.  
  180. #ifdef UNIX
  181. extern int lockf();
  182. extern long tell();
  183. # include <ctype.h>
  184. # include <errno.h>
  185. # ifdef RT
  186. #  include <macros.h>
  187. # else
  188. #  include <malloc.h>
  189. # endif
  190. # include <memory.h>
  191. # include <string.h>
  192. # define OPN_FILE(fname) open(fname,O_RDWR)
  193. # define CRT_FILE(fname) open(fname,O_RDWR|O_CREAT,0664)
  194. # define LOCK_BLK(fd,pos,len) lockf(fd,F_LOCK,len)
  195. # define LOCK_TST(fd,pos,len) lockf(fd,F_TLOCK,len)
  196. # define LOCK_REL(fd,pos,len) lockf(fd,F_ULOCK,len)
  197. #endif
  198.  
  199.  
  200. /***************************************************************************
  201. *                         Structure Tag Definitions                        *
  202. ***************************************************************************/
  203.  
  204. typedef struct b_elmnt
  205. {
  206.    WORD32 offset; /* data rec for leaves, child node for others */
  207.    WORD8 *keyval; /* all key types referenced by pointer */
  208. } BELT;
  209.  
  210. /* structures for B-tree index information held in memory */
  211. typedef struct b_node
  212. {
  213.    WORD16 level;    /* levels above leaf level */
  214.    WORD16 num_used; /* number of elements filled in */
  215.    BELT *elt;        /* element array */
  216. } BNODE;
  217.  
  218. /* segment information */ 
  219. typedef struct segdesc
  220. {
  221.    WORD16 s_recstart;  /* offset of segment in record */
  222.    WORD16 s_keystart;  /* offset of segment in key */
  223.    WORD16 s_leng;      /* length of segment */
  224.    WORD16 s_vtyp;      /* data type of segment */
  225. } SINFO;
  226.  
  227. /* Definition for All Keys within a file */
  228. typedef struct keydesc
  229. {
  230.    WORD16 k_leng;    /* Length of Key in Record */
  231.    WORD16 k_type;    /* Key type, ie Unique or Duplicate */
  232.    WORD16 k_segs;    /* Number of segments contained in key */
  233.    WORD16 k_levs;    /* Number of nodal levels in the tree */
  234.    WORD16 exact;    /* scoping flag for this key */
  235.    WORD32 didxptr;    /* offset of didxlst in file */
  236.    WORD8 *keyval;    /* current key value or NULL */
  237.    WORD16 *c_elt;    /* Active element for each node level */
  238.    WORD16 *changes;    /* Number of Changes Made to Node Buffers */
  239.    WORD32 *nodeoffset;    /* Offset of Each Node in Index File */
  240.    BNODE *nodebuff;    /* Node Buffer for Each Level */
  241.    SINFO sd[MAXSEGS + 1]; /* segment information */
  242. } KINFO;
  243.  
  244. /* Definition for Each Open File */
  245. typedef struct PT_fd_def
  246. {
  247.    WORD16 fd_idx;    /* index file handle from open() */
  248.    WORD16 rec_len;    /* data record length */
  249.    WORD16 maxelts;    /* number of elements per node */
  250.    WORD16 ilocked;    /* index file locking flag */
  251.    WORD32 ddatptr;    /* offset of ddellst in file */
  252.    WORD32 doffset;    /* current offset into data file */
  253.    WORD8 version[4];    /* file version number */
  254.    WORD8 *fname;    /* data file name */
  255.    WORD8 *iname;    /* index file name */
  256.    KINFO *keyinfo;    /* key information */
  257. } AFDDEF;
  258. typedef struct fd_def FDDEF;
  259.  
  260.  
  261. /****************************************************************************
  262. *                       Internal Function Declarations                      *
  263. ****************************************************************************/
  264. #ifdef ANSI
  265. extern char *PT_fmtkey(struct keydesc *,char *);
  266. extern int   PT_add_elt(int, int, long, char *);
  267. extern int   PT_add_key(int, char *);
  268. extern int   PT_add_node(int, int, long, char *);
  269. extern int   PT_chk_open(int, char *);
  270. extern int   PT_del_elt(int, int);
  271. extern int   PT_del_key(int, char *);
  272. extern int   PT_del_node(int, int);
  273. extern int   PT_find_key(int, char *);
  274. extern int   PT_find_match(int, char *, struct b_node *, int *);
  275. extern int   PT_flush_cache(int);
  276. extern int   PT_flush_node(int, int);
  277. extern int   PT_get_rec(int, char *);
  278. extern int   PT_idxlock(int, int);
  279. extern int   PT_idxunlock(int, int);
  280. extern int   PT_keycmp(int, char *, char *, int);
  281. extern int   PT_keyrecycle(int, long);
  282. extern int   PT_new_dup(int, char *);
  283. extern int   PT_readdata(int, char *);
  284. extern int   PT_readhdr(int);
  285. extern int   PT_readidx(int, int, int);
  286. extern int   PT_readnum(int, char *, int);
  287. extern int   PT_recrecycle(int, long);
  288. extern int   PT_resize(int, struct keydesc *, int);
  289. extern int   PT_writedata(int, char *);
  290. extern int   PT_writehdr(int);
  291. extern int   PT_writeidx(int, int);
  292. extern int   PT_writenum(int, char *, int);
  293. extern long  PT_first_key(int);
  294. extern long  PT_gteq_key(int, char *, int);
  295. extern long  PT_keyreuse(int);
  296. extern long  PT_last_key(int);
  297. extern long  PT_next_key(int);
  298. extern long  PT_prev_key(int);
  299. extern long  PT_recreuse(int);
  300. extern void  PT_cpyelt(struct b_elmnt *, struct b_elmnt *, int);
  301. extern void  PT_cpynode(int, struct b_node *, struct b_node *);
  302. extern void  PT_freenodes(int, struct keydesc *);
  303. extern void  PT_get_key(int, char *, char *);
  304. extern void  PT_makenodes(int, struct keydesc *, int);
  305. extern void  PT_shownode(int);
  306. extern void  PT_swapper(char *, int);
  307. extern void  PT_zeroelt(int, struct b_elmnt *);
  308. extern void  PT_zeronode(int, struct b_node *);
  309. #else
  310. extern char *PT_fmtkey();
  311. extern int   PT_add_elt();
  312. extern int   PT_add_key();
  313. extern int   PT_add_node();
  314. extern int   PT_chk_open();
  315. extern int   PT_del_elt();
  316. extern int   PT_del_key();
  317. extern int   PT_del_node();
  318. extern int   PT_find_key();
  319. extern int   PT_find_match();
  320. extern int   PT_flush_cache();
  321. extern int   PT_flush_node();
  322. extern int   PT_get_rec();
  323. extern int   PT_idxlock();
  324. extern int   PT_idxunlock();
  325. extern int   PT_keycmp();
  326. extern int   PT_keyrecycle();
  327. extern int   PT_new_dup();
  328. extern int   PT_readdata();
  329. extern int   PT_readhdr();
  330. extern int   PT_readidx();
  331. extern int   PT_readnum();
  332. extern int   PT_recrecycle();
  333. extern int   PT_resize();
  334. extern int   PT_writedata();
  335. extern int   PT_writehdr();
  336. extern int   PT_writeidx();
  337. extern int   PT_writenum();
  338. extern long  PT_first_key();
  339. extern long  PT_gteq_key();
  340. extern long  PT_keyreuse();
  341. extern long  PT_last_key();
  342. extern long  PT_next_key();
  343. extern long  PT_prev_key();
  344. extern long  PT_recreuse();
  345. extern void  PT_cpyelt();
  346. extern void  PT_cpynode();
  347. extern void  PT_freenodes();
  348. extern void  PT_get_key();
  349. extern void  PT_makenodes();
  350. extern void  PT_shownode();
  351. extern void  PT_swapper();
  352. extern void  PT_zeroelt();
  353. extern void  PT_zeronode();
  354. #endif
  355.  
  356.  
  357. /****************************************************************************
  358. *                       External Function Declarations                      *
  359. ****************************************************************************/
  360. #ifdef ANSI
  361. extern char *io_tran(int);
  362. #else
  363. extern char *io_tran();
  364. #endif
  365.  
  366.  
  367. /****************************************************************************
  368. *                  Pro-TREE Internal Variable Declatations                  *
  369. ****************************************************************************/
  370. extern WORD16 PT_filecnt; /* file system initialization file   */
  371. extern WORD8 *PT_Recbuf;  /* alloc'd once to prevent thrashing */
  372. extern WORD16 PT_Reclen;  /* length of Recbuf */
  373. extern WORD8 *PT_Nodebuf; /* alloc'd once to prevent thrashing */
  374. extern WORD16 PT_Nodelen; /* length of Nodebuf                 */
  375. extern AFDDEF *PT_fd;      /* file descriptor structure         */
  376.  
  377. extern long lseek();
  378.