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 >
Wrap
C/C++ Source or Header
|
1990-04-22
|
17KB
|
542 lines
/****************************************************************************/
/* */
/* */
/* db.h v1.3 (c) 1987-1990 Ken Harris */
/* */
/* */
/****************************************************************************/
/* */
/* This software is made available on an AS-IS basis. Unrestricted */
/* use is granted provided that the copyright notice remains intact. */
/* The author makes no warranties expressed or implied. */
/* */
/****************************************************************************/
#ifdef ALL
#define SEQ 1
#define RAN 1
#define IDX 1
#define VAR 1
#endif
#define DB_VERSION 13 /* Version 1.3 */
#define FILE_NAME_MAX 50
#define YES -1
#define NO 0
#ifdef ULTRIX
#ifndef _TYPES_
typedef unsigned short ushort;
typedef unsigned int uint;
#endif
typedef unsigned char uchar;
typedef unsigned long ulong;
#endif
#ifdef SYSV
#ifndef types_h
typedef unsigned short ushort;
typedef unsigned int uint;
#endif
typedef unsigned char uchar;
typedef unsigned long ulong;
#endif
#ifdef MSC
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
#endif
#ifdef TURBO
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
#endif
/*
* db_file_hdr - File Header Record
*/
struct db_file_hdr
{ ushort fh_db_version; /* Data Base Version # */
ushort fh_file_type; /* File Type */
#define DB_SEQ 1
#define DB_RANDOM 2
#define DB_INDEX 3
#define DB_VAR 4
ushort fh_file_stat; /* File Status */
#define DB_CLOSED 0
#define DB_OPEN 1
#define DB_DUP_ALLOWED 2
ulong fh_last_block; /* Last Allocated Block */
ushort fh_block_size; /* Block Size in bytes */
ushort fh_rec_size; /* Record Size in bytes */
ushort fh_ctl_size; /* Control part of rec size */
ushort fh_data_size; /* User data part of rec size */
ulong fh_rec_cnt; /* Live Record Cnt */
ushort fh_recs_per_blk; /* Records Per Block */
ushort fh_root_ptr; /* Index File Root Pointer */
ushort fh_base_size; /* Random File Base Size */
ushort fh_key_size; /* Size of record key */
ulong fh_next_avail; /* First Available Record */
ushort fh_atr_size; /* Size of Attribute Block */
ulong fh_vfile_size; /* Size of VAR file data V1.3 */
ushort fh_olink_cnt; /* Owner link count V1.3 */
ushort fh_mlink_cnt; /* Member link count V1.3 */
ushort fh_klink_cnt; /* Key link count V1.3 */
/* Last part of the header rec */
/* is reserved for optional */
/* user attribute data. The */
/* size is currently 256 bytes */
};
#define DB_FILE_HDR_SIZE 512
#define DB_ATR_OFFSET 256
typedef struct db_file_hdr *FILE_HDR;
/*
* db_data_buf - Data buffer
*/
struct db_data_buf
{ struct db_data_buf *buf_prev; /* Previous Buffer in list */
struct db_data_buf *buf_next; /* Next Buffer in list */
ushort buf_size; /* Size of Buffer in Bytes */
ushort buf_cur_blk; /* Current Logical Blk (0=none) */
ushort buf_cur_size; /* Current Block Size */
ushort buf_rec_inx; /* Record index into block */
char *buf_data; /* Pointer to data */
};
typedef struct db_data_buf *BUFFER;
/*
* db_data_file - Data File Descriptor Block
*/
struct db_data_file
{ ushort df_stat; /* Data File Status */
BUFFER df_fhdr; /* File Header Buffer */
short df_fd; /* File descriptor */
char df_fname[FILE_NAME_MAX]; /* File name */
ulong df_prev_blk; /* Prev Block Read */
ushort df_prev_rec; /* Prev Record Read */
ushort df_prev_vsize; /* Prev var rec size */
struct db_data_buf *df_buf; /* Data Buffer */
struct db_data_buf *df_tmp; /* Tmp Data Buffer */
struct db_data_buf *df_aux; /* Another Tmp Data Buffer */
};
typedef struct db_data_file *DATA_FILE;
typedef struct db_data_file *DATA_SET;
#define DB_FH(df) ((FILE_HDR)(df->df_fhdr->duf_data))
#define FH_DB_VERSION(df) DB_FH(df)->fh_db_version
#define FH_FILE_TYPE(df) DB_FH(df)->fh_file_type
#define FH_FILE_STAT(df) DB_FH(df)->fh_file_stat
#define FH_LAST_BLOCK(df) DB_FH(df)->fh_last_block
#define FH_BLOCK_SIZE(df) DB_FH(df)->fh_block_size
#define FH_REC_SIZE(df) DB_FH(df)->fh_rec_size
#define FH_CTL_SIZE(df) DB_FH(df)->fh_ctl_size
#define FH_DATA_SIZE(df) DB_FH(df)->fh_data_size
#define FH_REC_CNT(df) DB_FH(df)->fh_rec_cnt
#define FH_RECS_PER_BLK(df) DB_FH(df)->fh_recs_per_blk
#define FH_ROOT_PTR(df) DB_FH(df)->fh_root_ptr
/*
* Record types
*/
struct db_free_rec
{ char fre_stat; /* Status */
#define DB_FREE '0'
#define DB_INUSE '1'
ulong fre_next; /* Next Available */
};
struct db_seq_rec
{ char seq_stat; /* Status */
};
struct db_index_hdr
{ char idx_stat; /* Status */
ushort idx_parent; /* Pointer to Parent */
ushort idx_rec_cnt; /* Keys in this block */
};
struct db_index_rec
{ ushort idx_idx_ptr; /* Pointer to index block */
};
struct db_random_hdr
{ char ran_stat; /* Status */
ushort ran_next; /* Overflow pointer */
ushort ran_rec_cnt; /* Live Recs in this block */
};
/*
* This is a dummy structure that is used in sizeof operations
* to make sure that db_random_hdr is atleast as big as db_free_rec.
*/
struct db_random_uhdr
{ union
{ struct db_free_rec ran_free;
struct db_random_hdr ran_hdr;
} uhdr;
};
struct db_random_rec
{ char ran_stat; /* Status */
};
struct db_var_rec
{ char var_stat; /* Status */
ushort var_dsize; /* size of data in bytes */
char var_data[3]; /* beginning of data area & */
/* dummy for 2nd size field & */
/* 1 byte checksum at end */
};
typedef struct db_free_rec *FREE_REC;
typedef struct db_seq_rec *SEQ_REC;
typedef struct db_index_hdr *INDEX_HDR;
typedef struct db_index_rec *INDEX_REC;
typedef struct db_random_hdr *RANDOM_HDR;
typedef struct db_random_rec *RANDOM_REC;
typedef struct db_var_rec *VAR_REC;
/*
* Link Structures
*/
struct db_link
{ DATA_FILE owner_file; /* Pointer to owner File desc */
short owner_index; /* Index of owner link rec */
short owner_offset; /* Offset of owner link rec */
DATA_FILE member_file; /* Pointer to member File desc */
short member_index; /* Index of member link rec */
short member_offset; /* Offset of member link rec */
};
typedef struct db_link *DB_LINK;
struct db_owner_link
{ long olnk_first; /* rec # of first member */
long olnk_last; /* rec # of last member */
};
typedef struct db_owner_link *OLINK;
struct db_member_link
{ long mlnk_prev; /* rec # of prev member */
long mlnk_next; /* rec # of next member */
long mlnk_owner; /* rec # of owner */
};
typedef struct db_member_link *MLINK;
struct db_key_link
{ long klnk_owner; /* rec # of the master */
};
typedef struct db_key_link *KLINK;
/*
* dictionary (symbol table manager) header defs
*/
#define DICT_HASH_SIZE 127
#define DICT_MAGIC 0xF012
/*
* db_dict_obj - dictionary object header
*/
struct db_dict_obj
{ short o_type; /* object type */
struct db_dict_obj *next; /* next object in hash chain */
short d_size; /* data size */
short n_size; /* name size */
char data; /* first char of the data */
/* name follows data */
};
typedef struct db_dict_obj *DOBJ;
struct db_dict_hdr
{ ushort magic; /* Magic Number */
DOBJ htbl[DICT_HASH_SIZE]; /* Hash Table */
};
typedef struct db_dict_hdr *DICT;
#define DB_FILE_NOT_FOUND 1
#define DB_READ_ERROR 2
#define DB_END_OF_FILE 3
#define DB_WRITE_ERROR 4
#define DB_FILE_NOT_CREATED 5
#define DB_FILE_NOT_OPEN 6
#define DB_INVALID_BLOCK 7
#define DB_BUFFER_ERROR 8
#define DB_NO_CURRENT_REC 9
#define DB_DELETED_REC 10
#define DB_INVALID_FREE 11
#define DB_INVALID_BLK_SIZE 12
#define DB_INVALID_INDEX 13
#define DB_REC_NOT_FOUND 14
#define DB_DUP_NOT_ALLOWED 15
#define DB_INVALID_REQUEST 16
#define DB_INVALID_RANDOM 17
#define DB_INVALID_FHDR 18
#define DB_VERSION_ERROR 19
#define DB_INVALID_LINK 20
#define DB_LINK_ERROR 21
#define DB_FTYPE_ERROR 22
#define DB_INVALID_OPTION 23
#define DB_ALLOC_ERROR 24
#define DB_VAR_SIZE_ERROR 25
#define DB_VAR_CSUM_ERROR 26
#define DB_UNSUPP_FEATURE 27
#define DB_INVALID_DICT 28
#define DB_INVALID_NAME 29
#define DB_INVALID_ERROR 30
#define DB_LAST_ERROR 30
extern int db_error;
extern ulong db_match_blk;
extern ushort db_match_rec;
extern ulong db_add_blk;
extern ushort db_add_rec;
#ifdef ANSI
/*
* db_main defs
*/
struct db_data_file *db_create(char *,char *, char *);
void db_fhdr_create(struct db_file_hdr *);
struct db_data_file *db_open(char *,char *);
void db_fhdr_open(struct db_file_hdr *);
struct db_data_file *db_close(struct db_data_file *);
void db_delete(struct db_data_file *);
unsigned long db_get_rec_no(struct db_data_file *);
void db_check_df(struct db_data_file *);
void db_extend(struct db_data_file *,struct db_data_buf *);
void db_get_next_avail(struct db_data_file *,struct db_data_buf *);
void db_free_rec(struct db_data_file *,struct db_data_buf *);
void db_get_blk(struct db_data_file *,long ,struct db_data_buf *);
void db_put_blk(struct db_data_file *,struct db_data_buf *);
struct db_data_buf *db_alloc_buf(int );
struct db_data_buf *db_free_buf(struct db_data_buf *);
void db_free_df(struct db_data_file *);
char *db_error_msg(int );
unsigned long db_add();
void db_read_first();
void db_read_next();
void db_read_last();
void db_read_prev();
void db_find();
void db_update();
void db_read_direct();
void db_read_atr();
void db_update_atr();
/*
* db_seq defs
*/
void db_add_seq(struct db_data_file *,char *);
void db_read_first_seq(struct db_data_file *,char *);
void db_read_next_seq(struct db_data_file *,char *);
void db_read_last_seq(struct db_data_file *,char *);
void db_read_prev_seq(struct db_data_file *,char *);
void db_update_seq(struct db_data_file *,char *);
/*
* db_ran defs
*/
void db_add_ran(struct db_data_file *,char *);
void db_find_ran(struct db_data_file *,char *,char *);
void db_read_first_ran(struct db_data_file *,char *);
void db_read_next_ran(struct db_data_file *,char *);
void db_read_last_ran(struct db_data_file *,char *);
void db_read_prev_ran(struct db_data_file *,char *);
void db_update_ran(struct db_data_file *,char *);
void db_delete_ran(struct db_data_file *);
void db_delete_blk_ran(struct db_data_file *,unsigned long );
short db_hash_ran(struct db_data_file *,char *);
short db_search_blk_ran(struct db_data_file *,char *,struct db_data_buf *);
/*
* db_idx defs
*/
void db_add_idx(struct db_data_file *,char *);
void db_find_insert_idx(struct db_data_file *,char *,int );
void db_split_blk_idx(struct db_data_file *);
void db_read_first_idx(struct db_data_file *,int ,char *);
void db_read_next_idx(struct db_data_file *,char *);
void db_read_last_idx(struct db_data_file *,int ,char *);
void db_read_prev_idx(struct db_data_file *,char *);
void db_get_parent_idx(struct db_data_file *);
void db_find_first_idx(struct db_data_file *,char *,char *,int );
void db_delete_idx(struct db_data_file *);
short db_move_to_leaf_idx(struct db_data_file *);
void db_balance_idx(struct db_data_file *);
void db_update_idx(struct db_data_file *,char *);
/*
* db_link defs
*/
void db_add_member_first(DB_LINK);
void db_add_member_last(DB_LINK);
void db_delete_member(DB_LINK);
long db_find_first_member(DB_LINK);
long db_find_last_member(DB_LINK);
long db_find_prev_member(DB_LINK);
long db_find_next_member(DB_LINK);
long db_find_owner(DB_LINK);
void db_check_link(DB_LINK);
int db_olink_offset(DATA_FILE, int);
int db_mlink_offset(DATA_FILE, int);
/*
* dict defs
*/
int db_dict_hash(char *);
DICT db_dict_init();
void *db_dict_add(DICT, char *, int, int, void *);
void db_dict_delete(DICT, char *, int);
void db_dict_delete_all(DICT, int);
void *db_dict_find(DICT, char *, int);
int db_dict_find_all(DICT, int, char ***, void ***);
void db_dict_load(DICT, char *, char *);
void db_dict_dump(DICT, char *, char *);
void db_dict_close(DICT);
#else
/*
* db_main defs
*/
DATA_FILE db_create();
void db_fhdr_create();
DATA_FILE db_open();
void db_fhdr_open();
DATA_FILE db_close();
unsigned long db_add();
void db_read_first();
void db_read_next();
void db_read_last();
void db_read_prev();
void db_find();
void db_update();
void db_delete();
unsigned long db_get_rec_no();
void db_read_direct();
void db_read_atr();
void db_update_atr();
void db_check_df();
void db_extend();
void db_get_next_avail();
void db_free_rec();
void db_get_blk();
void db_put_blk();
struct db_data_buf *db_alloc_buf();
struct db_data_buf *db_free_buf();
void db_free_df();
char *db_error_msg();
/*
* db_seq defs
*/
void db_add_seq();
void db_read_first_seq();
void db_read_next_seq();
void db_read_last_seq();
void db_read_prev_seq();
void db_update_seq();
/*
* db_ran defs
*/
void db_add_ran();
void db_find_ran();
void db_read_first_ran();
void db_read_next_ran();
void db_read_last_ran();
void db_read_prev_ran();
void db_update_ran();
void db_delete_ran();
void db_delete_blk_ran();
short db_hash_ran();
short db_search_blk_ran();
/*
* db_idx defs
*/
void db_add_idx();
void db_find_insert_idx();
void db_split_blk_idx();
void db_read_first_idx();
void db_read_next_idx();
void db_read_last_idx();
void db_read_prev_idx();
void db_get_parent_idx();
void db_find_first_idx();
void db_delete_idx();
short db_move_to_leaf_idx();
void db_balance_idx();
void db_update_idx();
/*
* db_link defs
*/
void db_add_member_first();
void db_add_member_last();
void db_delete_member();
long db_find_first_member();
long db_find_last_member();
long db_find_prev_member();
long db_find_next_member();
long db_find_owner();
void db_check_link();
int db_olink_offset();
int db_mlink_offset();
/*
* dict defs
*/
db_dict_hash();
DICT db_dict_init();
void *db_dict_add();
void db_dict_delete();
void db_dict_delete_all();
void *db_dict_find();
db_dict_find_all();
void db_dict_load();
void db_dict_dump();
void db_dict_close();
#endif