/***************************************
*         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 */
};


