#define ISAM_OPH

#ifndef P_OBJECT_OPH
#include <p\object>
#endif

#ifndef P_DBF_OPH
#include <p\dbf>
#endif

#ifndef P_MATH_OPH
#include <p\math>
#endif

/* Category Numbers */

#ifdef EPOC
#define CAT_ISAM_ISAM 0
#endif

/* Property of isroot */

STRUCT PRS_ISROOT
	pc#(SIZEOF(P_OBJECT))
ENDS

STRUCT PR_ISROOT
	isroot#(SIZEOF(PRS_ISROOT))
ENDS

/* Property of darec */

STRUCT PR_DAREC
	isroot#(SIZEOF(PRS_ISROOT))
ENDS

/* Property of ixrec */

STRUCT PRS_IXREC
	filterObj%
	filterMeth%
	dupObj%
	dupMeth%
	nMatch%
ENDS

STRUCT PR_IXREC
	isroot#(SIZEOF(PRS_ISROOT))
	ixrec#(SIZEOF(PRS_IXREC))
ENDS

/* Constants for isaman */

#define ISAM_MAX_INDEXES 8
#define ISAM_MAX_KEY_LENGTH 64
#define ISAM_MAX_DEFINED_FIELDS 32
#define ISAM_MAX_KEYFIELDS 8
#define ISAM_MAX_KEYDEF_LENGTH 66
#define ISAM_MAX_FIELD_LENGTH 256
#define ISAM_MAX_SEG_BLOCKS 1024
#define ISAM_MIN_RECORD_BUFFER 512
#define ISAM_MAX_RECORD_BUFFER 16384
#define ISAM_MAX_RECORD_FIELDS 4094
#define ISAM_RECORD_LENGTH_MASK 0xfff
#define ISAM_BLOCK_SIZE 512
#define ISAM_BLOCK_SHIFTS 9
#define ISAM_FIELDTYPE_WORD 0
#define ISAM_FIELDTYPE_UWORD 0x80
#define ISAM_FIELDTYPE_LONG 1
#define ISAM_FIELDTYPE_ULONG 0x81
#define ISAM_FIELDTYPE_DOUBLE 2
#define ISAM_FIELDTYPE_STRING 3
#define ISAM_FIELDTYPE_BYTE 4
#define ISAM_FIELDTYPE_UBYTE 0x84
#define ISAM_FIELDTYPE_LIMIT 4
#define ISAM_CONVERT_NOFOLD 0
#define ISAM_CONVERT_FOLD 1
#define ISAM_CONVERT_UPPER 2
#define ISAM_CONVERT_LOWER 3
#define ISAM_FIELDFLAG_ASCEND 0
#define ISAM_FIELDFLAG_DESCEND 1
#define ISAM_FLAG_ALLOWDUP 1
#define ISAM_FLAG_MANUAL 2
#define ISAM_FLAG_MINIMIZE 4
#define ISAM_DEFAULT_FIELD_COUNT 32
#define ISAM_DEFAULT_FIELD_TYPE ISAM_FIELDTYPE_STRING
#define ISAM_DEFAULT_KEY_FIELD_COUNT 1
#define ISAM_DEFAULT_KEY_STRING_LENGTH 8
#define ISAM_DEFAULT_RADIX 10
#define ISAM_DEFAULT_DTOB_WIDTH 20
#define ISAM_DEFAULT_DTOB_POINT '.'
#define ISAM_PANIC_CALL 160
#define ISAM_PANIC_PARAM 161

/* Types for isaman */

STRUCT ISAM_FIELDDEF
	nFields%
	type#(ISAM_MAX_DEFINED_FIELDS)
ENDS

STRUCT ISAM_KEY_FIELD
	field%
	type#
	flags#
	offset#
	len#
	convert%
ENDS

STRUCT ISAM_KEYDEF
	nKeyFields%
	keyField#(OPPEVAL(SIZEOF(ISAM_KEY_FIELD)*ISAM_MAX_KEYFIELDS))
ENDS

/* Property of isaman */

STRUCT PRS_ISAMAN
	daRec%
	ixRec%(ISAM_MAX_INDEXES)
	ixCat%
	ixClass%
	iBufBlocks%
	ref&
	radix%
	dFormat#(SIZEOF(P_DTOB))
	rBufSize%
	rBuf%
	fieldInfo#(SIZEOF(ISAM_FIELDDEF))
	keyDef#(SIZEOF(ISAM_KEYDEF))
	zeroBuf#(8)
	tempField#(ISAM_MAX_FIELD_LENGTH)
ENDS

STRUCT PR_ISAMAN
	isroot#(SIZEOF(PRS_ISROOT))
	isaman#(SIZEOF(PRS_ISAMAN))
ENDS

/* Property of btdbf */

STRUCT PR_BTDBF
	isroot#(SIZEOF(PRS_ISROOT))
	isaman#(SIZEOF(PRS_ISAMAN))
ENDS

/* Property of dadbf */

STRUCT PRS_DADBF
	pfcb%
	buffer%
	maxBufSize%
	currentBufSize%
	nextOffset%
	recordType%
	dataStart&
	bufFilePos&
	ref&
	header#(SIZEOF(DbfHeader))
ENDS

STRUCT PR_DADBF
	isroot#(SIZEOF(PRS_ISROOT))
	dadbf#(SIZEOF(PRS_DADBF))
ENDS

/* Constants for ixbtree */

#define BT_SIG_LENGTH 16
#define BT_INDEXFILE_VERSION 0x100F
#define BT_INDEXFILE_TYPE1 1
#define BT_MAX_LEVELS 10

/* Types for ixbtree */

STRUCT IXBTREE_FILE_HEADER
	signature#(BT_SIG_LENGTH)
	version%
	type%
	count&
	rootBlock%
	flags%
	keyLen%
	entryLen%
	maxEntries%
	keyDef#(ISAM_MAX_KEYDEF_LENGTH)
ENDS

STRUCT IXBTREE_ENTRY
	child%
	ref&
	key#(ISAM_MAX_KEY_LENGTH)
ENDS

STRUCT IXBTREE_BLOCK
	nEntries%
	entry#(2)
ENDS

STRUCT IXBTREE_STACK
	blockNum%
	entryNum%
ENDS

/* Property of ixbtree */

STRUCT PRS_IXBTREE
	fileId%
	level%
	blockNum%
	entryNum%
	ref&
	pB%
	stack#(OPPEVAL(SIZEOF(IXBTREE_STACK)*BT_MAX_LEVELS))
	head#(SIZEOF(IXBTREE_FILE_HEADER))
ENDS

STRUCT PR_IXBTREE
	isroot#(SIZEOF(PRS_ISROOT))
	ixrec#(SIZEOF(PRS_IXREC))
	ixbtree#(SIZEOF(PRS_IXBTREE))
ENDS

/* Constants for blocker */

#define BL_BLOCK_SIZE 512
#define BL_BLOCK_SHIFTS 9
#define BL_SEG_BLOCKS 20
#define BL_DS_BLOCKS 4
#define BL_BLOCK_GRANULARITY 4
#define BL_MAX_FILES 32
#define BL_SIG_LENGTH 16
#define BL_FILE_VERSION 0x100F
#define BL_LIST_SIZE 6

/* Types for blocker */

STRUCT BLOCKER_INFO
	dirty%
	totalBlocks%
	ffBlock%
ENDS

STRUCT BLOCKER_FILE_HEADER
	signature#(BL_SIG_LENGTH)
	version%
	info#(SIZEOF(BLOCKER_INFO))
	spare#(8)
ENDS

STRUCT BLOCKER_FCB
	chan%
	actualBlocks%
	info#(SIZEOF(BLOCKER_INFO))
ENDS

STRUCT BLOCKER_DS_BUF
	lru%
	fileId%
	block%
	data#(BL_BLOCK_SIZE)
ENDS

/* Property of blocker */

STRUCT PRS_BLOCKER
	pBlock%
	pFileId%
	pDirty%
	pLru%
	segHandle%
	maxBlocks%
	nFiles%
	currBuf%
	fileCB#(OPPEVAL(SIZEOF(BLOCKER_FCB)*BL_MAX_FILES))
	dsBuf#(OPPEVAL(SIZEOF(BLOCKER_DS_BUF)*BL_DS_BLOCKS))
	temp#(BL_BLOCK_SIZE)
ENDS

STRUCT PR_BLOCKER
	isroot#(SIZEOF(PRS_ISROOT))
	blocker#(SIZEOF(PRS_BLOCKER))
ENDS
