Category : C Source Code
Archive   : C_DBFS.ZIP
Filename : DB.H

 
Output of file : DB.H contained in archive : C_DBFS.ZIP
/****************************************************************************/
/* */
/* */
/* 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


  3 Responses to “Category : C Source Code
Archive   : C_DBFS.ZIP
Filename : DB.H

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/