| ![]() | ||||||||||||||||||||
The following Borland Pascal example demonstrates the use of the FATS
 indexing commands:
(*
FATS 02.30
(c) GCS Software, Udo Gertz 1993-1998
Test program (Turbo Pascal / Win 3.x)
Reindex the test data file customer.dat.
19-03-2009 U.Gertz
*)
program REBUILD;
uses WinCrt,
WinProcs;
function FATSLibInit(nSize: integer; nSign: integer): Pointer;
far; external 'FATS_WIN';
function FATSLibExit(lpFATSdata: Pointer): Pointer;
far; external 'FATS_WIN';
function FATSLibCall(var szCmnd: string; var uErrorCode: word;
var szFATSkey: string; lpFATSdata: Pointer): longint;
far; external 'FATS_WIN';
const
fn_cust = 'CUSTOMER.DAT';
type
custrec = record
DELETEDMARK: char;
ID: string[5];
NAME: string[25];
JOB: string[25];
STREET: string[25];
ZIP: string[5];
CITY: string[20];
end;
var
hCustomer: file of custrec;
custdata: custrec;
lpFATSdata: Pointer;
szCmnd: string;
szFATSkey: string;
szRecno: string[8];
uFATSError: word;
dwFATSRecno: longint;
dwRecords: longint;
label exitbuild;
begin
(*
Before you can use the FATS commands in your programs, you must
assign a data area to FATS:
*)
lpFATSdata := FATSLibInit( 0, 1 );
if lpFATSdata = nil then exit;
(*
The first parameter determines the size of the FATS data area.
If you indicate a zero here, then the minimum needed storage
space is reserved (approx. 18-20 KB). The second parameter intends
the assigned programming language. The address of the data area
is returned in the variable lpFatsdata.
*)
(*
-------> Activation of FATS Cache
By default the cache functionality is deactivated. It can be activated
with the
"Y" Auto Refresh command.
If you want to reorganize a index file for example, you can activate
the cache algorithm with the commands "Y\5" or "Y\106", then build the
entire file and finally restore the original status (e.g. "Y\0", "Y\2").
The operation can be speed up for 30 times.
FATS does not perform writes to the operation system until its cache is
full and the least-recently-used algorithm controlling the I/O buffer
cache selects a buffer for reuse. FATS never writes to the index file
unless the cache buffers are entirely filled during a single command.
In addition, FATS does not perform the reset disk operations that cause
the operation system to flush its cache buffers to the disk. It does not
close and reopen the file each time it physically expands in order to
flush the directory structure.
When using this command, you cannot assume that any of your updates have
been written to the disk until you either perform a close operation or
execute the command Write Page Map (W).
Use "Y\106" instead of "Y\5" in an network environment.
*)
szCmnd:='Y\5';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
(*
-------> Open data file
*)
assign (hCustomer, fn_cust);
reset (hCustomer);
(*
-------> Create index file
*)
szCmnd:='C\CUSTOMER.KEY\5;25\4\A\1';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
(*
========================================================================
Re-Indexing
========================================================================
*)
dwRecords:=0;
repeat
If EOF( hCustomer ) Then Begin
goto exitbuild;
End;
seek(hCustomer, dwRecords);
read(hCustomer, custdata);
dwRecords:=dwRecords + 1;
str(dwRecords, szRecno);
If custdata.DELETEDMARK = ' ' Then Begin
(*
"BK" Build Keys
This command inserts the primary keys of the specified
data record ("RecNo") into the index file. The number
of keys included in the command string must equal the
number of primary keys you specified in the Create
Indexfile (C) command.
This command corresponds to the command Insert Keys (IK)
except that FATS does not perform writes to the operation
system until its cache is full and the least-recently-used
algorithm controlling the I/O buffer cache selects a buffer
for reuse. FATS never writes to the index file unless the
cache buffers are entirely filled during the operation.
All other FATS commands will update the index file before
returning to the calling program (if this feature had not
been disabled with the Auto Refresh command).
The syntax of the command string:
szCmnd = "BK\{RecNo}\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]"
RecNo Record number
FileNo File number
KeyStr# Key value
*)
szCmnd:='BK\' + szRecno + '\1';
szCmnd:=szCmnd + '\' + custdata.ID;
szCmnd:=szCmnd + '\' + custdata.NAME;
szCmnd:=szCmnd + '\' + custdata.JOB;
szCmnd:=szCmnd + '\' + custdata.ZIP + custdata.CITY;
End Else Begin
(*
"DL" Manipulate Deleted List
The record numbers of deleted data records are taken up
by FATS automatically with the command Delete Record (D)
to a list of the data records that already have been
deleted, so that the command Insert Record (I) can
possibly reuse these, before the data file must be
extended. This list is administered according to the
principle last in, first out, i.e. the record deleted
last is reused as next.
This command allows you to manipulate this list by
inserting and deleting of record numbers. Because free
space in the data and index files is reclaimed and reused
by FATS automatically as records are deleted and added,
this command is normally not needed, but it can be useful
for reindexing data files containing deleted records.
Note that using this command in conjunction with the
commands "Insert Record" and "Delete Record" can result
in corrupted data files, incorrect query results, and
program failures.
The syntax of the command string:
szCmnd = "DL\{RecNo}\{GetSetFlag}\{FileNo}"
RecNo Record number
GetSetFlag Possible values:
G Remove a record number from the list
of deleted records. If there are no
entries in the list this command will
return the number of the next available
record in the data file. If there are
entries in the list, the record number
of the last deleted record will be
returned.
This command is automatically called by
FATS when the Insert Record (I) command
is used.
S Add a record number ("RecNo") to the
list of deleted records.
This command is automatically called by
FATS when the Delete Record (D) command
is used.
FileNo File number
*)
szCmnd:='DL\' + szRecno + '\S\1';
End;
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
until uFATSError <> 0;
exitbuild:
(*
--------> Close index file
*)
szCmnd:='K\1';
dwFATSRecno:=FATSLibCall(szCmnd, uFATSError, szFATSkey, lpFATSdata);
close(hCustomer);
(*
Before terminating the application program you should release the
storage area allocated by FATSLibInit. You can do this by calling
the function FATSLibExit:
*)
lpFATSdata := FATSLibExit( lpFATSdata );
(*
Although the storage area would be released automatically by the
operating system, this instruction is useful, since it closes
all FATS files that are still opened.
*)
end.
© 2008
GCS Software, Udo Gertz