home *** CD-ROM | disk | FTP | other *** search
- (* EXAM9.PAS *)
-
- program driver;
- {$R+}
-
- uses
- Exam0,
- Btree,
- Compare,
- FileBuff,
- FileDecs,
- Files,
- LRecList,
- Numbers,
- Page,
- Logical,
- Sort;
-
- var
- dataFile,
- indexFile1,
- indexFile2 : FnString; (* holds file name strings *)
-
- testRec : TestRecord; (* variable to hold a data record *)
-
- lrLst : LrList; (* variable which user declares and passes in to
- LRLIST unit. LRLIST will build a list of
- logical records which fulfill a query criteria.
- (Actually the list will be built by a call
- to the BTREE unit which in turn uses the LRLIST
- unit. *)
-
- lrNum : LrNumber; (* a couple of variable used in this demo program
- to keep track of logical record number
- currently being processed. *)
-
- tempByte : Byte; (* this variable is used to pass in the selection
- criteria for retrievals. A variable or typed
- constants must be used. Constants do not work
- since the call is by reference and not by
- value *)
-
- sPtr : SortFieldList;
-
- success : Boolean;
-
- exitSave : Pointer; (* used as pointer to my terminiation procedure *)
-
-
- (* This procedure will be called prior to termination of the program whether
- there is an error or not. This is a demonstration of a good technique to
- use in conjunction with TBTREE. Calls to write the buffer to disk and
- close the files should be included. This is also a place top handle runtime
- error since I do not attempt to deal with errors or maintain global error
- variables in TBTREE. *)
-
- {$F+} procedure MyExit; {$F-}
-
- begin
- ExitProc := ExitSave; (* reinstall the saved value of ExitProc *)
- Writeln('Writing Records To Disk ...'); (* just a note so you can
- follow along *)
-
- WriteEntireBufferToDisk; (* very important step!! Before leaving
- the program the buffer must be written
- to disk or some changes will be lost.
- This will cause major problems and lost
- data!!! This is not really required in
- in this program since nothing is
- modified. A logical record list is
- created, but it happens to be small
- enough that a temporary file is not
- needed. If a file was needed, it would
- have been destroyed on the call to
- DestroyLrList anyway. *)
-
- Writeln('Closing Files ...'); (* just a note so you can
- follow along *)
-
- CloseAllFiles; (* Close the files to clean up. It is
- important to realize that CloseAllFiles
- DOES NOT write the buffer to disk, it only
- deals with the files open list. *)
-
- end;
-
-
- (* This routine should be called before anything else happens. It calls
- the various routines to set up parameters according to values applicable
- to your particular application. *)
-
- procedure SetUp;
-
- begin
- SetMaxBufferPages(300); (* a call to the PAGE unit to set up the number
- of pages in the buffer. If this is not done a
- default of one page is used. This will cause
- poor performance but will not cause any
- runtime errors *)
-
- SetMaxOpenFiles(10); (* a call to the FILEBUFF unit to set the number
- of files the FILEBUFF unit can have open at
- once. See FILEBUFF unit for details. *)
-
- SetImmediateDiskWrite(FALSE); (* changed and newly created pages will be
- buffered in the page buffer and will only
- written to disk when they are swapped out
- or explicitly written out by a user
- request *)
-
- end;
-
-
- (* This procedure initializes the file names as required. Also, if will
- create the files if they do not exist. Therefore, you can use one
- initialization routine whether the file exists or must be created. *)
-
- procedure InitFiles;
-
- begin
-
- dataFile := 'myFile1.dat';
- if not FileExists(dataFile) then
- begin
- CreateDataFile(dataFile,SizeOf(TestRecord));
- end;
-
- indexFile1 := 'testByte.idx';
- if not FileExists(indexFile1) then
- begin
- CreateIndexFile(indexfile1,SizeOf(BYTE),BYTEVALUE);
- end;
-
- indexFile2 := 'testStrg.idx';
- if not FileExists(indexFile2) then
- begin
- CreateIndexFile(indexfile2,SizeOf(TestString),STRINGVALUE);
- end;
- end;
-
-
- (*****************************************************************************)
- (* *)
- (* M A I N P R O G R A M *)
- (* *)
- (*****************************************************************************)
-
- begin
-
- freeMin := 8*1000; (* this is a good line to use in all of your programs
- to ensure that you have enough heap to store the free
- list. See the Turbo Pascal manual for details (page
- 198 of Turbo Pascal 5.0 Reference Manual *)
-
- Writeln('Setting up termination routine ...'); (* just a note so you can
- follow along *)
-
- exitSave := ExitProc; (* see page 376 - 377 of Turbo Pascal 4.0 manual *)
- ExitProc := @MyExit;
-
- Writeln('Initializing Parameters ...'); (* just a note so you can
- follow along *)
-
- SetUp; (* set file open buffer size and page buffer size limits *)
- (* set immediate disk write parameter as well *)
-
-
- InitFiles;
-
- Writeln('Building a list to sort and then sorting it .... ');
- (* just a note so you can
- follow along *)
-
- tempByte := 255; (* since we are checking for existence, this is not
- required. tempByte must still be included in the
- call however. It will be ignored. *)
-
-
- GetValuesFromBTree(indexFile1,tempByte,EX,lrLst); (* build list of logical
- record numbers which
- exist (criterion is
- EX which means exists
-
- We could also use
- GetValidLogicalRecords
- to build the list *)
-
- (* The following 3 statements set up the sort list and sort the logical
- record list previously created. The list will be sorted by the
- first field in the record only *)
-
- sPtr := NIL;
-
- AddFieldToSortList(sPtr,SizeOf(testRec.randByte),1,BYTEVALUE);
- AddFieldToSortList(sPtr,SizeOf(testRec.randString),2,STRINGVALUE);
-
-
- SortList(lrLst,dataFile,sPtr,success);
-
- if success then
- begin (* The following loop will print the newly ordered records *)
-
- lrNum := GetFirstLr(lrLst); (* get the first record number and set the
- cursor the front of the list. *)
-
- while lrNum <> 0 do
- begin
-
- GetALogicalRecord(dataFile, (* variable holding name of data file *)
- lrNum, (* logical record number from list *)
- testRec); (* place to put the data *)
-
- Writeln(lrNum,' ',testRec.randByte,' ',
- testrec.randString);
-
- lrNum := GetNextLr(lrLst); (* advance the cursor to next in list *)
- end;
- end
- else
- begin
- Writeln('not enough heap to sort');
- end;
-
- (* The following two calls are for demo purposes to show a couple of
- utilities available. *)
-
- Writeln('Total records found matching criteria = ',GetCountLr(lrLst));
-
- Writeln('Number of files presently open = ',GetNumberOpenFiles);
-
- DestroyLrList(lrLst); (* we're done with list so let's get rid of it. This
- is important so that there aren't a bunch of
- temporary files upon termination. Also, lists
- take up data space and also space in the page
- buffer *)
-
- end.