home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
High Voltage Shareware
/
high1.zip
/
high1
/
DIR36
/
BTV200.ZIP
/
BTV.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-12-18
|
50KB
|
435 lines
(* This file was mangled by Mangler 1.14 (c) Copyright 1993 by Berend de Boer *)
UNIT BTV ;{$F-} {$V-} {$X+} {$A-} {$IFOPT R+} {$DEFINE __RANGE_ON} {$ENDIF} {$IFOPT Q+} {$DEFINE __OVERFLOW_ON} {$ENDIF}
{$DEFINE BTRIEVE50} INTERFACE USES BTVCONST , {$IFDEF VER70} WINDOS , {$ELSE} DOS , {$ENDIF} {$IFDEF MSDOS} CRT ,
BTRVDOS ;{$ENDIF} {$IFDEF DPMI} CRT , BTRVDPMI ;{$ENDIF} {$IFDEF WINDOWS} WINPROCS , WINTYPES , BTRVWIN ;{$ENDIF}
TYPE {$IFDEF VER70} PATHSTR =STRING [ FSPATHNAME ] ;{$ENDIF} ALLERRORS =BINVALIDOP .. BLASTERROR ;ERRORSET =SET
OF ALLERRORS ;ERRORACTION =(ERABORT , ERDONE , ERRETRY );PBYTES =^BYTES ;BYTES =ARRAY [ 1 .. 65534 ] OF BYTE ;
PPROGRESS =^TPROGRESS ;TPROGRESS =OBJECT CONSTRUCTOR INIT ;PROCEDURE DISPLAY (COUNT :LONGINT );VIRTUAL;DESTRUCTOR DONE ;
VIRTUAL;END ;KEYSPEC =RECORD KEYPOS :WORD ;KEYLEN :WORD ;KEYFLAGS :WORD ;KEYCOUNT :LONGINT ;KEYTYPE :BYTE ;
NULLVALUE :BYTE ;RESERVED :ARRAY [ 1 .. 4 ] OF BYTE ;END ;KEYSPECARRAY =ARRAY [ 1 .. MAXSEGMENTS ] OF KEYSPEC ;
KEYDEF =RECORD KEYPOS :WORD ;KEYLEN :WORD ;KEYFLAGS :WORD ;KEYTYPE :BYTE ;NULLVALUE :BYTE ;JUSTIFY :BYTE ;END ;
KEYDEFARRAY =ARRAY [ 1 .. MAXSEGMENTS ] OF KEYDEF ;FILESPEC =RECORD RECORDLEN :WORD ;PAGESIZE :WORD ;INDEXES :WORD ;
RECORDS :LONGINT ;FILEFLAGS :WORD ;RESERVED :ARRAY [ 1 .. 2 ] OF BYTE ;FREEPAGES :WORD ;KEYBUFF :KEYSPECARRAY ;
EXTRA :ARRAY [ 1 .. 265 ] OF BYTE ;END ;PERRORDISPLAY =^ERRORDISPLAY ;ERRORDISPLAY =OBJECT CONSTRUCTOR INIT ;
FUNCTION DISPLAY (ERROR :INTEGER ;ERRORMSG :STRING ;OPCODE :INTEGER ;OPCODEMSG :STRING ;
FILENAME :PATHSTR ):ERRORACTION ;VIRTUAL;DESTRUCTOR DONE ;VIRTUAL;END ;PERRORHANDLER =^ERRORHANDLER ;
ERRORHANDLER =OBJECT RETRYCOUNT :WORD ;MAXRETRY :WORD ;RETRYDELAY :WORD ;TRAPPEDERRORS :ERRORSET ;
ERRDISPLAY :PERRORDISPLAY ;ERRORSON :BOOLEAN ;CONSTRUCTOR INIT (DISPLAYOBJECT :PERRORDISPLAY );FUNCTION ERRORDISPACTHER
(ERRORCODE :INTEGER ;OPCODE :INTEGER ;FILENAME :PATHSTR ):ERRORACTION ;VIRTUAL;FUNCTION ERROR (STATUS :INTEGER ;
OPCODE :INTEGER ;FILENAME :PATHSTR ):BOOLEAN ;VIRTUAL;PROCEDURE SETMAXRETRY (RETRY :WORD );FUNCTION GETMAXRETRY :WORD ;
PROCEDURE CLEARRETRY ;PROCEDURE SETDELAY (SECONDS :WORD );FUNCTION GETDELAY :WORD ;PROCEDURE ADDERRORS
(ERRORCODES :ERRORSET );PROCEDURE REMOVEERRORS (ERRORCODES :ERRORSET );PROCEDURE SETERRORS (ERRORCODES :ERRORSET );
PROCEDURE GETERRORS (VAR ERRORCODES :ERRORSET );PROCEDURE ERRORSONOFF (STATE :BOOLEAN );FUNCTION ERRORMSG
(ERRORCODE :INTEGER ):STRING ;VIRTUAL;FUNCTION OPMSG (OPCODE :INTEGER ):STRING ;VIRTUAL;DESTRUCTOR DONE ;VIRTUAL;END ;
PDEFERRORHANDLER =^DEFERRORHANDLER ;DEFERRORHANDLER =OBJECT (ERRORHANDLER)FUNCTION ERRORMSG (ERRORCODE :INTEGER ):STRING
;VIRTUAL;FUNCTION OPMSG (OPCODE :INTEGER ):STRING ;VIRTUAL;END ;PDISKERRORHANDLER =^DISKERRORHANDLER ;
DISKERRORHANDLER =OBJECT (ERRORHANDLER)POSBLOCK :ARRAY [ 1 .. POSBLOCKSIZE ] OF BYTE ;FILEOPEN :BOOLEAN ;
CONSTRUCTOR INIT (DISPLAYOBJECT :PERRORDISPLAY ;ERRORPATH :PATHSTR );DESTRUCTOR DONE ;VIRTUAL;FUNCTION ERRORMSG
(ERRORCODE :INTEGER ):STRING ;VIRTUAL;FUNCTION OPMSG (OPCODE :INTEGER ):STRING ;VIRTUAL;END ;
BTRIEVEMSGREC =RECORD TYPEID :INTEGER ;CODE :INTEGER ;NAME :ARRAY [ 0 .. 80 ] OF CHAR ;MSGTEXT :ARRAY [ 0 .. 900 ]
OF CHAR ;END ;PBTRIEVEFILE =^BTRIEVEFILE ;BTRIEVEFILE =OBJECT PATH :PATHSTR ;ALTPATH :PATHSTR ;DATA :POINTER ;
DATASIZE :WORD ;ALLOCATEDATA :BOOLEAN ;ALLOCATEKEY :BOOLEAN ;BYTESREAD :WORD ;BYTESTOWRITE :WORD ;KEY :POINTER ;
KEYSIZE :BYTE ;SEGMENTCNT :BYTE ;CURINDEX :WORD ;INDEXCNT :BYTE ;STATUS :INTEGER ;FILEOPEN :BOOLEAN ;
ERRHANDLER :PERRORHANDLER ;KEYLIST :KEYDEFARRAY ;KEYSTART :ARRAY [ 0 .. MAXSEGMENTS - 1 ] OF BYTE ;POSBLOCK :ARRAY [ 1
.. POSBLOCKSIZE ] OF BYTE ;VARIABLELEN :BOOLEAN ;SISEGMENTS :BYTE ;READKEYDEFS :BOOLEAN ;CURRENTKEYSIZE :BYTE ;
FILLVALUE :BYTE ;CONSTRUCTOR INIT (FILEPATH :PATHSTR ;ERROROBJECT :PERRORHANDLER ;DATABUF :POINTER ;DATABUFSIZE :WORD );
DESTRUCTOR DONE ;VIRTUAL;PROCEDURE ABORTTRANSACTION ;PROCEDURE ADDALTSEQUENCE (ALTSEQPATH :PATHSTR );PROCEDURE ADDERRORS
(ERRORCODES :ERRORSET );PROCEDURE ADDSUPPLKEYSEGMENT (POSITION :WORD ;SIZE :WORD ;FLAGS :WORD ;KEYTYPE :BYTE ;
NULLVALUE :BYTE ;JUSTIFY :BYTE );PROCEDURE ADDKEYBUFFER (KEYBUF :POINTER ;KEYBUFSIZE :BYTE );PROCEDURE ADDKEYSEGMENT
(POSITION :WORD ;SIZE :WORD ;FLAGS :WORD ;KEYTYPE :BYTE ;NULLVALUE :BYTE ;JUSTIFY :BYTE );FUNCTION BRESULT :INTEGER ;
PROCEDURE CHANGEBUFFERSIZE (SIZE :WORD );PROCEDURE CLEARBUFFER ;PROCEDURE CLEARKEY ;PROCEDURE CLEAROWNER ;
PROCEDURE CLONE (NEWFILEPATH :PATHSTR ;MODE :INTEGER );PROCEDURE CLOSE ;FUNCTION COPY (OUTFILE :PBTRIEVEFILE ;
DISPLAYOBJ :PPROGRESS ):INTEGER ;PROCEDURE CREATE (FLAGS :WORD ;RECORDSIZE :WORD ;PAGESIZE :WORD ;PAGES :WORD ;
MODE :INTEGER );PROCEDURE CREATEINDEX ;PROCEDURE DELETE ;PROCEDURE DROPINDEX (INDEX :INTEGER );PROCEDURE ENDTRANSACTION ;
FUNCTION ERROR (ERRSTATUS :INTEGER ;OPCODE :INTEGER ;FILENAME :PATHSTR ):BOOLEAN ;PROCEDURE ERRORSONOFF
(STATE :BOOLEAN );PROCEDURE FILLKEYBUFFER (VAR BUFF ;SIZE :BYTE );PROCEDURE GET (OP :INTEGER ;LOCK :WORD );
PROCEDURE GETDIRECT (LOCK :WORD ;POSITION :LONGINT );PROCEDURE GETERRORS (VAR ERRORCODES :ERRORSET );
FUNCTION GETFILLVALUE :BYTE ;FUNCTION GETPOSITION :LONGINT ;PROCEDURE INSERT ;FUNCTION ISOPEN :BOOLEAN ;FUNCTION LOAD
(INPUTFILEPATH :PATHSTR ;DISPLAYOBJ :PPROGRESS ):INTEGER ;PROCEDURE MAKEKEY (V1 :POINTER ;V2 :POINTER ;V3 :POINTER ;
V4 :POINTER ;V5 :POINTER ;V6 :POINTER );VIRTUAL;FUNCTION NUMBEROFRECORDS :LONGINT ;PROCEDURE OPEN (MODE :INTEGER ;
OWNER :STRING );FUNCTION RECOVER (NEWFILEPATH :PATHSTR ;DISPLAYOBJ :PPROGRESS ):INTEGER ;PROCEDURE REMOVEERRORS
(ERRORCODES :ERRORSET );PROCEDURE RESET ;PROCEDURE RESETSTATION (CONNECTION :WORD );FUNCTION SAVE (NEWFILEPATH :PATHSTR ;
DISPLAYOBJ :PPROGRESS ):INTEGER ;PROCEDURE SETERRORS (ERRORCODES :ERRORSET );PROCEDURE SETFILLVALUE (VALUE :BYTE );
PROCEDURE SETKEYPATH (NUMBER :WORD );PROCEDURE SETOUTPUTSIZE (SIZE :WORD );PROCEDURE SETOWNER (OWNER :STRING ;
MODE :INTEGER );PROCEDURE STARTTRANSACTION (LOCK :WORD );PROCEDURE STAT (VAR FDATA :FILESPEC );PROCEDURE UPDATE ;
PROCEDURE UNLOAD ;PROCEDURE UNLOCKALL (LOCK :WORD );PROCEDURE VERSION (VAR VER :WORD ;VAR REV :WORD ;VAR OSFLAG :CHAR );
PRIVATE PROCEDURE FIXKEYSTRINGS ;PROCEDURE JUSTIFYSTRING (BUFF :PBYTES ;SIZE :BYTE ;KEYTYPE :BYTE ;JUSTIFY :BYTE );END ;
PROCEDURE CHECKFORBTRIEVE ;PROCEDURE GETBTRIEVEVERSION (VAR VER :WORD ;VAR REV :WORD ;VAR OSFLAG :CHAR );
PROCEDURE UNLOADBTRIEVE ;IMPLEMENTATION PROCEDURE OI1I11I01OO (VAR OO1O:STRING ;OIO0O1I11lO:BYTE);
VAR OOlIllI1Ol0O:BYTE ABSOLUTE OO1O;BEGIN IF (OOlIllI1Ol0O < OIO0O1I11lO )THEN BEGIN FILLCHAR (OO1O [ OOlIllI1Ol0O + 1 ]
, OIO0O1I11lO - OOlIllI1Ol0O , ' ');OOlIllI1Ol0O := OIO0O1I11lO ;END ;END ;PROCEDURE O1Ill101O1 (VAR OO1O:STRING ;
OIO0O1I11lO:BYTE);VAR OOlIllI1Ol0O:BYTE ABSOLUTE OO1O;OOIO:BYTE;BEGIN IF (OOlIllI1Ol0O < OIO0O1I11lO )THEN BEGIN OOIO :=
OIO0O1I11lO - OOlIllI1Ol0O ;MOVE (OO1O [ 1 ] , OO1O [ OOIO + 1 ] , OOlIllI1Ol0O );FILLCHAR (OO1O [ 1 ] , OOIO , ' ');
OOlIllI1Ol0O := OIO0O1I11lO ;END ;END ;PROCEDURE OI10OIO00IOO (VAR OO1O:STRING );VAR OIlO:WORD;
OOlIllI1Ol0O:BYTE ABSOLUTE OO1O;BEGIN WHILE (OOlIllI1Ol0O > 0 )AND (OO1O [ OOlIllI1Ol0O ] <= ' ') DO DEC (OOlIllI1Ol0O );
OIlO := 1 ;WHILE (OIlO <= OOlIllI1Ol0O )AND (OO1O [ OIlO ] <= ' ') DO INC (OIlO );IF (OIlO > 1 )THEN BEGIN OOlIllI1Ol0O
:= OOlIllI1Ol0O - OIlO + 1 ;MOVE (OO1O [ OIlO ] , OO1O [ 1 ] , OOlIllI1Ol0O );END ;END ;CONSTRUCTOR BTRIEVEFILE.INIT
(FILEPATH:PATHSTR;ERROROBJECT:PERRORHANDLER;DATABUF:POINTER;DATABUFSIZE:WORD);BEGIN PATH := FILEPATH ;ALTPATH := '';DATA
:= DATABUF ;ALLOCATEDATA := (DATA =NIL );ALLOCATEKEY := TRUE ;IF ALLOCATEDATA THEN DATASIZE := 0 ELSE DATASIZE :=
DATABUFSIZE ;BYTESREAD := 0 ;BYTESTOWRITE := 0 ;KEY := NIL ;KEYSIZE := 0 ;CURRENTKEYSIZE := 0 ;SEGMENTCNT := 0 ;
SISEGMENTS := 0 ;INDEXCNT := 0 ;STATUS := BOKAY ;FILEOPEN := FALSE ;ERRHANDLER := ERROROBJECT ;CURINDEX := 0 ;
READKEYDEFS := TRUE ;FILLVALUE := 0 ;FILLCHAR (KEYLIST , SIZEOF (KEYLIST ), 0 );FILLCHAR (KEYSTART , SIZEOF (KEYSTART ),
0 );FILLCHAR (POSBLOCK , SIZEOF (POSBLOCK ), 0 );END ;PROCEDURE BTRIEVEFILE.SETKEYPATH (NUMBER:WORD);BEGIN IF (NUMBER <
INDEXCNT )THEN CURINDEX := NUMBER ;END ;PROCEDURE BTRIEVEFILE.ADDALTSEQUENCE (ALTSEQPATH:PATHSTR);BEGIN ALTPATH :=
ALTSEQPATH ;END ;PROCEDURE BTRIEVEFILE.ADDKEYSEGMENT (POSITION:WORD;SIZE:WORD;FLAGS:WORD;KEYTYPE:BYTE;NULLVALUE:BYTE;
JUSTIFY:BYTE);BEGIN READKEYDEFS := FALSE ;IF (SEGMENTCNT < MAXSEGMENTS )THEN BEGIN CURRENTKEYSIZE := CURRENTKEYSIZE +
SIZE ;INC (SEGMENTCNT );IF (KEYSTART [ INDEXCNT ] =0 )THEN KEYSTART [ INDEXCNT ] := SEGMENTCNT ;KEYLIST [ SEGMENTCNT ] .
KEYPOS := POSITION ;KEYLIST [ SEGMENTCNT ] . KEYLEN := SIZE ;KEYLIST [ SEGMENTCNT ] . KEYFLAGS := FLAGS ;KEYLIST [
SEGMENTCNT ] . KEYTYPE := KEYTYPE ;KEYLIST [ SEGMENTCNT ] . NULLVALUE := NULLVALUE ;KEYLIST [ SEGMENTCNT ] . JUSTIFY :=
JUSTIFY ;IF (FLAGS AND BSEGMENTED =0 )THEN BEGIN INC (INDEXCNT );IF (CURRENTKEYSIZE > KEYSIZE )THEN KEYSIZE :=
CURRENTKEYSIZE ;CURRENTKEYSIZE := 0 ;END ;END ;END ;PROCEDURE BTRIEVEFILE.SETFILLVALUE (VALUE:BYTE);BEGIN FILLVALUE :=
VALUE ;END ;FUNCTION BTRIEVEFILE.GETFILLVALUE :BYTE ;BEGIN GETFILLVALUE := FILLVALUE ;END ;
PROCEDURE BTRIEVEFILE.ADDKEYBUFFER (KEYBUF:POINTER;KEYBUFSIZE:BYTE);BEGIN IF ALLOCATEKEY AND (KEY <> NIL )THEN FREEMEM
(KEY , KEYSIZE );ALLOCATEKEY := FALSE ;READKEYDEFS := FALSE ;KEY := KEYBUF ;KEYSIZE := KEYBUFSIZE ;END ;
PROCEDURE BTRIEVEFILE.OPEN (MODE:INTEGER;OWNER:STRING );VAR OIlO,OIll:BYTE;O1010OOllllOl:WORD;OOlIlOl0l100:ARRAY [ 0 .. 8
] OF CHAR;OIlIl0O0010:ARRAY [ 0 .. 80 ] OF CHAR;OI1II1O1OO0l:FILESPEC;BEGIN IF NOT FILEOPEN THEN BEGIN MOVE (PATH [ 1 ]
, OIlIl0O0010 [ 0 ] , LENGTH (PATH ));OIlIl0O0010 [ LENGTH (PATH )] := #0;OI10OIO00IOO (OWNER );O1010OOllllOl := 0 ;IF
(OWNER <> '')THEN BEGIN O1010OOllllOl := LENGTH (OWNER );IF (O1010OOllllOl > 8 )THEN O1010OOllllOl := 8 ;MOVE (OWNER [ 1
] , OOlIlOl0l100 [ 0 ] , O1010OOllllOl );OOlIlOl0l100 [ O1010OOllllOl ] := #0;INC (O1010OOllllOl );END ;REPEAT
{$IFDEF MSDOS} STATUS := BTRV (BOPEN , POSBLOCK , OOlIlOl0l100 , O1010OOllllOl , OIlIl0O0010 , MODE );{$ELSE} STATUS :=
BTRV (BOPEN , POSBLOCK , OOlIlOl0l100 , O1010OOllllOl , OIlIl0O0010 , LENGTH (PATH )+ 1 , MODE );{$ENDIF} UNTIL (NOT
ERROR (STATUS , BOPEN , PATH ));FILEOPEN := (STATUS =BOKAY );IF FILEOPEN THEN BEGIN FILLCHAR (OI1II1O1OO0l , SIZEOF
(OI1II1O1OO0l ), 0 );STAT (OI1II1O1OO0l );IF (STATUS =BOKAY )THEN BEGIN INDEXCNT := OI1II1O1OO0l.INDEXES ;VARIABLELEN :=
((OI1II1O1OO0l.FILEFLAGS AND BVARIABLELEN )<> 0 );BYTESTOWRITE := OI1II1O1OO0l.RECORDLEN ;IF READKEYDEFS THEN
BEGIN SEGMENTCNT := 0 ;FOR OIlO := 0 TO INDEXCNT - 1 DO BEGIN KEYSTART [ OIlO ] := SEGMENTCNT + 1 ;REPEAT INC
(SEGMENTCNT );CURRENTKEYSIZE := CURRENTKEYSIZE + OI1II1O1OO0l.KEYBUFF [ SEGMENTCNT ] . KEYLEN ;UNTIL
((OI1II1O1OO0l.KEYBUFF [ SEGMENTCNT ] . KEYFLAGS AND BSEGMENTED )=0 );IF (CURRENTKEYSIZE > KEYSIZE )THEN KEYSIZE :=
CURRENTKEYSIZE ;CURRENTKEYSIZE := 0 ;END ;FOR OIlO := 1 TO SEGMENTCNT DO BEGIN KEYLIST [ OIlO ] . KEYPOS :=
OI1II1O1OO0l.KEYBUFF [ OIlO ] . KEYPOS ;KEYLIST [ OIlO ] . KEYLEN := OI1II1O1OO0l.KEYBUFF [ OIlO ] . KEYLEN ;KEYLIST [
OIlO ] . KEYFLAGS := OI1II1O1OO0l.KEYBUFF [ OIlO ] . KEYFLAGS ;KEYLIST [ OIlO ] . KEYTYPE := OI1II1O1OO0l.KEYBUFF [ OIlO
] . KEYTYPE ;KEYLIST [ OIlO ] . NULLVALUE := OI1II1O1OO0l.KEYBUFF [ OIlO ] . NULLVALUE ;KEYLIST [ OIlO ] . JUSTIFY :=
BNORMAL ;END ;END ;IF ALLOCATEDATA THEN BEGIN IF VARIABLELEN THEN DATASIZE := MAXBUFFSIZE ELSE DATASIZE :=
OI1II1O1OO0l.RECORDLEN ;GETMEM (DATA , DATASIZE );CLEARBUFFER ;END ;IF ALLOCATEKEY THEN BEGIN GETMEM (KEY , KEYSIZE );
CLEARKEY ;CURRENTKEYSIZE := 0 ;END ;IF ((DATA =NIL )AND (DATASIZE > 0 ))OR ((KEY =NIL )AND (KEYSIZE > 0 ))THEN
BEGIN STATUS := BOUTOFMEMORY ;ERROR (STATUS , BOPEN , PATH );EXIT ;END ;END ;END ;END ;END ;PROCEDURE BTRIEVEFILE.CREATE
(FLAGS:WORD;RECORDSIZE:WORD;PAGESIZE:WORD;PAGES:WORD;MODE:INTEGER);VAR OIlO:INTEGER;O1lO01OlI1lO:WORD;OI111IlIO100:ARRAY
[ 0 .. 80 ] OF CHAR;OOlO0IO0I1OI:FILESPEC;OIOI100IlI0:ARRAY [ 1 .. 1024 ] OF BYTE ABSOLUTE OOlO0IO0I1OI;
O1lI1lO0O011:FILE ;BEGIN FILLCHAR (OOlO0IO0I1OI , SIZEOF (OOlO0IO0I1OI ), 0 );OOlO0IO0I1OI.RECORDLEN := RECORDSIZE ;
OOlO0IO0I1OI.PAGESIZE := PAGESIZE ;OOlO0IO0I1OI.INDEXES := INDEXCNT ;OOlO0IO0I1OI.FILEFLAGS := FLAGS ;
OOlO0IO0I1OI.FREEPAGES := PAGES ;FOR OIlO := 1 TO SEGMENTCNT DO BEGIN OOlO0IO0I1OI.KEYBUFF [ OIlO ] . KEYPOS := KEYLIST
[ OIlO ] . KEYPOS ;OOlO0IO0I1OI.KEYBUFF [ OIlO ] . KEYLEN := KEYLIST [ OIlO ] . KEYLEN ;OOlO0IO0I1OI.KEYBUFF [ OIlO ] .
KEYFLAGS := KEYLIST [ OIlO ] . KEYFLAGS ;OOlO0IO0I1OI.KEYBUFF [ OIlO ] . KEYTYPE := KEYLIST [ OIlO ] . KEYTYPE ;
OOlO0IO0I1OI.KEYBUFF [ OIlO ] . NULLVALUE := KEYLIST [ OIlO ] . NULLVALUE ;END ;O1lO01OlI1lO := SEGMENTCNT * SIZEOF
(KEYSPEC )+ 16 ;{$I-} IF (ALTPATH <> '')THEN BEGIN SYSTEM.ASSIGN (O1lI1lO0O011 , ALTPATH );SYSTEM.RESET (O1lI1lO0O011 , 1
);IF (IORESULT =0 )THEN BEGIN SYSTEM.BLOCKREAD (O1lI1lO0O011 , OIOI100IlI0 [ O1lO01OlI1lO + 1 ] , 265 );SYSTEM.CLOSE
(O1lI1lO0O011 );O1lO01OlI1lO := O1lO01OlI1lO + 265 ;ALTPATH := '';OIlO := IORESULT ;END ;END ;{$I+} MOVE (PATH [ 1 ] ,
OI111IlIO100 [ 0 ] , LENGTH (PATH ));OI111IlIO100 [ LENGTH (PATH )] := CHR (0 );REPEAT {$IFDEF MSDOS} STATUS := BTRV
(BCREATE , POSBLOCK , OOlO0IO0I1OI , O1lO01OlI1lO , OI111IlIO100 , MODE );{$ELSE} STATUS := BTRV (BCREATE , POSBLOCK ,
OOlO0IO0I1OI , O1lO01OlI1lO , OI111IlIO100 , LENGTH (PATH )+ 1 , MODE );{$ENDIF} UNTIL (NOT ERROR (STATUS , BCREATE ,
PATH ));END ;FUNCTION BTRIEVEFILE.COPY (OUTFILE:PBTRIEVEFILE;DISPLAYOBJ:PPROGRESS):INTEGER ;VAR OOIO:BYTE;
OI1I01OI0Ol:LONGINT;O1l100llOIIl:BOOLEAN;OOlIlOO0OOOO:WORD;BEGIN IF NOT OUTFILE ^. ISOPEN THEN BEGIN OUTFILE ^. OPEN
(BACCELERATED , '');O1l100llOIIl := TRUE ;END ELSE O1l100llOIIl := FALSE ;{$IFNDEF BTRIEVE50} GET (BSTEPNEXT , BNOLOCK );
{$ELSE} GET (BSTEPFIRST , BNOLOCK );{$ENDIF} OOIO := 0 ;OI1I01OI0Ol := 0 ;WHILE (STATUS =BOKAY )AND (OUTFILE ^. BRESULT
=BOKAY ) DO BEGIN OOlIlOO0OOOO := BYTESREAD ;IF (OOlIlOO0OOOO > OUTFILE ^. DATASIZE )THEN OOlIlOO0OOOO := OUTFILE ^.
DATASIZE ;MOVE (DATA , OUTFILE ^. DATA , OOlIlOO0OOOO );OUTFILE ^. SETOUTPUTSIZE (OOlIlOO0OOOO );OUTFILE ^. INSERT ;INC
(OOIO );INC (OI1I01OI0Ol );IF (OOIO =10 )THEN BEGIN IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );
OOIO := 0 ;END ;GET (BSTEPNEXT , BNOLOCK );END ;IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );IF
(STATUS <> BEOF )THEN COPY := STATUS ELSE IF (OUTFILE ^. BRESULT <> BOKAY )THEN COPY := OUTFILE ^. BRESULT ELSE COPY := 0
;IF O1l100llOIIl THEN OUTFILE ^. CLOSE ;END ;FUNCTION BTRIEVEFILE.SAVE (NEWFILEPATH:PATHSTR;
DISPLAYOBJ:PPROGRESS):INTEGER ;VAR OOIO:BYTE;OIOl01I00IO:INTEGER;OI1I01OI0Ol:LONGINT;O11lIOII:STRING [ 6 ] ;
O1lII00000l1:FILE ;BEGIN IF (PATH =NEWFILEPATH )THEN BEGIN SAVE := BDUPLICATEFILENAME ;EXIT ;END ;{$I-} ASSIGN
(O1lII00000l1 , NEWFILEPATH );REWRITE (O1lII00000l1 , 1 );OIOl01I00IO := IORESULT ;GET (BGETFIRST , BNOLOCK );OOIO := 0 ;
OI1I01OI0Ol := 0 ;WHILE (STATUS <> BEOF )AND (OIOl01I00IO =0 ) DO BEGIN IF (STATUS =BOKAY )THEN BEGIN STR (BYTESREAD ,
O11lIOII );O11lIOII := O11lIOII + ',';BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , LENGTH (O11lIOII ));OIOl01I00IO :=
IORESULT ;IF (OIOl01I00IO =0 )THEN BEGIN BLOCKWRITE (O1lII00000l1 , DATA ^, BYTESREAD );OIOl01I00IO := IORESULT ;END ;IF
(OIOl01I00IO =0 )THEN BEGIN O11lIOII := #13#10;BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , 2 );OIOl01I00IO := IORESULT ;
INC (OI1I01OI0Ol );INC (OOIO );IF (OOIO =10 )THEN BEGIN IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );
OOIO := 0 ;END ;END ;END ;GET (BGETNEXT , BNOLOCK );END ;O11lIOII := #26;BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , 1 );
IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );IF (OIOl01I00IO =0 )THEN OIOl01I00IO := IORESULT ;IF
(STATUS <> BEOF )THEN SAVE := STATUS ELSE IF (OIOl01I00IO <> 0 )THEN SAVE := OIOl01I00IO ELSE SAVE := 0 ;SYSTEM.CLOSE
(O1lII00000l1 );{$I+} END ;FUNCTION BTRIEVEFILE.RECOVER (NEWFILEPATH:PATHSTR;DISPLAYOBJ:PPROGRESS):INTEGER ;
VAR OOIO:BYTE;OIOl01I00IO:INTEGER;OI1I01OI0Ol:LONGINT;O11lIOII:STRING [ 6 ] ;O1lII00000l1:FILE ;O10OIIlll00I1:LONGINT;
O101l00l1OllI:LONGINT;PROCEDURE OI11OlIIl00 (O11IlI1l:INTEGER);BEGIN WHILE (STATUS =BOKAY )AND (OIOl01I00IO =0
) DO BEGIN {$IFDEF BTRIEVE50} O101l00l1OllI := GETPOSITION ;IF (O101l00l1OllI =O10OIIlll00I1 )THEN EXIT ;{$ENDIF} STR
(BYTESREAD , O11lIOII );O11lIOII := O11lIOII + ',';BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , LENGTH (O11lIOII ));
OIOl01I00IO := IORESULT ;IF (OIOl01I00IO =0 )THEN BEGIN BLOCKWRITE (O1lII00000l1 , DATA ^, BYTESREAD );OIOl01I00IO :=
IORESULT ;END ;IF (OIOl01I00IO =0 )THEN BEGIN O11lIOII := #13#10;BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , 2 );
OIOl01I00IO := IORESULT ;INC (OI1I01OI0Ol );INC (OOIO );IF (OOIO =10 )THEN BEGIN IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ
^. DISPLAY (OI1I01OI0Ol );OOIO := 0 ;END ;END ;GET (O11IlI1l , BNOLOCK );END ;END ;BEGIN IF (PATH =NEWFILEPATH )THEN
BEGIN RECOVER := BDUPLICATEFILENAME ;EXIT ;END ;{$I-} ASSIGN (O1lII00000l1 , NEWFILEPATH );REWRITE (O1lII00000l1 , 1 );
OIOl01I00IO := IORESULT ;OOIO := 0 ;OI1I01OI0Ol := 0 ;{$IFNDEF BTRIEVE50} GET (BSTEPNEXT , BNOLOCK );OI11OlIIl00
(BSTEPNEXT );{$ELSE} O10OIIlll00I1 := 0 ;GET (BSTEPFIRST , BNOLOCK );OI11OlIIl00 (BSTEPNEXT );IF (STATUS <> BEOF )THEN
BEGIN O10OIIlll00I1 := O101l00l1OllI ;GET (BSTEPLAST , BNOLOCK );OI11OlIIl00 (BSTEPPREV );END ;{$ENDIF} O11lIOII := #26;
BLOCKWRITE (O1lII00000l1 , O11lIOII [ 1 ] , 1 );IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );IF
(OIOl01I00IO =0 )THEN OIOl01I00IO := IORESULT ;IF (STATUS <> BEOF )THEN RECOVER := STATUS ELSE IF (OIOl01I00IO <> 0 )THEN
RECOVER := OIOl01I00IO ELSE RECOVER := 0 ;SYSTEM.CLOSE (O1lII00000l1 );{$I+} END ;FUNCTION BTRIEVEFILE.LOAD
(INPUTFILEPATH:PATHSTR;DISPLAYOBJ:PPROGRESS):INTEGER ;VAR OOIO:BYTE;O10lIlll:CHAR;OIOl01I00IO:INTEGER;OI1OIIIl0lO1:WORD;
OI1I01OI0Ol:LONGINT;O11lIOII:STRING [ 5 ] ;OI110IOl00lO:FILE ;OOlO0IO0I1OI:POINTER;BEGIN GETMEM (OOlO0IO0I1OI , $FFF0 );
IF (OOlO0IO0I1OI =NIL )THEN BEGIN LOAD := BOUTOFMEMORY ;EXIT ;END ;{$I-} ASSIGN (OI110IOl00lO , INPUTFILEPATH );
SYSTEM.RESET (OI110IOl00lO , 1 );OIOl01I00IO := IORESULT ;OOIO := 0 ;OI1I01OI0Ol := 0 ;WHILE (STATUS =BOKAY )AND
(OIOl01I00IO =0 )AND NOT EOF (OI110IOl00lO ) DO BEGIN BLOCKREAD (OI110IOl00lO , O10lIlll , 1 );OIOl01I00IO := IORESULT ;
O11lIOII := '';WHILE (O10lIlll <> ',')AND (O10lIlll <> ' ')AND (O10lIlll <> #26)AND (OIOl01I00IO =0 ) DO BEGIN O11lIOII
:= O11lIOII + O10lIlll ;BLOCKREAD (OI110IOl00lO , O10lIlll , 1 );OIOl01I00IO := IORESULT ;END ;IF (OIOl01I00IO =0 )AND
(O10lIlll <> #26)THEN BEGIN VAL (O11lIOII , OI1OIIIl0lO1 , OIOl01I00IO );IF (OIOl01I00IO <> 0 )THEN BEGIN LOAD :=
BLOADINPUTERR ;EXIT ;END ELSE BEGIN BLOCKREAD (OI110IOl00lO , OOlO0IO0I1OI ^, OI1OIIIl0lO1 );OIOl01I00IO := IORESULT ;IF
(OIOl01I00IO =0 )THEN BEGIN BLOCKREAD (OI110IOl00lO , O11lIOII , 2 );OIOl01I00IO := IORESULT ;END ;IF NOT VARIABLELEN AND
(OI1OIIIl0lO1 > DATASIZE )THEN OI1OIIIl0lO1 := DATASIZE ;MOVE (OOlO0IO0I1OI ^, DATA ^, OI1OIIIl0lO1 );SETOUTPUTSIZE
(OI1OIIIl0lO1 );INSERT ;INC (OOIO );INC (OI1I01OI0Ol );IF (OOIO =10 )THEN BEGIN IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^.
DISPLAY (OI1I01OI0Ol );OOIO := 0 ;END ;END ;END ;END ;IF (DISPLAYOBJ <> NIL )THEN DISPLAYOBJ ^. DISPLAY (OI1I01OI0Ol );
IF (STATUS <> BOKAY )THEN LOAD := STATUS ELSE IF (OIOl01I00IO <> 0 )THEN LOAD := OIOl01I00IO ELSE LOAD := 0 ;
SYSTEM.CLOSE (OI110IOl00lO );{$I+} END ;PROCEDURE BTRIEVEFILE.CLONE (NEWFILEPATH:PATHSTR;MODE:INTEGER);
VAR OI111IlIO100:ARRAY [ 0 .. SIZEOF(PATHSTR)- 1 ] OF CHAR;OI1II1O1OO0l:FILESPEC;O10O0IO0lOllI:ARRAY [ 1 ..
POSBLOCKSIZE] OF BYTE;BEGIN IF (PATH =NEWFILEPATH )THEN BEGIN STATUS := BDUPLICATEFILENAME ;EXIT ;END ;STAT
(OI1II1O1OO0l );MOVE (NEWFILEPATH [ 1 ] , OI111IlIO100 [ 0 ] , LENGTH (NEWFILEPATH ));OI111IlIO100 [ LENGTH (NEWFILEPATH
)] := #0;REPEAT {$IFDEF MSDOS} STATUS := BTRV (BCREATE , O10O0IO0lOllI , OI1II1O1OO0l , BYTESREAD , OI111IlIO100 , MODE
);{$ELSE} STATUS := BTRV (BCREATE , O10O0IO0lOllI , OI1II1O1OO0l , BYTESREAD , OI111IlIO100 , LENGTH (NEWFILEPATH )+ 1 ,
MODE );{$ENDIF} UNTIL (NOT ERROR (STATUS , BCREATE , NEWFILEPATH ));END ;PROCEDURE BTRIEVEFILE.ADDSUPPLKEYSEGMENT
(POSITION:WORD;SIZE:WORD;FLAGS:WORD;KEYTYPE:BYTE;NULLVALUE:BYTE;JUSTIFY:BYTE);BEGIN IF (SEGMENTCNT + SISEGMENTS <
MAXSEGMENTS )THEN BEGIN CURRENTKEYSIZE := CURRENTKEYSIZE + SIZE ;INC (SISEGMENTS );IF (KEYSTART [ INDEXCNT ] =0 )THEN
KEYSTART [ INDEXCNT ] := SEGMENTCNT + 1 ;KEYLIST [ SEGMENTCNT + SISEGMENTS ] . KEYPOS := POSITION ;KEYLIST [ SEGMENTCNT +
SISEGMENTS ] . KEYLEN := SIZE ;KEYLIST [ SEGMENTCNT + SISEGMENTS ] . KEYFLAGS := FLAGS ;KEYLIST [ SEGMENTCNT + SISEGMENTS
] . KEYTYPE := KEYTYPE ;KEYLIST [ SEGMENTCNT + SISEGMENTS ] . NULLVALUE := NULLVALUE ;KEYLIST [ SEGMENTCNT + SISEGMENTS ]
. JUSTIFY := JUSTIFY ;END ;END ;PROCEDURE BTRIEVEFILE.CREATEINDEX ;VAR OIlO:INTEGER;O1lO01OlI1lO:WORD;
OOlO0IO0I1OI:KEYSPECARRAY;OIOI100IlI0:ARRAY [ 1 .. 1024 ] OF BYTE ABSOLUTE OOlO0IO0I1OI;O1lI1lO0O011:FILE ;
BEGIN FOR OIlO := 1 TO SISEGMENTS DO BEGIN OOlO0IO0I1OI [ OIlO ] . KEYPOS := KEYLIST [ OIlO + SEGMENTCNT ] . KEYPOS ;
OOlO0IO0I1OI [ OIlO ] . KEYLEN := KEYLIST [ OIlO + SEGMENTCNT ] . KEYLEN ;OOlO0IO0I1OI [ OIlO ] . KEYFLAGS := KEYLIST [
OIlO + SEGMENTCNT ] . KEYFLAGS ;OOlO0IO0I1OI [ OIlO ] . KEYTYPE := KEYLIST [ OIlO + SEGMENTCNT ] . KEYTYPE ;OOlO0IO0I1OI
[ OIlO ] . NULLVALUE := KEYLIST [ OIlO + SEGMENTCNT ] . NULLVALUE ;END ;O1lO01OlI1lO := SISEGMENTS * SIZEOF (KEYSPEC );
{$I-} IF (ALTPATH <> '')THEN BEGIN SYSTEM.ASSIGN (O1lI1lO0O011 , ALTPATH );SYSTEM.RESET (O1lI1lO0O011 , 1 );IF (IORESULT
=0 )THEN BEGIN SYSTEM.BLOCKREAD (O1lI1lO0O011 , OIOI100IlI0 [ O1lO01OlI1lO + 1 ] , 265 );SYSTEM.CLOSE (O1lI1lO0O011 );
O1lO01OlI1lO := O1lO01OlI1lO + 265 ;OIlO := IORESULT ;END ;END ;{$I+} REPEAT {$IFDEF MSDOS} STATUS := BTRV (BCREATEINDEX
, POSBLOCK , OOlO0IO0I1OI , O1lO01OlI1lO , OIlO , OIlO );{$ELSE} OIlO := 0 ;STATUS := BTRV (BCREATEINDEX , POSBLOCK ,
OOlO0IO0I1OI , O1lO01OlI1lO , OIlO , OIlO , OIlO );{$ENDIF} UNTIL (NOT ERROR (STATUS , BCREATEINDEX , PATH ));IF (STATUS
=BOKAY )THEN BEGIN INC (INDEXCNT );INC (SEGMENTCNT , SISEGMENTS );IF (CURRENTKEYSIZE > KEYSIZE )THEN BEGIN FREEMEM (KEY ,
KEYSIZE );KEYSIZE := CURRENTKEYSIZE ;CURRENTKEYSIZE := 0 ;GETMEM (KEY , KEYSIZE );IF ((KEY =NIL )AND (KEYSIZE > 0 ))THEN
BEGIN STATUS := BOUTOFMEMORY ;ERROR (STATUS , BCREATEINDEX , PATH );END ;END ;END ;END ;PROCEDURE BTRIEVEFILE.DROPINDEX
(INDEX:INTEGER);VAR OIlO:INTEGER;OOII:WORD;BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BDROPINDEX ,
POSBLOCK , OIlO , OOII , OIlO , INDEX );{$ELSE} STATUS := BTRV (BDROPINDEX , POSBLOCK , OIlO , OOII , OIlO , OIlO , INDEX
);{$ENDIF} UNTIL (NOT ERROR (STATUS , BDROPINDEX , PATH ));END ;PROCEDURE BTRIEVEFILE.CHANGEBUFFERSIZE (SIZE:WORD);
BEGIN IF (SIZE =DATASIZE )THEN EXIT ;IF (SIZE > MAXAVAIL )THEN SIZE := MAXAVAIL ;IF (DATA <> NIL )THEN FREEMEM (DATA ,
DATASIZE );DATASIZE := SIZE ;GETMEM (DATA , DATASIZE );IF ((DATA =NIL )AND (DATASIZE > 0 ))THEN BEGIN STATUS :=
BOUTOFMEMORY ;ERROR (STATUS , 0 , PATH );END ;END ;PROCEDURE BTRIEVEFILE.SETOWNER (OWNER:STRING ;MODE:INTEGER);
VAR O1010OOllllOl:WORD;OOlIlOl0l100:ARRAY [ 0 .. 8 ] OF CHAR;BEGIN OI10OIO00IOO (OWNER );IF (OWNER ='')THEN EXIT ;
O1010OOllllOl := LENGTH (OWNER );IF (O1010OOllllOl > 8 )THEN O1010OOllllOl := 8 ;MOVE (OWNER [ 1 ] , OOlIlOl0l100 [ 0 ] ,
O1010OOllllOl );OOlIlOl0l100 [ O1010OOllllOl ] := #0;INC (O1010OOllllOl );REPEAT {$IFDEF MSDOS} STATUS := BTRV (BSETOWNER
, POSBLOCK , OOlIlOl0l100 , O1010OOllllOl , OOlIlOl0l100 , MODE );{$ELSE} STATUS := BTRV (BSETOWNER , POSBLOCK ,
OOlIlOl0l100 , O1010OOllllOl , OOlIlOl0l100 , O1010OOllllOl , MODE );{$ENDIF} UNTIL (NOT ERROR (STATUS , BSETOWNER , PATH
));END ;PROCEDURE BTRIEVEFILE.CLEAROWNER ;VAR OIlO:INTEGER;OOII:WORD;BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS}
STATUS := BTRV (BCLEAROWNER , POSBLOCK , OIlO , OOII , OIlO , OIlO );{$ELSE} STATUS := BTRV (BCLEAROWNER , POSBLOCK ,
OIlO , OOII , OIlO , OIlO , OIlO );{$ENDIF} UNTIL (NOT ERROR (STATUS , BCLEAROWNER , PATH ));END ;
PROCEDURE BTRIEVEFILE.CLOSE ;VAR OIlO:INTEGER;OOII:WORD;BEGIN IF FILEOPEN THEN BEGIN REPEAT OIlO := 0 ;OOII := 0 ;
{$IFDEF MSDOS} STATUS := BTRV (BCLOSE , POSBLOCK , OIlO , OOII , OIlO , 0 );{$ELSE} STATUS := BTRV (BCLOSE , POSBLOCK ,
OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BCLOSE , PATH ));FILEOPEN := NOT (STATUS =BOKAY );
END ;END ;FUNCTION BTRIEVEFILE.ERROR (ERRSTATUS:INTEGER;OPCODE:INTEGER;FILENAME:PATHSTR):BOOLEAN ;BEGIN IF (ERRHANDLER <>
NIL )THEN ERROR := ERRHANDLER ^. ERROR (ERRSTATUS , OPCODE , FILENAME )ELSE ERROR := FALSE ;END ;
PROCEDURE BTRIEVEFILE.GET (OP:INTEGER;LOCK:WORD);BEGIN BYTESREAD := DATASIZE ;REPEAT {$IFDEF MSDOS} STATUS := BTRV (OP +
LOCK , POSBLOCK , DATA ^, BYTESREAD , KEY ^, CURINDEX );{$ELSE} STATUS := BTRV (OP + LOCK , POSBLOCK , DATA ^, BYTESREAD
, KEY ^, KEYSIZE , CURINDEX );{$ENDIF} UNTIL (NOT ERROR (STATUS , OP , PATH ));END ;PROCEDURE BTRIEVEFILE.GETDIRECT
(LOCK:WORD;POSITION:LONGINT);BEGIN BYTESREAD := DATASIZE ;MOVE (POSITION , DATA ^, 4 );REPEAT {$IFDEF MSDOS} STATUS :=
BTRV (BGETDIRECT + LOCK , POSBLOCK , DATA ^, BYTESREAD , KEY ^, CURINDEX );{$ELSE} STATUS := BTRV (BGETDIRECT + LOCK ,
POSBLOCK , DATA ^, BYTESREAD , KEY ^, KEYSIZE , CURINDEX );{$ENDIF} UNTIL (NOT ERROR (STATUS , BGETDIRECT , PATH ));
END ;PROCEDURE BTRIEVEFILE.INSERT ;BEGIN FIXKEYSTRINGS ;REPEAT {$IFDEF MSDOS} STATUS := BTRV (BINSERT , POSBLOCK , DATA
^, BYTESTOWRITE , KEY ^, CURINDEX );{$ELSE} STATUS := BTRV (BINSERT , POSBLOCK , DATA ^, BYTESTOWRITE , KEY ^, KEYSIZE ,
CURINDEX );{$ENDIF} UNTIL (NOT ERROR (STATUS , BINSERT , PATH ));END ;PROCEDURE BTRIEVEFILE.UPDATE ;BEGIN FIXKEYSTRINGS ;
REPEAT {$IFDEF MSDOS} STATUS := BTRV (BUPDATE , POSBLOCK , DATA ^, BYTESTOWRITE , KEY ^, CURINDEX );{$ELSE} STATUS :=
BTRV (BUPDATE , POSBLOCK , DATA ^, BYTESTOWRITE , KEY ^, KEYSIZE , CURINDEX );{$ENDIF} UNTIL (NOT ERROR (STATUS , BUPDATE
, PATH ));END ;PROCEDURE BTRIEVEFILE.DELETE ;VAR OIlO:INTEGER;BEGIN BYTESREAD := DATASIZE ;REPEAT OIlO := 0 ;
{$IFDEF MSDOS} STATUS := BTRV (BDELETE , POSBLOCK , OIlO , BYTESREAD , OIlO , 0 );{$ELSE} STATUS := BTRV (BDELETE ,
POSBLOCK , DATA ^, BYTESREAD , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BDELETE , PATH ));BYTESREAD := 0 ;
END ;FUNCTION BTRIEVEFILE.GETPOSITION :LONGINT ;VAR OIlO:INTEGER;OIOllI0O1OI:LONGINT;O1lO01OlI1lO:WORD;
BEGIN O1lO01OlI1lO := 4 ;REPEAT OIlO := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BGETPOSITION , POSBLOCK , OIOllI0O1OI ,
O1lO01OlI1lO , OIlO , 0 );{$ELSE} STATUS := BTRV (BGETPOSITION , POSBLOCK , OIOllI0O1OI , O1lO01OlI1lO , OIlO , OIlO , 0
);{$ENDIF} UNTIL (NOT ERROR (STATUS , BGETPOSITION , PATH ));IF (STATUS =BOKAY )THEN GETPOSITION := OIOllI0O1OI ELSE
GETPOSITION := - 1 ;END ;PROCEDURE BTRIEVEFILE.UNLOCKALL (LOCK:WORD);VAR OIlO:INTEGER;OOII:WORD;OI1IO1Ol101O:INTEGER;
BEGIN IF (LOCK <= BSINGLENOWAIT )THEN OI1IO1Ol101O := 1 ELSE OI1IO1Ol101O := - 2 ;REPEAT OIlO := 0 ;OOII := 0 ;
{$IFDEF MSDOS} STATUS := BTRV (BUNLOCK , POSBLOCK , OIlO , OOII , OIlO , OI1IO1Ol101O );{$ELSE} STATUS := BTRV (BUNLOCK ,
POSBLOCK , OIlO , OOII , OIlO , OIlO , OI1IO1Ol101O );{$ENDIF} UNTIL (NOT ERROR (STATUS , BUNLOCK , PATH ));END ;
PROCEDURE BTRIEVEFILE.ADDERRORS (ERRORCODES:ERRORSET);BEGIN IF (ERRHANDLER <> NIL )THEN ERRHANDLER ^. ADDERRORS
(ERRORCODES );END ;PROCEDURE BTRIEVEFILE.REMOVEERRORS (ERRORCODES:ERRORSET);BEGIN IF (ERRHANDLER <> NIL )THEN ERRHANDLER
^. REMOVEERRORS (ERRORCODES );END ;PROCEDURE BTRIEVEFILE.SETERRORS (ERRORCODES:ERRORSET);BEGIN IF (ERRHANDLER <> NIL
)THEN ERRHANDLER ^. SETERRORS (ERRORCODES );END ;PROCEDURE BTRIEVEFILE.GETERRORS (VAR ERRORCODES:ERRORSET);BEGIN IF
(ERRHANDLER <> NIL )THEN ERRHANDLER ^. GETERRORS (ERRORCODES )ELSE ERRORCODES := [ ] ;END ;
PROCEDURE BTRIEVEFILE.ERRORSONOFF (STATE:BOOLEAN);BEGIN IF (ERRHANDLER <> NIL )THEN ERRHANDLER ^. ERRORSONOFF (STATE );
END ;PROCEDURE BTRIEVEFILE.CLEARBUFFER ;BEGIN IF (DATA <> NIL )THEN FILLCHAR (DATA ^, DATASIZE , FILLVALUE );BYTESREAD :=
0 ;END ;PROCEDURE BTRIEVEFILE.SETOUTPUTSIZE (SIZE:WORD);BEGIN BYTESTOWRITE := SIZE ;END ;PROCEDURE BTRIEVEFILE.CLEARKEY ;
BEGIN IF (KEY <> NIL )THEN FILLCHAR (KEY ^, KEYSIZE , FILLVALUE );END ;PROCEDURE BTRIEVEFILE.FILLKEYBUFFER (VAR BUFF;
SIZE:BYTE);BEGIN IF (SIZE > KEYSIZE )THEN SIZE := KEYSIZE ;CLEARKEY ;MOVE (BUFF , KEY ^, SIZE );END ;
PROCEDURE BTRIEVEFILE.MAKEKEY (V1:POINTER;V2:POINTER;V3:POINTER;V4:POINTER;V5:POINTER;V6:POINTER);
VAR O100lll01I0IO:POINTER;OI0l1l010OIO:BYTE;O10OIIll10l01:BYTE;O1OO1lIO1OO1:BYTE;O1Ol1IO01O11:WORD;O11lIOII:STRING ;
OOIO:BYTE;BEGIN CLEARKEY ;O10OIIll10l01 := 1 ;OI0l1l010OIO := 1 ;O1OO1lIO1OO1 := KEYSTART [ CURINDEX ] ;REPEAT
CASE OI0l1l010OIO OF 1 :O100lll01I0IO := V1 ;2 :O100lll01I0IO := V2 ;3 :O100lll01I0IO := V3 ;4 :O100lll01I0IO := V4 ;5
:O100lll01I0IO := V5 ;6 :O100lll01I0IO := V6 ;END ;MOVE (O100lll01I0IO ^, PBYTES (KEY )^[ O10OIIll10l01 ] , KEYLIST [
O1OO1lIO1OO1 ] . KEYLEN );CASE KEYLIST [ O1OO1lIO1OO1 ] . KEYTYPE OF BSTRING , BZSTRING , BLSTRING :BEGIN CASE KEYLIST [
O1OO1lIO1OO1 ] . JUSTIFY OF BRJUSTIFY , BLJUSTIFY :BEGIN JUSTIFYSTRING (@ (PBYTES (KEY )^[ O10OIIll10l01 ] ), KEYLIST [
O1OO1lIO1OO1 ] . KEYLEN , KEYLIST [ O1OO1lIO1OO1 ] . KEYTYPE , KEYLIST [ O1OO1lIO1OO1 ] . JUSTIFY );END ;END ;END ;END ;
O1Ol1IO01O11 := KEYLIST [ O1OO1lIO1OO1 ] . KEYFLAGS AND BSEGMENTED ;O10OIIll10l01 := O10OIIll10l01 + KEYLIST [
O1OO1lIO1OO1 ] . KEYLEN ;INC (O1OO1lIO1OO1 );INC (OI0l1l010OIO );UNTIL (O1Ol1IO01O11 =0 );END ;
PROCEDURE BTRIEVEFILE.FIXKEYSTRINGS ;VAR OIlO:BYTE;BEGIN FOR OIlO := 1 TO SEGMENTCNT DO BEGIN CASE KEYLIST [ OIlO ] .
KEYTYPE OF BSTRING , BZSTRING , BLSTRING :BEGIN CASE KEYLIST [ OIlO ] . JUSTIFY OF BRJUSTIFY , BLJUSTIFY
:BEGIN JUSTIFYSTRING (@ (PBYTES (DATA )^[ KEYLIST [ OIlO ] . KEYPOS ] ), KEYLIST [ OIlO ] . KEYLEN , KEYLIST [ OIlO ] .
KEYTYPE , KEYLIST [ OIlO ] . JUSTIFY );END ;END ;END ;END ;END ;END ;PROCEDURE BTRIEVEFILE.JUSTIFYSTRING (BUFF:PBYTES;
SIZE:BYTE;KEYTYPE:BYTE;JUSTIFY:BYTE);VAR OIll:BYTE;OOIO:BYTE;OIO0O1I11lO:BYTE;O11lIOII:STRING ;BEGIN CASE KEYTYPE
OF BLSTRING :BEGIN MOVE (BUFF ^, O11lIOII [ 0 ] , SIZE );OIO0O1I11lO := SIZE - 1 ;END ;BZSTRING :BEGIN OOIO := 1 ;
WHILE (OOIO < SIZE )AND (BUFF ^[ OOIO ] <> 0 ) DO BEGIN O11lIOII [ OOIO ] := CHR (BUFF ^[ OOIO ] );INC (OOIO );END ;
O11lIOII [ 0 ] := CHR (OOIO - 1 );OIO0O1I11lO := SIZE - 1 ;END ;BSTRING :BEGIN OOIO := 0 ;WHILE (OOIO < SIZE )AND (BUFF
^[ OOIO + 1 ] > 31 ) DO BEGIN INC (OOIO );O11lIOII [ OOIO ] := CHR (BUFF ^[ OOIO ] );END ;O11lIOII [ 0 ] := CHR (OOIO );
OIO0O1I11lO := SIZE ;END ;END ;CASE JUSTIFY OF BRJUSTIFY :BEGIN OI10OIO00IOO (O11lIOII );O1Ill101O1 (O11lIOII ,
OIO0O1I11lO )END ;BLJUSTIFY :BEGIN OI10OIO00IOO (O11lIOII );OI1I11I01OO (O11lIOII , OIO0O1I11lO );END ;END ;CASE KEYTYPE
OF BLSTRING :BEGIN MOVE (O11lIOII [ 0 ] , BUFF ^, SIZE );END ;BZSTRING :BEGIN MOVE (O11lIOII [ 1 ] , BUFF ^, SIZE - 1 );
BUFF ^[ SIZE ] := 0 ;END ;BSTRING :BEGIN MOVE (O11lIOII [ 1 ] , BUFF ^, SIZE );END ;END ;END ;
FUNCTION BTRIEVEFILE.ISOPEN ;BEGIN ISOPEN := FILEOPEN ;END ;FUNCTION BTRIEVEFILE.NUMBEROFRECORDS :LONGINT ;
VAR O1lO01OlI1lO:WORD;O1l1O0010OO0:ARRAY [ 1 .. 1024 ] OF BYTE;OIOI100IlI0:FILESPEC ABSOLUTE O1l1O0010OO0;
OOIlIOOlOI11:ARRAY [ 1 .. 64 ] OF BYTE;BEGIN O1lO01OlI1lO := SIZEOF (O1l1O0010OO0 );REPEAT {$IFDEF MSDOS} STATUS := BTRV
(BSTAT , POSBLOCK , O1l1O0010OO0 , O1lO01OlI1lO , OOIlIOOlOI11 , 0 );{$ELSE} STATUS := BTRV (BSTAT , POSBLOCK ,
O1l1O0010OO0 , O1lO01OlI1lO , OOIlIOOlOI11 , 64 , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BSTAT , PATH ));IF (STATUS
=BOKAY )THEN NUMBEROFRECORDS := OIOI100IlI0.RECORDS ELSE NUMBEROFRECORDS := - 1 ;END ;FUNCTION BTRIEVEFILE.BRESULT
:INTEGER ;BEGIN BRESULT := STATUS ;END ;DESTRUCTOR BTRIEVEFILE.DONE ;BEGIN IF ALLOCATEKEY AND (KEY <> NIL )THEN FREEMEM
(KEY , KEYSIZE );IF ALLOCATEDATA AND (DATA <> NIL )THEN FREEMEM (DATA , DATASIZE );END ;
PROCEDURE BTRIEVEFILE.STARTTRANSACTION (LOCK:WORD);VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE]
OF BYTE;BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BBEGINTRANSACTION , OIlO , OIlO , OOII , OIlO
, 0 );{$ELSE} STATUS := BTRV (BBEGINTRANSACTION , O10O0IO0lOllI , OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT
ERROR (STATUS , BBEGINTRANSACTION + LOCK , PATH ));END ;PROCEDURE BTRIEVEFILE.ENDTRANSACTION ;VAR OIlO:INTEGER;
OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS :=
BTRV (BENDTRANSACTION , OIlO , OIlO , OOII , OIlO , 0 );{$ELSE} STATUS := BTRV (BENDTRANSACTION , O10O0IO0lOllI , OIlO ,
OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BENDTRANSACTION , PATH ));END ;
PROCEDURE BTRIEVEFILE.ABORTTRANSACTION ;VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;
BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BABORTTRANSACTION , OIlO , OIlO , OOII , OIlO , 0 );
{$ELSE} STATUS := BTRV (BABORTTRANSACTION , O10O0IO0lOllI , OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR
(STATUS , BABORTTRANSACTION , PATH ));END ;PROCEDURE BTRIEVEFILE.STAT (VAR FDATA:FILESPEC);VAR OI111IlIO100:ARRAY [ 1 ..
128 ] OF CHAR;BEGIN BYTESREAD := SIZEOF (FILESPEC );REPEAT {$IFDEF MSDOS} STATUS := BTRV (BSTAT , POSBLOCK , FDATA ,
BYTESREAD , OI111IlIO100 , 0 );{$ELSE} STATUS := BTRV (BSTAT , POSBLOCK , FDATA , BYTESREAD , OI111IlIO100 , 128 , 0 );
{$ENDIF} UNTIL (NOT ERROR (STATUS , BSTAT , PATH ));END ;PROCEDURE BTRIEVEFILE.VERSION (VAR VER:WORD;VAR REV:WORD;
VAR OSFLAG:CHAR);VAR OIlO:INTEGER;O1lO01OlI1lO:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;OOlIll0O0lll:ARRAY
[ 0 .. 19 ] OF BYTE;BEGIN O1lO01OlI1lO := SIZEOF (OOlIll0O0lll );REPEAT OIlO := 0 ;{$IFDEF MSDOS} STATUS := BTRV
(BVERSION , OIlO , OOlIll0O0lll , O1lO01OlI1lO , OIlO , 0 );{$ELSE} STATUS := BTRV (BVERSION , O10O0IO0lOllI ,
OOlIll0O0lll , O1lO01OlI1lO , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BVERSION , ''));MOVE (OOlIll0O0lll [
0 ] , VER , 2 );MOVE (OOlIll0O0lll [ 2 ] , REV , 2 );MOVE (OOlIll0O0lll [ 4 ] , OSFLAG , 1 );END ;
PROCEDURE BTRIEVEFILE.UNLOAD ;VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;BEGIN REPEAT
OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BSTOP , OIlO , OIlO , OOII , OIlO , 0 );{$ELSE} STATUS := BTRV
(BSTOP , O10O0IO0lOllI , OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BSTOP , ''));END ;
PROCEDURE BTRIEVEFILE.RESET ;VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;BEGIN REPEAT
OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BRESET , OIlO , OIlO , OOII , OIlO , 0 );{$ELSE} STATUS := BTRV
(BRESET , O10O0IO0lOllI , OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} UNTIL (NOT ERROR (STATUS , BSTOP , ''));END ;
PROCEDURE BTRIEVEFILE.RESETSTATION (CONNECTION:WORD);VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE]
OF BYTE;BEGIN REPEAT OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} STATUS := BTRV (BRESET , OIlO , OIlO , OOII , CONNECTION , - 1
);{$ELSE} STATUS := BTRV (BRESET , O10O0IO0lOllI , OIlO , OOII , CONNECTION , 2 , - 1 );{$ENDIF} UNTIL (NOT ERROR (STATUS
, BSTOP , ''));END ;CONSTRUCTOR ERRORHANDLER.INIT (DISPLAYOBJECT:PERRORDISPLAY);BEGIN RETRYCOUNT := 0 ;MAXRETRY := 5 ;
RETRYDELAY := 5000 ;ERRDISPLAY := DISPLAYOBJECT ;TRAPPEDERRORS := [ BINVALIDOP .. BLASTERROR ] - [ BEOF ] ;ERRORSON :=
TRUE ;END ;DESTRUCTOR ERRORHANDLER.DONE ;BEGIN END ;FUNCTION ERRORHANDLER.ERRORMSG (ERRORCODE:INTEGER):STRING ;
VAR OO1O:STRING [ 10 ] ;BEGIN STR (ERRORCODE , OO1O );ERRORMSG := 'Btrieve Error # '+ OO1O ;END ;
FUNCTION ERRORHANDLER.OPMSG (OPCODE:INTEGER):STRING ;VAR OO1O:STRING [ 10 ] ;BEGIN STR (OPCODE , OO1O );OPMSG :=
'Btrieve Operation # '+ OO1O ;END ;PROCEDURE ERRORHANDLER.SETMAXRETRY (RETRY:WORD);BEGIN MAXRETRY := RETRY ;END ;
FUNCTION ERRORHANDLER.GETMAXRETRY :WORD ;BEGIN GETMAXRETRY := MAXRETRY ;END ;PROCEDURE ERRORHANDLER.CLEARRETRY ;
BEGIN RETRYCOUNT := 0 ;END ;PROCEDURE ERRORHANDLER.SETDELAY (SECONDS:WORD);BEGIN RETRYDELAY := SECONDS * 1000 ;END ;
FUNCTION ERRORHANDLER.GETDELAY :WORD ;BEGIN GETDELAY := RETRYDELAY DIV 1000 ;END ;PROCEDURE ERRORHANDLER.ADDERRORS
(ERRORCODES:ERRORSET);BEGIN TRAPPEDERRORS := TRAPPEDERRORS + ERRORCODES ;END ;PROCEDURE ERRORHANDLER.REMOVEERRORS
(ERRORCODES:ERRORSET);BEGIN TRAPPEDERRORS := TRAPPEDERRORS - ERRORCODES ;END ;PROCEDURE ERRORHANDLER.SETERRORS
(ERRORCODES:ERRORSET);BEGIN TRAPPEDERRORS := ERRORCODES ;END ;PROCEDURE ERRORHANDLER.GETERRORS (VAR ERRORCODES:ERRORSET);
BEGIN ERRORCODES := TRAPPEDERRORS ;END ;PROCEDURE ERRORHANDLER.ERRORSONOFF (STATE:BOOLEAN);BEGIN ERRORSON := STATE ;
END ;FUNCTION ERRORHANDLER.ERRORDISPACTHER (ERRORCODE:INTEGER;OPCODE:INTEGER;FILENAME:PATHSTR):ERRORACTION ;
VAR OOllO01O1010:ERRORACTION;BEGIN IF (ERRDISPLAY <> NIL )THEN BEGIN OOllO01O1010 := ERRDISPLAY ^. DISPLAY (ERRORCODE ,
ERRORMSG (ERRORCODE ), OPCODE , OPMSG (OPCODE ), FILENAME );IF (OOllO01O1010 =ERABORT )THEN {$IFDEF WINDOWS}
POSTQUITMESSAGE (999 );{$ELSE} HALT (ERRORCODE );{$ENDIF} END ELSE BEGIN OOllO01O1010 := ERDONE ;END ;CLEARRETRY ;
ERRORDISPACTHER := OOllO01O1010 ;END ;FUNCTION ERRORHANDLER.ERROR (STATUS:INTEGER;OPCODE:INTEGER;
FILENAME:PATHSTR):BOOLEAN ;{$IFDEF WINDOWS} VAR OI111O0100ll:LONGINT;OI1ll0l0011:TMSG;{$ENDIF} BEGIN IF ERRORSON AND
((STATUS > BLASTERROR )OR (STATUS IN TRAPPEDERRORS ))THEN BEGIN IF (STATUS =BRECORDINUSE )OR (STATUS =BFILEINUSE )THEN
BEGIN IF (RETRYCOUNT < MAXRETRY )THEN BEGIN INC (RETRYCOUNT );{$IFDEF WINDOWS} {$IFDEF __RANGE_ON} {$R-} {$ENDIF}
{$IFDEF __OVERFLOW_ON} {$Q-} {$ENDIF} OI111O0100ll := GETCURRENTTIME + LONGINT (RETRYDELAY );REPEAT PEEKMESSAGE
(OI1ll0l0011 , 0 , 0 , 0 , PM_NOREMOVE );UNTIL (OI111O0100ll >= GETCURRENTTIME );{$IFDEF __RANGE_ON} {$R+} {$ENDIF}
{$IFDEF __OVERFLOW_ON} {$Q+} {$ENDIF} {$ELSE} DELAY (RETRYDELAY );{$ENDIF} ERROR := TRUE ;END ELSE ERROR :=
(ERRORDISPACTHER (STATUS , OPCODE , FILENAME )=ERRETRY );END ELSE ERROR := (ERRORDISPACTHER (STATUS , OPCODE , FILENAME
)=ERRETRY );END ELSE BEGIN ERROR := FALSE ;CLEARRETRY ;END ;END ;FUNCTION DEFERRORHANDLER.ERRORMSG
(ERRORCODE:INTEGER):STRING ;BEGIN CASE ERRORCODE OF BOKAY :ERRORMSG := 'No error';BINVALIDOP :ERRORMSG :=
'Invalid operation';BIOERROR :ERRORMSG := 'I/O error';BFILENOTOPEN :ERRORMSG := 'File not open';BKEYNOTFOUND :ERRORMSG :=
'Key value not found';BDUPLICATEKEY :ERRORMSG := 'Duplicate keys not allowed';BINVALIDKEY :ERRORMSG :=
'Invalid key number';BDIFFERENTKEY :ERRORMSG := 'Different key number from previous read';BINVALIDPOS :ERRORMSG :=
'Invalid file positioning';BEOF :ERRORMSG := 'End of file';BKEYMODIFYERR :ERRORMSG := 'Key data may not be modified';
BINVALIDNAME :ERRORMSG := 'Invalid file name';BFILENOTFOUND :ERRORMSG := 'File not found';BPREIMAGEOPENERR :ERRORMSG :=
'Pre-Image file open error';BPREIMAGEIOERR :ERRORMSG := 'Pre-Image file I/O error';BEXPANSIONERR :ERRORMSG :=
'Expansion file error';BCLOSEERR :ERRORMSG := 'Close error';BDISKFULL :ERRORMSG := 'Disk full';BUNRECOVERABLEERR
:ERRORMSG := 'Unrecoverable error, File may be corrupt';BNOTLOADED :ERRORMSG := 'Btrieve is not loaded';BKEYBUFFERSHORT
:ERRORMSG := 'Key buffer too short';BDATABUFFERSHORT :ERRORMSG := 'Data buffer too short';BPOSBLOCKSHORT :ERRORMSG :=
'Position block is not 128 bytes in size';BPAGESIZEERR :ERRORMSG := 'Page size error';BCREATEIOERR :ERRORMSG :=
'File creation error';BNUMBERKEYS :ERRORMSG := 'Number of keys is invalid';BINVALIDKEYPOS :ERRORMSG :=
'Invalid key position';BRECORDLENERR :ERRORMSG := 'Invalid record length';BKEYLENERR :ERRORMSG := 'Invalid key length';
BNOTBTRIEVEFILE :ERRORMSG := 'File is not a Btrieve file';BTRANSACTIONERR :ERRORMSG := '/T option was not specified';
BTRANSACTIONACTIVE :ERRORMSG := 'A transaction is already active';BTRANSACTIONFILEERR :ERRORMSG :=
'Transaction control file I/O error';BTRANSACTIONENDERR :ERRORMSG := 'No begin transaction issued';BTRANSACTIONMAXFILES
:ERRORMSG := 'Maximum number of transaction files (12) exceeded';BOPNOTALLOWED :ERRORMSG := 'Operation not allowed';
BACCELERATEDERR :ERRORMSG := 'Incomplete accelerated access, File may be corrupt';BINVALIDADDRESS :ERRORMSG :=
'Invalid record address';BNULLKEYPATH :ERRORMSG := 'Null key path';BBADKEYFLAGS :ERRORMSG := 'Inconsistent key flags';
BFILEACCESSDENIED :ERRORMSG := 'Access to file denied';BMAXOPENFILES :ERRORMSG := 'Maximum number of files open';
BINVALIDALTSEQUENCE :ERRORMSG := 'Invalid alternate collating sequence definition';BKEYTYPEERR :ERRORMSG :=
'Key type error';BOWNERISSET :ERRORMSG := 'Owner is already set';BINVALIDOWNER :ERRORMSG := 'Invalid owner';
BCACHEWRITEERR :ERRORMSG := 'Error writing cache buffer';BINVALIDVERSION :ERRORMSG := 'Invalid Btrieve version';
BVARIABLEPAGEERR :ERRORMSG := 'Variable page error';BAUTOINCREMENTERR :ERRORMSG := 'Autoincrement key error';BBADINDEX
:ERRORMSG := 'A supplemental index is damaged';BEXPANDEDMEMORYERR :ERRORMSG := 'Expanded memory error';
BCOMPRESSBUFFSHORT :ERRORMSG := 'Compression buffer too short';BFILEEXISTS :ERRORMSG := 'File already exists';
{$IFDEF BTRIEVE50} BREJECTMAX :ERRORMSG := 'Reject count reached';BWORKSPACESHORT :ERRORMSG := 'Work space too small';
BDESCRIPTORERR :ERRORMSG := 'Incorrect descriptor';BEXTINSERTBUFFERR :ERRORMSG := 'Invalid extended insert buffer';
BFILTERLIMIT :ERRORMSG := 'Filter limit reached';BFIELDOFFSETERR :ERRORMSG := 'Incorrect field offset';{$ENDIF} BTTSABORT
:ERRORMSG := 'Automatic transaction abort';BDEADLOCK :ERRORMSG := 'Deadlock detected';BCONFLICT :ERRORMSG :=
'Record has been changed';BLOCKERR :ERRORMSG := 'File lock error';BLOSTPOSITION :ERRORMSG := 'File positioning lost';
BOUTOFTRANSACTION :ERRORMSG := 'Read outside of a transaction';BRECORDINUSE :ERRORMSG := 'Record in use';BFILEINUSE
:ERRORMSG := 'File in use';BFILETBLFULL :ERRORMSG := 'File table is full';BHANDLETBLFULL :ERRORMSG :=
'No file handles available';BBADMODEERR :ERRORMSG := 'Incompatible file open mode';BDEVICETABLEFULL :ERRORMSG :=
'Redirected device table full';BSERVERERR :ERRORMSG := 'Server error';BTRANTABLEFULL :ERRORMSG :=
'Transaction table full';BBADLOCKTYPE :ERRORMSG := 'Lock types are incompatible';BPERMISSIONERR :ERRORMSG :=
'Permission error';BSESSIONINVALID :ERRORMSG := 'Session no longer valid';BCOMMUNICATIONERR :ERRORMSG :=
'Communications environment error';BDATAMESSAGESHORT :ERRORMSG := 'Data message to small';BINTERNALTTSERR :ERRORMSG :=
'Internal TTS error';BOUTOFMEMORY :ERRORMSG := 'Application Low on Memory';BDUPLICATEFILENAME :ERRORMSG :=
'Duplicate filename error';BLOADINPUTERR :ERRORMSG := 'Input error on file load';ELSE ERRORMSG := 'Unknown error';END ;
END ;FUNCTION DEFERRORHANDLER.OPMSG (OPCODE:INTEGER):STRING ;BEGIN CASE OPCODE OF BOPEN :OPMSG := 'Open file';BCLOSE
:OPMSG := 'Close file';BINSERT :OPMSG := 'Insert new record';BUPDATE :OPMSG := 'Update existing record';BDELETE :OPMSG :=
'Delete record';BGETEQUAL :OPMSG := 'Read record equal to key';BGETGREAT :OPMSG := 'Read record greater than key';
BGETGREATEQUAL :OPMSG := 'Read record greater than or equal to key';BGETLESS :OPMSG := 'Read record less than key';
BGETLESSEQUAL :OPMSG := 'Read record less than or equal to key';BGETNEXT :OPMSG := 'Read next record';BGETPREV :OPMSG :=
'Read previous record';BGETFIRST :OPMSG := 'Read first record';BGETLAST :OPMSG := 'Read last record';BCREATE :OPMSG :=
'Create file';BSTAT :OPMSG := 'Get file statistics';BBEGINTRANSACTION :OPMSG := 'Begin transaction';BENDTRANSACTION
:OPMSG := 'End transaction';BABORTTRANSACTION :OPMSG := 'Abort transaction';BGETPOSITION :OPMSG := 'Get record position';
BGETDIRECT :OPMSG := 'Read record by position';BSTEPNEXT :OPMSG := 'Step to next record';BSTOP :OPMSG :=
'Unload record manager';BVERSION :OPMSG := 'Get version number';BUNLOCK :OPMSG := 'Unlock';BRESET :OPMSG :=
'Reset record manager';BSETOWNER :OPMSG := 'Set file owner';BCLEAROWNER :OPMSG := 'Clear file owner';BCREATEINDEX :OPMSG
:= 'Creating supplemental index';BDROPINDEX :OPMSG := 'Dropping supplemental index';{$IFDEF BTRIEVE50} BSTEPFIRST :OPMSG
:= 'Step to first record';BSTEPLAST :OPMSG := 'Step to last record';BSTEPPREV :OPMSG := 'Step to previous record';
BXGETNEXT :OPMSG := 'Extended read next record';BXGETPREV :OPMSG := 'Extneded read previous record';BXSTEPNEXT :OPMSG :=
'Extended step to next record';BXSTEPPREV :OPMSG := 'Extended step to previous record';BXINSERT :OPMSG :=
'Extended insert record';{$ENDIF} ELSE OPMSG := 'Unknown operation';END ;END ;CONSTRUCTOR DISKERRORHANDLER.INIT
(DISPLAYOBJECT:PERRORDISPLAY;ERRORPATH:PATHSTR);VAR OIlO:INTEGER;OOII:WORD;O10OOIlO1OIO1:INTEGER;OIlIl0O0010:ARRAY [ 0 ..
80 ] OF CHAR;BEGIN ERRORHANDLER.INIT (DISPLAYOBJECT );MOVE (ERRORPATH [ 1 ] , OIlIl0O0010 [ 0 ] , LENGTH (ERRORPATH ));
OIlIl0O0010 [ LENGTH (ERRORPATH )] := #0;OIlO := 0 ;OOII := 0 ;{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BOPEN , POSBLOCK ,
OIlO , OOII , OIlIl0O0010 , BREADONLY );{$ELSE} O10OOIlO1OIO1 := BTRV (BOPEN , POSBLOCK , OIlO , OOII , OIlIl0O0010 ,
LENGTH (ERRORPATH )+ 1 , BREADONLY );{$ENDIF} FILEOPEN := (O10OOIlO1OIO1 =BOKAY );END ;DESTRUCTOR DISKERRORHANDLER.DONE ;
VAR OIlO:INTEGER;OOII:WORD;O10OOIlO1OIO1:INTEGER;BEGIN ERRORHANDLER.DONE ;IF FILEOPEN THEN BEGIN OIlO := 0 ;OOII := 0 ;
{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BCLOSE , POSBLOCK , OIlO , OOII , OIlO , 0 );{$ELSE} O10OOIlO1OIO1 := BTRV (BCLOSE
, POSBLOCK , OIlO , OOII , OIlO , OIlO , 0 );{$ENDIF} FILEOPEN := NOT (O10OOIlO1OIO1 =BOKAY );END ;END ;
FUNCTION DISKERRORHANDLER.ERRORMSG (ERRORCODE:INTEGER):STRING ;VAR OOII:WORD;O10OOIlO1OIO1:INTEGER;OIOI100IlI0:STRING [
81 ] ;OI1II1O1l0l0:BTRIEVEMSGREC;OIlllI0OIOO:RECORD OIIO1OlIIIl:INTEGER;OI0ll01lOOOl:INTEGER;END ;BEGIN IF (ERRORCODE
=BNOTLOADED )THEN BEGIN ERRORMSG := 'Btrieve is not loaded';EXIT ;END ;IF FILEOPEN THEN BEGIN OIlllI0OIOO.OIIO1OlIIIl :=
0 ;OIlllI0OIOO.OI0ll01lOOOl := ERRORCODE ;OOII := SIZEOF (OI1II1O1l0l0 );{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BGETEQUAL
, POSBLOCK , OI1II1O1l0l0 , OOII , OIlllI0OIOO , 0 );{$ELSE} O10OOIlO1OIO1 := BTRV (BGETEQUAL , POSBLOCK , OI1II1O1l0l0 ,
OOII , OIlllI0OIOO , SIZEOF (OIlllI0OIOO ), 0 );{$ENDIF} END ELSE O10OOIlO1OIO1 := BEOF ;IF (O10OOIlO1OIO1 =BOKAY )THEN
BEGIN OOII := 0 ;WHILE (OI1II1O1l0l0.NAME [ OOII ] <> #0)AND (OOII < 81 ) DO BEGIN OIOI100IlI0 [ OOII + 1 ] :=
OI1II1O1l0l0.NAME [ OOII ] ;INC (OOII );END ;OIOI100IlI0 [ 0 ] := CHR (OOII );ERRORMSG := OIOI100IlI0 ;END ELSE ERRORMSG
:= ERRORHANDLER.ERRORMSG (ERRORCODE );END ;FUNCTION DISKERRORHANDLER.OPMSG (OPCODE:INTEGER):STRING ;VAR OOII:WORD;
O10OOIlO1OIO1:INTEGER;OIOI100IlI0:STRING [ 81 ] ;OI1II1O1l0l0:BTRIEVEMSGREC;OIlllI0OIOO:RECORD OIIO1OlIIIl:INTEGER;
OI0ll01lOOOl:INTEGER;END ;BEGIN IF FILEOPEN THEN BEGIN OIlllI0OIOO.OIIO1OlIIIl := 1 ;OIlllI0OIOO.OI0ll01lOOOl := OPCODE ;
OOII := SIZEOF (OI1II1O1l0l0 );{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BGETEQUAL , POSBLOCK , OI1II1O1l0l0 , OOII ,
OIlllI0OIOO , 0 );{$ELSE} O10OOIlO1OIO1 := BTRV (BGETEQUAL , POSBLOCK , OI1II1O1l0l0 , OOII , OIlllI0OIOO , SIZEOF
(OIlllI0OIOO ), 0 );{$ENDIF} END ELSE O10OOIlO1OIO1 := BEOF ;IF (O10OOIlO1OIO1 =BOKAY )THEN BEGIN OOII := 0 ;
WHILE (OI1II1O1l0l0.NAME [ OOII ] <> #0)AND (OOII < 81 ) DO BEGIN OIOI100IlI0 [ OOII + 1 ] := OI1II1O1l0l0.NAME [ OOII ]
;INC (OOII );END ;OIOI100IlI0 [ 0 ] := CHR (OOII );OPMSG := OIOI100IlI0 END ELSE OPMSG := ERRORHANDLER.OPMSG (OPCODE );
END ;CONSTRUCTOR ERRORDISPLAY.INIT ;BEGIN END ;FUNCTION ERRORDISPLAY.DISPLAY (ERROR:INTEGER;ERRORMSG:STRING ;
OPCODE:INTEGER;OPCODEMSG:STRING ;FILENAME:PATHSTR):ERRORACTION ;BEGIN RUNERROR (211 );END ;DESTRUCTOR ERRORDISPLAY.DONE ;
BEGIN END ;CONSTRUCTOR TPROGRESS.INIT ;BEGIN END ;PROCEDURE TPROGRESS.DISPLAY (COUNT:LONGINT);BEGIN END ;
DESTRUCTOR TPROGRESS.DONE ;BEGIN END ;PROCEDURE CHECKFORBTRIEVE ;VAR OIlO:INTEGER;O1lO01OlI1lO:WORD;
O10OOIlO1OIO1:INTEGER;{$IFDEF VER70} O10O11I0I01O0:TREGISTERS;{$ELSE} O10O11I0I01O0:REGISTERS;{$ENDIF} O11lIOII:STRING [
80 ] ;OIO0O1I11lO:BYTE ABSOLUTE O11lIOII;OIOI100IlI0:ARRAY [ 0 .. 80 ] OF CHAR;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE]
OF BYTE;BEGIN OIlO := 0 ;O1lO01OlI1lO := SIZEOF (OIOI100IlI0 );{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BVERSION , OIlO ,
OIOI100IlI0 , O1lO01OlI1lO , OIlO , 0 );{$ELSE} O10OOIlO1OIO1 := BTRV (BVERSION , O10O0IO0lOllI , OIOI100IlI0 ,
O1lO01OlI1lO , OIlO , OIlO , 0 );{$ENDIF} IF (O10OOIlO1OIO1 <> BOKAY )THEN BEGIN {$IFDEF WINDOWS} POSTQUITMESSAGE
(WM_BRIEVENOTLOADED );{$ELSE} O11lIOII := 'Btrieve Record Manager is not loaded, program aborted!';MOVE (O11lIOII [ 1 ] ,
OIOI100IlI0 [ 0 ] , OIO0O1I11lO );OIOI100IlI0 [ OIO0O1I11lO ] := #13;OIOI100IlI0 [ OIO0O1I11lO + 1 ] := #10;OIOI100IlI0 [
OIO0O1I11lO + 2 ] := '$';O10O11I0I01O0.DS := SEG (OIOI100IlI0 );O10O11I0I01O0.DX := OFS (OIOI100IlI0 );O10O11I0I01O0.AH
:= $09 ;MSDOS (O10O11I0I01O0 );HALT (999 );{$ENDIF} END ;END ;PROCEDURE GETBTRIEVEVERSION (VAR VER:WORD;VAR REV:WORD;
VAR OSFLAG:CHAR);VAR OIlO:INTEGER;O10OOIlO1OIO1:INTEGER;O1lO01OlI1lO:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE]
OF BYTE;OOlIll0O0lll:ARRAY [ 0 .. 19 ] OF BYTE;BEGIN FILLCHAR (OOlIll0O0lll , SIZEOF (OOlIll0O0lll ), 0 );O1lO01OlI1lO
:= SIZEOF (OOlIll0O0lll );OIlO := 0 ;{$IFDEF MSDOS} O10OOIlO1OIO1 := BTRV (BVERSION , OIlO , OOlIll0O0lll , O1lO01OlI1lO
, OIlO , 0 );{$ELSE} O10OOIlO1OIO1 := BTRV (BVERSION , O10O0IO0lOllI , OOlIll0O0lll , O1lO01OlI1lO , OIlO , OIlO , 0 );
{$ENDIF} IF (O10OOIlO1OIO1 =BOKAY )THEN BEGIN MOVE (OOlIll0O0lll [ 0 ] , VER , 2 );MOVE (OOlIll0O0lll [ 2 ] , REV , 2 );
MOVE (OOlIll0O0lll [ 4 ] , OSFLAG , 1 );END ELSE BEGIN VER := 0 ;REV := 0 ;OSFLAG := ' ';END ;END ;
PROCEDURE UNLOADBTRIEVE ;VAR OIlO:INTEGER;OOII:WORD;O10O0IO0lOllI:ARRAY [ 1 .. POSBLOCKSIZE] OF BYTE;BEGIN OIlO := 0 ;
OOII := 0 ;{$IFDEF MSDOS} BTRV (BSTOP , OIlO , OIlO , OOII , OIlO , 0 );{$ELSE} BTRV (BSTOP , O10O0IO0lOllI , OIlO , OOII
, OIlO , OIlO , 0 );{$ENDIF} END ;FUNCTION O1011I1OlOIO1 (OI1OIIIl0lO1:WORD):INTEGER ;FAR ;BEGIN O1011I1OlOIO1 := 1 ;
END ;BEGIN HEAPERROR := @ O1011I1OlOIO1 ;{$IFDEF BCHECK} CHECKFORBTRIEVE ;{$ENDIF} END .