home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 311_01 / db.h < prev    next >
C/C++ Source or Header  |  1990-04-22  |  17KB  |  542 lines

  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      db.h  v1.3  (c) 1987-1990  Ken Harris                               */
  5. /*                                                                          */
  6. /*                                                                          */
  7. /****************************************************************************/
  8. /*                                                                          */
  9. /*      This software is made available on an AS-IS basis. Unrestricted     */
  10. /*      use is granted provided that the copyright notice remains intact.   */
  11. /*      The author makes no warranties expressed or implied.                */
  12. /*                                                                          */
  13. /****************************************************************************/
  14.  
  15. #ifdef ALL
  16. #define SEQ 1
  17. #define RAN 1
  18. #define IDX 1
  19. #define VAR 1
  20. #endif
  21.  
  22. #define DB_VERSION    13          /* Version 1.3            */
  23. #define FILE_NAME_MAX 50
  24.  
  25. #define YES -1
  26. #define NO   0
  27.  
  28. #ifdef ULTRIX
  29. #ifndef _TYPES_
  30.  typedef unsigned short ushort;
  31.  typedef unsigned int   uint;
  32. #endif
  33.  typedef unsigned char  uchar;
  34.  typedef unsigned long  ulong;
  35. #endif
  36.  
  37. #ifdef SYSV
  38. #ifndef types_h
  39.  typedef unsigned short ushort;
  40.  typedef unsigned int   uint;
  41. #endif
  42.  typedef unsigned char  uchar;
  43.  typedef unsigned long  ulong;
  44. #endif
  45.  
  46. #ifdef MSC
  47.  typedef unsigned short ushort;
  48.  typedef unsigned int   uint;
  49.  typedef unsigned char  uchar;
  50.  typedef unsigned long  ulong;
  51. #endif
  52.  
  53. #ifdef TURBO
  54.  typedef unsigned short ushort;
  55.  typedef unsigned int   uint;
  56.  typedef unsigned char  uchar;
  57.  typedef unsigned long  ulong;
  58. #endif
  59.  
  60. /*
  61.  *      db_file_hdr  -  File Header Record
  62.  */
  63.  
  64. struct db_file_hdr
  65. {       ushort fh_db_version;           /* Data Base Version #          */
  66.         ushort fh_file_type;            /* File Type                    */
  67. #define                                    DB_SEQ       1
  68. #define                                    DB_RANDOM    2
  69. #define                                    DB_INDEX     3
  70. #define                       DB_VAR       4
  71.  
  72.         ushort fh_file_stat;            /* File Status                  */
  73. #define                                    DB_CLOSED       0
  74. #define                                    DB_OPEN         1
  75. #define                                    DB_DUP_ALLOWED  2
  76.  
  77.         ulong  fh_last_block;           /* Last Allocated Block         */
  78.         ushort fh_block_size;           /* Block Size in bytes          */
  79.         ushort fh_rec_size;             /* Record Size in bytes         */
  80.         ushort fh_ctl_size;             /* Control part of rec size     */
  81.         ushort fh_data_size;            /* User data part of rec size   */
  82.         ulong  fh_rec_cnt;              /* Live Record Cnt              */
  83.         ushort fh_recs_per_blk;         /* Records Per Block            */
  84.         ushort fh_root_ptr;             /* Index File Root Pointer      */
  85.         ushort fh_base_size;            /* Random File Base Size        */
  86.         ushort fh_key_size;             /* Size of record key           */
  87.         ulong  fh_next_avail;           /* First Available Record       */
  88.         ushort fh_atr_size;             /* Size of Attribute Block      */
  89.     ulong  fh_vfile_size;        /* Size of VAR file data   V1.3 */
  90.     ushort fh_olink_cnt;        /* Owner link count        V1.3 */
  91.     ushort fh_mlink_cnt;        /* Member link count       V1.3 */
  92.     ushort fh_klink_cnt;        /* Key link count       V1.3 */
  93.                     /* Last part of the header rec  */
  94.                     /* is reserved for optional     */
  95.                     /* user attribute data.  The    */
  96.                     /* size is currently 256 bytes  */
  97. };
  98.  
  99. #define DB_FILE_HDR_SIZE  512
  100. #define DB_ATR_OFFSET     256
  101.  
  102. typedef  struct db_file_hdr *FILE_HDR;
  103.  
  104.  
  105. /*
  106.  *      db_data_buf  -  Data buffer
  107.  */
  108.  
  109. struct db_data_buf
  110. {       struct db_data_buf *buf_prev;   /* Previous Buffer in list      */
  111.         struct db_data_buf *buf_next;   /* Next Buffer in list          */
  112.         ushort buf_size;                /* Size of Buffer in Bytes      */
  113.         ushort buf_cur_blk;             /* Current Logical Blk (0=none) */
  114.         ushort buf_cur_size;            /* Current Block Size           */
  115.         ushort buf_rec_inx;             /* Record index into block      */
  116.         char  *buf_data;                /* Pointer to data              */
  117. };
  118.  
  119. typedef  struct db_data_buf *BUFFER;
  120.  
  121.  
  122. /*
  123.  *      db_data_file  -  Data File Descriptor Block
  124.  */
  125.  
  126. struct db_data_file
  127. {       ushort df_stat;                 /* Data File Status             */
  128.         BUFFER df_fhdr;                 /* File Header Buffer           */
  129.         short  df_fd;                   /* File descriptor              */
  130.         char   df_fname[FILE_NAME_MAX]; /* File name                    */
  131.         ulong  df_prev_blk;             /* Prev Block Read              */
  132.         ushort df_prev_rec;             /* Prev Record Read             */
  133.     ushort df_prev_vsize;        /* Prev var rec size        */
  134.         struct db_data_buf *df_buf;     /* Data Buffer                  */
  135.         struct db_data_buf *df_tmp;     /* Tmp Data Buffer              */
  136.         struct db_data_buf *df_aux;     /* Another Tmp Data Buffer      */
  137. };
  138.  
  139. typedef  struct db_data_file *DATA_FILE;
  140. typedef  struct db_data_file *DATA_SET;
  141.  
  142. #define DB_FH(df) ((FILE_HDR)(df->df_fhdr->duf_data))
  143.                            
  144. #define FH_DB_VERSION(df)   DB_FH(df)->fh_db_version
  145. #define FH_FILE_TYPE(df)    DB_FH(df)->fh_file_type
  146. #define FH_FILE_STAT(df)    DB_FH(df)->fh_file_stat
  147. #define FH_LAST_BLOCK(df)   DB_FH(df)->fh_last_block
  148. #define FH_BLOCK_SIZE(df)   DB_FH(df)->fh_block_size
  149. #define FH_REC_SIZE(df)     DB_FH(df)->fh_rec_size
  150. #define FH_CTL_SIZE(df)     DB_FH(df)->fh_ctl_size
  151. #define FH_DATA_SIZE(df)    DB_FH(df)->fh_data_size
  152. #define FH_REC_CNT(df)      DB_FH(df)->fh_rec_cnt
  153. #define FH_RECS_PER_BLK(df) DB_FH(df)->fh_recs_per_blk
  154. #define FH_ROOT_PTR(df)     DB_FH(df)->fh_root_ptr
  155.  
  156. /*
  157.  *      Record types
  158.  */
  159.  
  160. struct db_free_rec
  161. {       char  fre_stat;                 /* Status                       */
  162. #define                                    DB_FREE   '0'
  163. #define                                    DB_INUSE  '1'
  164.         ulong fre_next;                 /* Next Available               */
  165. };
  166.  
  167. struct db_seq_rec
  168. {       char  seq_stat;                 /* Status                       */
  169. };
  170.  
  171. struct db_index_hdr
  172. {       char   idx_stat;                /* Status                       */
  173.         ushort idx_parent;              /* Pointer to Parent            */
  174.         ushort idx_rec_cnt;             /* Keys in this block           */
  175. };
  176.  
  177. struct db_index_rec
  178. {       ushort idx_idx_ptr;             /* Pointer to index block       */
  179. };
  180.  
  181. struct db_random_hdr
  182. {       char   ran_stat;                /* Status                       */
  183.         ushort ran_next;                /* Overflow pointer             */
  184.         ushort ran_rec_cnt;             /* Live Recs in this block      */
  185. };
  186.  
  187. /*
  188.  *    This is a dummy structure that is used in sizeof operations
  189.  *    to make sure that db_random_hdr is atleast as big as db_free_rec.
  190.  */
  191. struct db_random_uhdr            
  192. {    union
  193.     {    struct db_free_rec ran_free;
  194.         struct db_random_hdr ran_hdr;
  195.     } uhdr;
  196. };
  197.  
  198. struct db_random_rec
  199. {       char   ran_stat;                /* Status                       */
  200. };
  201.           
  202. struct db_var_rec
  203. {    char   var_stat;        /* Status            */
  204.     ushort var_dsize;        /* size of data    in bytes    */
  205.     char   var_data[3];        /* beginning of data area &    */
  206.                     /* dummy for 2nd size field &    */
  207.                     /* 1 byte checksum at end    */
  208. };
  209.  
  210. typedef struct db_free_rec   *FREE_REC;
  211. typedef struct db_seq_rec    *SEQ_REC;
  212. typedef struct db_index_hdr  *INDEX_HDR;
  213. typedef struct db_index_rec  *INDEX_REC;
  214. typedef struct db_random_hdr *RANDOM_HDR;
  215. typedef struct db_random_rec *RANDOM_REC;
  216. typedef struct db_var_rec    *VAR_REC;
  217.  
  218. /*
  219.  *    Link Structures
  220.  */
  221.  
  222. struct db_link
  223. {    DATA_FILE owner_file;        /* Pointer to owner File desc    */
  224.     short     owner_index;        /* Index of owner link rec      */
  225.     short     owner_offset;        /* Offset of owner link rec     */
  226.     DATA_FILE member_file;        /* Pointer to member File desc  */
  227.     short     member_index;        /* Index of member link rec    */
  228.     short     member_offset;    /* Offset of member link rec    */
  229. };
  230.  
  231. typedef struct db_link *DB_LINK;
  232.  
  233.  
  234. struct db_owner_link
  235. {    long    olnk_first;        /* rec # of first member    */
  236.     long    olnk_last;        /* rec # of last member        */
  237. };
  238.  
  239. typedef struct db_owner_link *OLINK;
  240.  
  241.  
  242. struct db_member_link
  243. {    long    mlnk_prev;        /* rec # of prev member        */
  244.     long    mlnk_next;        /* rec # of next member        */
  245.     long    mlnk_owner;        /* rec # of owner        */
  246. };
  247.  
  248. typedef struct db_member_link *MLINK;
  249.  
  250.  
  251. struct db_key_link
  252. {    long  klnk_owner;        /* rec # of the master        */
  253. };
  254.  
  255. typedef struct db_key_link *KLINK;
  256.  
  257. /*
  258.  *    dictionary (symbol table manager) header defs
  259.  */
  260.  
  261. #define DICT_HASH_SIZE 127
  262. #define DICT_MAGIC     0xF012
  263.  
  264. /*
  265.  *    db_dict_obj - dictionary object header
  266.  */
  267.  
  268. struct db_dict_obj
  269. {    short               o_type;    /* object type            */
  270.     struct db_dict_obj *next;    /* next object in hash chain */
  271.     short               d_size;    /* data size             */
  272.     short               n_size;    /* name size             */
  273.     char            data;    /* first char of the data    */
  274.                         /* name follows data         */
  275. };
  276.  
  277. typedef struct db_dict_obj  *DOBJ;
  278.  
  279. struct db_dict_hdr
  280. {    ushort  magic;            /* Magic Number             */
  281.     DOBJ    htbl[DICT_HASH_SIZE];    /* Hash Table             */
  282. };
  283.  
  284. typedef struct db_dict_hdr  *DICT;
  285.  
  286. #define DB_FILE_NOT_FOUND      1
  287. #define DB_READ_ERROR          2
  288. #define DB_END_OF_FILE         3
  289. #define DB_WRITE_ERROR         4
  290. #define DB_FILE_NOT_CREATED    5
  291. #define DB_FILE_NOT_OPEN       6
  292. #define DB_INVALID_BLOCK       7
  293. #define DB_BUFFER_ERROR        8
  294. #define DB_NO_CURRENT_REC      9
  295. #define DB_DELETED_REC        10
  296. #define DB_INVALID_FREE       11
  297. #define DB_INVALID_BLK_SIZE   12
  298. #define DB_INVALID_INDEX      13
  299. #define DB_REC_NOT_FOUND      14
  300. #define DB_DUP_NOT_ALLOWED    15
  301. #define DB_INVALID_REQUEST    16
  302. #define DB_INVALID_RANDOM     17
  303. #define DB_INVALID_FHDR       18
  304. #define DB_VERSION_ERROR      19
  305. #define DB_INVALID_LINK       20
  306. #define DB_LINK_ERROR         21
  307. #define DB_FTYPE_ERROR        22
  308. #define DB_INVALID_OPTION     23
  309. #define DB_ALLOC_ERROR        24
  310. #define DB_VAR_SIZE_ERROR     25
  311. #define DB_VAR_CSUM_ERROR     26
  312. #define DB_UNSUPP_FEATURE     27
  313. #define DB_INVALID_DICT       28
  314. #define DB_INVALID_NAME       29
  315. #define DB_INVALID_ERROR      30
  316. #define DB_LAST_ERROR         30
  317.  
  318. extern int    db_error;
  319. extern ulong  db_match_blk;
  320. extern ushort db_match_rec;
  321. extern ulong  db_add_blk;
  322. extern ushort db_add_rec;
  323.  
  324. #ifdef ANSI
  325. /*
  326.  *    db_main defs
  327.  */
  328.  
  329.     struct db_data_file *db_create(char *,char *, char *);
  330.     void db_fhdr_create(struct db_file_hdr *);
  331.     struct db_data_file *db_open(char *,char *);
  332.     void db_fhdr_open(struct db_file_hdr *);
  333.     struct db_data_file *db_close(struct db_data_file *);
  334.     void db_delete(struct db_data_file *);
  335.     unsigned long db_get_rec_no(struct db_data_file *);
  336.     void db_check_df(struct db_data_file *);
  337.     void db_extend(struct db_data_file *,struct db_data_buf *);
  338.     void db_get_next_avail(struct db_data_file *,struct db_data_buf *);
  339.     void db_free_rec(struct db_data_file *,struct db_data_buf *);
  340.     void db_get_blk(struct db_data_file *,long ,struct db_data_buf *);
  341.     void db_put_blk(struct db_data_file *,struct db_data_buf *);
  342.     struct db_data_buf *db_alloc_buf(int );
  343.     struct db_data_buf *db_free_buf(struct db_data_buf *);
  344.     void db_free_df(struct db_data_file *);
  345.     char *db_error_msg(int );
  346.     
  347.     unsigned long db_add();
  348.     void db_read_first();
  349.     void db_read_next();
  350.     void db_read_last();
  351.     void db_read_prev();
  352.     void db_find();
  353.     void db_update();
  354.     void db_read_direct();
  355.     void db_read_atr();
  356.     void db_update_atr();
  357. /*
  358.  *    db_seq defs
  359.  */
  360.  
  361.     void db_add_seq(struct db_data_file *,char *);
  362.     void db_read_first_seq(struct db_data_file *,char *);
  363.     void db_read_next_seq(struct db_data_file *,char *);
  364.     void db_read_last_seq(struct db_data_file *,char *);
  365.     void db_read_prev_seq(struct db_data_file *,char *);
  366.     void db_update_seq(struct db_data_file *,char *);
  367.  
  368. /*
  369.  *    db_ran defs
  370.  */
  371.  
  372.     void db_add_ran(struct db_data_file *,char *);
  373.     void db_find_ran(struct db_data_file *,char *,char *);
  374.     void db_read_first_ran(struct db_data_file *,char *);
  375.     void db_read_next_ran(struct db_data_file *,char *);
  376.     void db_read_last_ran(struct db_data_file *,char *);
  377.     void db_read_prev_ran(struct db_data_file *,char *);
  378.     void db_update_ran(struct db_data_file *,char *);
  379.     void db_delete_ran(struct db_data_file *);
  380.     void db_delete_blk_ran(struct db_data_file *,unsigned long );
  381.     short db_hash_ran(struct db_data_file *,char *);
  382.     short db_search_blk_ran(struct db_data_file *,char *,struct db_data_buf *);
  383.  
  384. /*
  385.  *    db_idx defs
  386.  */
  387.  
  388.     void db_add_idx(struct db_data_file *,char *);
  389.     void db_find_insert_idx(struct db_data_file *,char *,int );
  390.     void db_split_blk_idx(struct db_data_file *);
  391.     void db_read_first_idx(struct db_data_file *,int ,char *);
  392.     void db_read_next_idx(struct db_data_file *,char *);
  393.     void db_read_last_idx(struct db_data_file *,int ,char *);
  394.     void db_read_prev_idx(struct db_data_file *,char *);
  395.     void db_get_parent_idx(struct db_data_file *);
  396.     void db_find_first_idx(struct db_data_file *,char *,char *,int );
  397.     void db_delete_idx(struct db_data_file *);
  398.     short db_move_to_leaf_idx(struct db_data_file *);
  399.     void db_balance_idx(struct db_data_file *);
  400.     void db_update_idx(struct db_data_file *,char *);
  401.  
  402. /*
  403.  *    db_link defs
  404.  */
  405.  
  406.     void db_add_member_first(DB_LINK);
  407.     void db_add_member_last(DB_LINK);
  408.     void db_delete_member(DB_LINK);
  409.     long db_find_first_member(DB_LINK);
  410.     long db_find_last_member(DB_LINK);
  411.     long db_find_prev_member(DB_LINK);
  412.     long db_find_next_member(DB_LINK);
  413.     long db_find_owner(DB_LINK);
  414.     void db_check_link(DB_LINK);
  415.     int  db_olink_offset(DATA_FILE, int);
  416.     int  db_mlink_offset(DATA_FILE, int);
  417.  
  418. /*
  419.  * dict defs
  420.  */
  421.  
  422.     int  db_dict_hash(char *);
  423.     DICT db_dict_init();
  424.     void *db_dict_add(DICT, char *, int, int, void *);
  425.     void db_dict_delete(DICT, char *, int);
  426.     void db_dict_delete_all(DICT, int);
  427.     void *db_dict_find(DICT, char *, int);
  428.     int  db_dict_find_all(DICT, int, char ***, void ***);
  429.     void db_dict_load(DICT, char *, char *);
  430.     void db_dict_dump(DICT, char *, char *);
  431.     void db_dict_close(DICT);
  432.  
  433. #else
  434. /*
  435.  *    db_main defs
  436.  */
  437.  
  438.     DATA_FILE db_create();
  439.     void db_fhdr_create();
  440.     DATA_FILE db_open();
  441.     void db_fhdr_open();
  442.     DATA_FILE db_close();
  443.     unsigned long db_add();
  444.     void db_read_first();
  445.     void db_read_next();
  446.     void db_read_last();
  447.     void db_read_prev();
  448.     void db_find();
  449.     void db_update();
  450.     void db_delete();
  451.     unsigned long db_get_rec_no();
  452.     void db_read_direct();
  453.     void db_read_atr();
  454.     void db_update_atr();
  455.     void db_check_df();
  456.     void db_extend();
  457.     void db_get_next_avail();
  458.     void db_free_rec();
  459.     void db_get_blk();
  460.     void db_put_blk();
  461.     struct db_data_buf *db_alloc_buf();
  462.     struct db_data_buf *db_free_buf();
  463.     void db_free_df();
  464.     char *db_error_msg();
  465.  
  466. /*
  467.  *    db_seq defs
  468.  */
  469.  
  470.     void db_add_seq();
  471.     void db_read_first_seq();
  472.     void db_read_next_seq();
  473.     void db_read_last_seq();
  474.     void db_read_prev_seq();
  475.     void db_update_seq();
  476.  
  477. /*
  478.  *    db_ran defs
  479.  */
  480.  
  481.     void db_add_ran();
  482.     void db_find_ran();
  483.     void db_read_first_ran();
  484.     void db_read_next_ran();
  485.     void db_read_last_ran();
  486.     void db_read_prev_ran();
  487.     void db_update_ran();
  488.     void db_delete_ran();
  489.     void db_delete_blk_ran();
  490.     short db_hash_ran();
  491.     short db_search_blk_ran();
  492.  
  493. /*
  494.  *    db_idx defs
  495.  */
  496.  
  497.     void db_add_idx();
  498.     void db_find_insert_idx();
  499.     void db_split_blk_idx();
  500.     void db_read_first_idx();
  501.     void db_read_next_idx();
  502.     void db_read_last_idx();
  503.     void db_read_prev_idx();
  504.     void db_get_parent_idx();
  505.     void db_find_first_idx();
  506.     void db_delete_idx();
  507.     short db_move_to_leaf_idx();
  508.     void db_balance_idx();
  509.     void db_update_idx();
  510.  
  511. /*
  512.  *    db_link defs
  513.  */
  514.  
  515.     void db_add_member_first();
  516.     void db_add_member_last();
  517.     void db_delete_member();
  518.     long db_find_first_member();
  519.     long db_find_last_member();
  520.     long db_find_prev_member();
  521.     long db_find_next_member();
  522.     long db_find_owner();
  523.     void db_check_link();
  524.     int  db_olink_offset();
  525.     int  db_mlink_offset();
  526.  
  527. /*
  528.  * dict defs
  529.  */
  530.  
  531.     db_dict_hash();
  532.     DICT db_dict_init();
  533.     void *db_dict_add();
  534.     void db_dict_delete();
  535.     void db_dict_delete_all();
  536.     void *db_dict_find();
  537.     db_dict_find_all();
  538.     void db_dict_load();
  539.     void db_dict_dump();
  540.     void db_dict_close();
  541. #endif
  542.