DBFTEST.MOD 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. IMPLEMENTATION MODULE DBFTest;
  2. FROM ModBase3 IMPORT InitDBF,OpenDBF,CloseDBF,ReadDBRec,GetField,DBFile,
  3. DeleteRecord,DefaultFixUp,NilDBF,PosOfField,DBFieldArray,
  4. DBFieldPtr,BuildDBF,DBFieldDescriptor;
  5. FROM DBCopier IMPORT DBPack;
  6. FROM DBIndxes IMPORT InitIndex,OpenIndex,AddToUpdateList,CloseIndex,
  7. CurrentRec,FindPositionCh,BuildIndex,GoTop,GoBottom,
  8. NextRecord,PrevRecord,CurrentKeyCh,FindPositionN,
  9. CurrentKeyN,InitCompIndex,BuildCompIndex,DBIndex;
  10. FROM StrEdit IMPORT CrunchBlanks;
  11. FROM HandleIO IMPORT FileExists;
  12. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  13. FROM DBStuff IMPORT MakeKey;
  14. FROM Drectory IMPORT DeleteFile;
  15. FROM StrConv IMPORT StrToReal;
  16. FROM NumTypes IMPORT Real8;
  17. FROM M2Strings IMPORT Assign;
  18. FROM DBStuff IMPORT MakeKey,MakeDescriptor;
  19. FROM ScanUtils IMPORT Present,CaseSens;
  20. FROM LowLevel IMPORT Fill;
  21. FROM DBFields IMPORT GetDateField,GetLogicalField,GetNumField,Replace,
  22. ReplaceD,ReplaceN;
  23. CONST
  24. Buffer = 0;
  25. Safty = TRUE;
  26. Exclusive = FALSE;
  27. AutoLock = TRUE;
  28. KeepDeleted = FALSE;
  29. VAR
  30. IndexOpen : BOOLEAN;
  31. PROCEDURE MakeDatabase();
  32. VAR
  33. Error : CARDINAL;
  34. Desc : POINTER TO ARRAY [1..200] OF DBFieldDescriptor;
  35. BEGIN
  36. ALLOCATE(Desc, 2 * SIZE(DBFieldDescriptor));
  37. Fill(Desc, 2 * SIZE(DBFieldDescriptor),0);
  38. MakeDescriptor( Desc^[ 1], 'TEST', 30, 0, 'C');
  39. MakeDescriptor( Desc^[ 2], 'TEMP', 20, 0, 'C');
  40. InitDBF('Test.DBF',TestDBF,0,FALSE,TRUE,FALSE,DefaultFixUp);
  41. (* It would be a good to test error.*)
  42. Error:=BuildDBF(Desc^, 2,TestDBF);
  43. CloseDBF(TestDBF);
  44. DEALLOCATE(Desc, 2 * SIZE(DBFieldDescriptor));
  45. END MakeDatabase;
  46. PROCEDURE MoveTestToDBF(Rec : TestRec );
  47. (* This code will move the data from the record to *)
  48. (* the data base *)
  49. BEGIN
  50. WITH Rec DO
  51. Replace( TestDBF, 1,TEST); (* *)
  52. Replace( TestDBF, 2,TEMP); (* *)
  53. END; (* end of with REC *)
  54. END MoveTestToDBF;
  55. PROCEDURE MoveTestFromDBF(VAR Rec : TestRec );
  56. (* This code will move the data from the Database to *)
  57. (* the record *)
  58. VAR B : BOOLEAN;
  59. R : Real8;
  60. BEGIN
  61. WITH Rec DO
  62. GetField( TestDBF, 1,TEST); (* *)
  63. GetField( TestDBF, 2,TEMP); (* *)
  64. END; (* end of with REC^ *)
  65. END MoveTestFromDBF;
  66. PROCEDURE OpenTestDBF(WithIdx : BOOLEAN);
  67. VAR ER : CARDINAL;
  68. BEGIN
  69. IndexOpen := WithIdx;
  70. (* Open the DBF file *)
  71. IF NOT FileExists("Test.DBF")
  72. THEN MakeDatabase();
  73. END;
  74. InitDBF("Test.DBF", TestDBF,Buffer,Safty,Exclusive,
  75. AutoLock,DefaultFixUp );
  76. IF NOT OpenDBF( TestDBF)
  77. THEN END;
  78. (* open all indexes and append to dbfile *)
  79. IF WithIdx THEN
  80. InitIndex( "Test.NDX",TestIdx,TestDBF,Buffer, Safty,
  81. KeepDeleted,Exclusive);
  82. IF NOT OpenIndex( TestIdx )
  83. THEN
  84. ER := BuildIndex(TestIdx,'Test'); (* check key lenght *)
  85. END;
  86. AddToUpdateList( TestDBF, TestIdx );
  87. ActTestIdx := TestIdx; (* make current index *)
  88. GoTop(ActTestIdx);
  89. END; (* end with indext *)
  90. END OpenTestDBF;
  91. PROCEDURE CloseTestDBF (); (* close Data and index files *)
  92. BEGIN
  93. CloseDBF(TestDBF); (* close dbf file *)
  94. IF IndexOpen
  95. THEN
  96. CloseIndex(TestIdx ); (* close index file *)
  97. END; (* end index open*)
  98. END CloseTestDBF;
  99. PROCEDURE FindTestByTest( Key : ARRAY OF CHAR) : BOOLEAN;
  100. VAR Found : BOOLEAN;
  101. CKey : ARRAY[0..80] OF CHAR;
  102. BEGIN
  103. ActTestIdx := TestIdx ; (* make this index the active idx*)
  104. FindPositionCh( TestIdx, Key, Found);
  105. CurrentKeyCh(TestIdx,CKey);
  106. Found := Present(Key,CKey,CaseSens);
  107. IF Found
  108. THEN ReadDBRec( TestDBF, CurrentRec( TestIdx));
  109. END;
  110. RETURN Found;
  111. END FindTestByTest;
  112. PROCEDURE NextTest () : BOOLEAN;
  113. VAR
  114. L : LONGINT; (* record number *)
  115. BEGIN
  116. IF NextRecord( ActTestIdx,L)
  117. THEN ReadDBRec( TestDBF,L );
  118. RETURN TRUE;
  119. ELSE RETURN FALSE;
  120. END;
  121. END NextTest;
  122. PROCEDURE PrevTest () : BOOLEAN;
  123. VAR
  124. L : LONGINT; (* record number *)
  125. BEGIN
  126. IF PrevRecord( ActTestIdx,L)
  127. THEN ReadDBRec( TestDBF,L );
  128. RETURN TRUE;
  129. ELSE RETURN FALSE;
  130. END;
  131. END PrevTest;
  132. PROCEDURE FirstTest ();
  133. VAR
  134. L : LONGINT; (* record number *)
  135. BEGIN
  136. GoTop(ActTestIdx);
  137. ReadDBRec( TestDBF,CurrentRec( ActTestIdx));
  138. END FirstTest;
  139. PROCEDURE LastTest ();
  140. VAR
  141. L : LONGINT; (* record number *)
  142. BEGIN
  143. GoBottom(ActTestIdx);
  144. ReadDBRec( TestDBF,CurrentRec( ActTestIdx));
  145. END LastTest;
  146. PROCEDURE PackTest();
  147. VAR
  148. EM : CARDINAL;
  149. LI : LONGINT;
  150. Tmp : TestRec;
  151. BEGIN
  152. CloseTestDBF();
  153. OpenTestDBF(FALSE); (* open with no index *)
  154. DBPack(TestDBF);
  155. CloseTestDBF();
  156. EM := DeleteFile('Test');
  157. OpenTestDBF(TRUE); (* open to rebuild the indexes*)
  158. CloseTestDBF();
  159. END PackTest;
  160. (* initialization code *)
  161. BEGIN
  162. NilDBF(TestDBF);
  163. IndexOpen := FALSE;
  164. END DBFTest.