/*************************************** * ISAM File System **************************************** * Copyright © 1989 by Kai Ploog * A.d. Huehnerhecke 1 * D-6074 Roedermark * **************************************** * Header: ISAM.h (set TAB to 4) * V0.9 beta rev 02 2/13/1989 * first version: 1/15/1989 ***************************************/ /* include your system's type definition header before ISAM.h !!! */ /********************* * defines *********************/ /*** field types ***/ #define ISAM_KEY (0x0001) /* key field */ #define ISAM_TEXT (0x0002) /* text field */ #define ISAM_NUMERIC (0x0004) /* numeric field (float) */ #define ISAM_DATE (0x0008) /* date field */ #define ISAM_TIME (0x0010) /* time field */ /*** ISAM types (hi-byte internal, lo-byte external) ***/ #define ISAM_SINGLEFILE (0x0001) /* single file sytem (no data base) */ #define ISAM_PREDEFINED (0x0002) /* predefined ISAMData structure */ #define ISAM_DATABASE (0x0004) /* data base system */ /*** ISAM Key flags (hi-byte external, lo-byte internal) ***/ #define ISAM_MODIFIED (0x0001) /* flag if keys have been modified */ #define ISAM_AUTOUPDATE (0x0100) /* automatic update when modified */ #define ISAM_DUPLICATEKEYS (0x0200) /* allows duplicate keys */ /*** ISAMOpen and function modes ***/ #define ISAM_REPLACE (0x01L) /* replace file/data set */ #define ISAM_NEWFILE (0x02L) /* create new ISAM file */ #define ISAM_OLDFILE (0x04L) /* open old ISAM file */ /*** Error numbers in Hd->Error ***/ #define ISAMe_CANT_OPEN_INDEX (1) #define ISAMe_CANT_WRITE_INDEX (2) #define ISAMe_CANT_READ_INDEX (3) #define ISAMe_CANT_SEEK_INDEX (4) #define ISAMe_CANT_CLOSE_INDEX (5) #define ISAMe_CANT_OPEN_DATA (6) #define ISAMe_CANT_WRITE_DATA (7) #define ISAMe_CANT_READ_DATA (8) #define ISAMe_CANT_SEEK_DATA (9) #define ISAMe_CANT_CLOSE_DATA (10) #define ISAMe_CANT_OPEN_DEF (11) #define ISAMe_CANT_WRITE_DEF (12) #define ISAMe_CANT_READ_DEF (13) #define ISAMe_CANT_SEEK_DEF (14) #define ISAMe_CANT_CLOSE_DEF (15) #define ISAMe_KEYS_NOT_EQUAL (16) #define ISAMe_KEY_EXISTS (17) #define ISAMe_MAXKEYS_REACHED (18) #define ISAMe_KEY_TOO_LONG (19) #define ISAMe_NOT_ENOUGH_MEM (20) /************************* * function prototypes *************************/ struct ISAMHeader *ISAMOpen(struct ISAMNewFile *, USHORT); int ISAMClose(struct ISAMHeader *); int ISAMUpdate(struct ISAMHeader *); int ISAMSearch (struct ISAMHeader *, STRPTR, int); int ISAMAdd (struct ISAMHeader *, APTR); int ISAMReplace (struct ISAMHeader *, APTR); int ISAMDelete (struct ISAMHeader *); int ISAMRead (struct ISAMHeader *, APTR); int ISAMFirst (struct ISAMHeader *); int ISAMLast (struct ISAMHeader *); int ISAMNext (struct ISAMHeader *); int ISAMPrev (struct ISAMHeader *); int ISAMError (struct ISAMHeader *); /********************* * structures *********************/ #define NAMLEN (32) #define FORMLEN (18) struct ISAMField { USHORT Size; /* the overall field size: sign+dec+point+frac */ USHORT Type; /* field type */ char Name[NAMLEN]; /* field name */ char Format[FORMLEN]; /* format of field contents */ UBYTE reserved[10]; /* reserved for future INTERNAL! use */ /* user defined data: */ /* insert user data above and update the number of reserved bytes: */ UBYTE user[14]; /* user reserved bytes */ }; #undef NAMLEN #undef FORMLEN struct ISAMDataHeader { USHORT Fields; /* number of fields in structure */ /* structure items MUST keep this * position and length (SHORT) !!! */ USHORT KeyPos; /* position of key field */ USHORT RecLength; /* length of whole record */ struct ISAMField Field[1]; /* field definition structures */ UBYTE reserved[10]; /* reserved for future INTERNAL! use */ /* user defined data: */ /* insert user data above and update the number of reserved bytes: */ UBYTE user[20]; /* user reserved bytes */ }; struct ISAMKey { struct ISAMKey *NextKey; /* next ISAMKey structure in list */ struct ISAMKey *PrevKey; /* previous ISAMKey structure in list */ ULONG Position; /* position of this key in data file */ char Key[1]; /* key string */ }; struct ISAMKeyHeader { struct ISAMKey *FirstKey; /* pointer to first ISAMKey structure */ struct ISAMKey *LastKey; /* pointer to last ISAMKey structure */ USHORT KeyLength; /* length of key field */ ULONG Keys; /* current number of keys in list */ ULONG MaxKeys; /* maximum number of keys allowed */ ULONG Records; /* number of filled-in records */ USHORT Flags; /* internal flags */ struct ISAMKey *Current; /* address of current key in key list */ }; struct ISAMFiles { STRPTR IndexName; /* pointer to file name for index (keys) */ int IndexFh; /* index file handle */ STRPTR DataName; /* pointer to file name for data */ int DataFh; /* data file handle */ STRPTR DefName; /* pointer to file name for data definitions */ int DefFh; /* defititions file handle */ }; struct ISAMHeader { struct ISAMHeader *NextHeader; /* pointer to next ISAMHeader structure */ APTR DBase; /* pointer to DataBase structure */ USHORT Type; /* ISAM types */ struct ISAMFiles *Files; /* pointer to ISAMFiles structure */ struct ISAMKeyHeader *Keys; /* pointer to ISAMKeyHeader structure */ struct ISAMDataHeader *Data; /* pointer to ISAMDataHeader structure */ int Error; /* last error number */ }; struct ISAMNewFile { STRPTR IndexName; /* pointer to index file name */ STRPTR DataName; /* pointer to data file name */ STRPTR DefName; /* pointer to definitions file name */ USHORT Type; /* type of ISAM file */ APTR DBase; /* pointer to DataBase structure */ struct ISAMDataHeader *Data; /* pointer to initialized data definition structure */ ULONG MaxKeys; /* maximum possible keys */ };