home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
database
/
mbase.zip
/
MBASE.H
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-11
|
7KB
|
123 lines
/* ******************************************************************** *
*** unix compatible ***
* MetalBase 3.0.................................................... *
* *
* Multi-user simultaneous use of relations (On multi-user hardware) *
* Users may have many relations open at once, even the same one! *
* Unlimited length records (Really! Just redefine BUF_LEN!) *
* Up to 20 indicies per relation, 5 fields max per composite index *
* Up to 4.2 billion records per relation *
* Bizzare intermittent bugs, just like the expensive programs *
* And, unless they're weird, your kids will eat it *
* /\ *
* Written starting in August 1989, by Huan-Ti rj / \ *
* / \ *
* "Ye hath mushrooms for $1.99 a pound. Ye art \ / *
* truly a Calvinist." \ / tp *
* -- II Calvin 7:1 \/ *
*** ***
* ******************************************************************** */
#include "stdinc.h"
#ifndef BUF_LEN /* Maximum possible needed buffer (Length = 1 + */
#define BUF_LEN 256 /* record_length + 13*number_of_indicies */
#endif /* If needed, redefine before #including */
#ifndef MAX_REL /* Maximum possible # of relations open at once, */
#define MAX_REL 5 /* for this user. DOES NOT CHANGE STDIO'S # of */
#endif /* FILES OPEN AT ONCE (#_of_rel + 3) */
#ifndef MAX_FLDS /* Maximum number of fields in any given */
#define MAX_FLDS 30 /* relation. If you need more than 30, redefine */
#endif /* before #including <mbase.h> */
#define OKAY 0 /* Generic no-problem number. Thank IBM. */
#define NOT_ENOUGH_ROOM -1000 /* Too many files are open at once */
#define CANNOT_OPEN_REL -1001 /* Can't open FILE.REL */
#define RELATION_HUNG -1002 /* User left during add/del/upd. See dox */
#define CANNOT_READ_REL -1003 /* FILE.REL is protected (Need rw access) */
#define RELATION_BUSY -1004 /* 120 users on one relation=max (Hah!) */
#define RELATION_LOCKED -1005 /* Someone has locked the relation */
#define LOCK_DENIED -1006 /* Can't lock with other users. See dox */
#define ILLEGAL_DUPLICATE -1007 /* Record would violate a nodups index */
#define CORRUPT_INDEX -1008 /* Means you're fucked. Probly not used */
#define INVALID_FILE_CODE -1009 /* You've passed an unreal relation numb */
#define NOT_OPEN -1010 /* You've tried to work with a closed rel */
#define RCD_INVALID -1011 /* Bad-size or # of flds given to add/upd */
#define INVALID_COMP -1012 /* SELECT's record for comparison is bad */
#define UNKNOWN_ACTION -1013 /* You'll probly never get this one. */
#define NOT_FOUND -1014 /* Generic. Can't find the record U want */
#define NO_CURRENT_RECORD -1015 /* Must select a record before del/upd */
#define INVALID_INDEX -1016 /* A bad index # has been sent to mb_sel */
#define CURR 1 /* Re-read the current record (4 mb_sel) */
#define EQUL 2 /* Get rec that matches exactly (see dox) */
#define FRST 3 /* Get the first record, sequentially */
#define GTEQ 4 /* If not exact, get the one right after */
#define GTHN 5 /* Like GTEQ, but won't accept exact one */
#define LAST 6 /* Get the last record, sequentially */
#define LTEQ 7 /* If not exact, get the one right before */
#define LTHN 8 /* Like LTEQ, but won't accept exact one */
#define NEXT 9 /* Get the next record, sequentially */
#define PREV 10 /* Get the previous record, sequentially */
#define CURRENT CURR /* These are included to reduce errors */
#define EQUAL EQUL /* due to stupid humans who insist on */
#define FIRST FRST /* using long words instead of short ones */
#define GTHAN GTHN /* */
#define LTHAN LTHN /* Gee, I'm considerate. */
#define PREVIOUS PREV /* */
#define ZEROES "\001\001\001\001\001\001\001\001\001\001\001\001."
/****************************************************************************/
/* */
/* A reminder of the single rule that applies to EVERYTHING in this file: */
/* */
/* If you don't understand it, DON'T SCREW WITH IT. */
/* */
/* I'd like to emphasize that this rule is _most_important_ in viewing the */
/* follow section of definitions. If you wanna change the internal */
/* structure of the relations, and think you can (successfully, that is), */
/* go right ahead. And send me a copy of the "better" MetalBase when you */
/* think you're finished... I'd like to see it. :-) */
/* */
/****************************************************************************/
#define _t_top(f,i) 4 + 4*i
#define _idxs(f) 13*(_list[f].num_idx)
#define _num_recs(f) 5 + 4*(_list[f].num_idx)
#define _block(f) 11+(4*_list[f].num_idx)
#define _base(f,r) _block(f)+_list[f].relbase+(r-1)*((13*_list[f].num_idx)+\
2+(_list[f].rec_len))
#define _l_ptr(f,i,r) _base (f, r) + 13*i
#define _r_ptr(f,i,r) _l_ptr (f, i, r) + 4
#define _b_ptr(f,i,r) _r_ptr (f, i, r) + 4
#define _rec(f,r) _base (f, r) + (13*_list[f].num_idx) + 1
#define _len(f) 2 + _idxs (f) + _list[f].rec_len
/* Whew! */
char buffer [BUF_LEN];
int _Started = -1;
#define mb_key(a,b,c) _skey(a,b-1,c)
struct
{ long int pos, relbase;
int relcode;
int num_idx, rec_len;
int idx_dups [20];
int idx_just [MAX_FLDS];
int idx_num [20][6];
int idx_start [20][6];
int idx_stop [20][5];
char filename [80]; } _list [MAX_REL];