DBCOPIER.MOD 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. IMPLEMENTATION MODULE DBCopier;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1990-1991 PMI
  6. * P.O. Box 8402
  7. * Green Bay Wi 53308
  8. * All Rights Reserved
  9. *
  10. *)
  11. FROM M2Strings IMPORT
  12. Delete, Pos, Length, Assign, CompareStr, Concat;
  13. FROM SYSTEM IMPORT
  14. BYTE, ADR, TSIZE, ADDRESS;
  15. FROM DBFields IMPORT
  16. ReplaceL, ReplaceD, GetLogicalField, GetDateField;
  17. FROM ErrorManager IMPORT
  18. WARN;
  19. FROM MemoFunctions IMPORT
  20. GetMemoField, ReplaceM;
  21. FROM ModBase3 IMPORT
  22. AppendBlank, Deleted, ReadDBRec, WriteDBRec, DBFile, DBFieldDescriptor,
  23. UpdateDBFile, GetField, CloseDBF, InitDBF, SetDBBuffer,OpenDBF,
  24. IndexList,BuildDBF,NumberOfFields,FieldList,DefaultFixUp,
  25. FileName,HasMemo,SetIndexList,Replace,RecordPtr,MaxRecLength,
  26. DBFieldPtr,NumberRecords,SetDBSafetyOn,SetDBSafetyOff,SafetySet,
  27. BufferSize,RecordLength,DisposeDBF;
  28. FROM HandleIO IMPORT
  29. FindFile, FileOffSet, CreateFile, OpenFile, EndReached, BlockWrite,
  30. CloseHandle, SetFilePtr, FileExists, BlockRead;
  31. FROM StringIO IMPORT
  32. ErrorMessage, WriteStr, ReadStr, WriteEol, PrintMessage;
  33. FROM Drectory IMPORT
  34. RenameFile, DeleteFile;
  35. FROM LowLevel IMPORT
  36. Move;
  37. FROM VStorage IMPORT
  38. DosAlloc, DosDealloc;
  39. PROCEDURE DEALLOCATE(VAR loc:ADDRESS;size:CARDINAL);
  40. BEGIN
  41. DosDealloc(loc,size);
  42. END DEALLOCATE;
  43. PROCEDURE ALLOCATE(VAR loc:ADDRESS;size:CARDINAL);
  44. BEGIN
  45. DosAlloc(loc,size);
  46. END ALLOCATE;
  47. (* all routines assume dbase3 file naming conventions *)
  48. PROCEDURE CompareDescriptor
  49. ( VAR a,
  50. b : ARRAY OF DBFieldDescriptor;
  51. size : CARDINAL ) : BOOLEAN;
  52. VAR
  53. i : CARDINAL;
  54. BEGIN
  55. FOR i := 0 TO size-1 DO
  56. IF CompareStr( a[i].name, b[i].name ) # 0
  57. THEN
  58. RETURN FALSE;
  59. END (* if CompareStr *);
  60. IF a[i].size # b[i].size
  61. THEN
  62. RETURN FALSE;
  63. END (* if a *);
  64. IF a[i].fldtype # b[i].fldtype
  65. THEN
  66. RETURN FALSE;
  67. END (* if a *);
  68. IF a[i].fldtype = 'N'
  69. THEN
  70. IF a[i].decplaces # b[i].decplaces
  71. THEN
  72. RETURN FALSE;
  73. END (* if a *);
  74. END (* if a *);
  75. END (* for *);
  76. RETURN TRUE;
  77. END CompareDescriptor;
  78. PROCEDURE DBPack
  79. ( VAR dbf : DBFile );
  80. VAR
  81. indexes:ADDRESS;
  82. pos,
  83. handle : CARDINAL;
  84. TempDBF : DBFile;
  85. name,
  86. string,
  87. memo : ARRAY[ 0 .. 30 ] OF CHAR;
  88. fields : DBFieldPtr;
  89. BEGIN
  90. IF NOT OpenDBF(dbf)
  91. THEN
  92. WARN('Not able to open file in DBPack');
  93. END;
  94. indexes:=IndexList(dbf);
  95. (* Should consider a better Temp name system *)
  96. FileName(dbf,name);
  97. InitDBF( '@@tempfi.dbf', TempDBF, 0 ,FALSE,TRUE,TRUE,DefaultFixUp);
  98. fields:=FieldList(dbf);
  99. IF BuildDBF( fields^,NumberOfFields(dbf), TempDBF )=0 THEN
  100. DBCopy( dbf, TempDBF, FALSE );
  101. CloseDBF( dbf );
  102. CloseDBF( TempDBF );
  103. PrintMessage( DeleteFile(name ) );
  104. IF HasMemo(dbf)
  105. THEN
  106. Assign( name, string );
  107. pos := Pos( '.', string ) + 1;
  108. Delete( string, pos, 3 );
  109. Concat( string, 'DBT', string );
  110. PrintMessage( DeleteFile( string ) );
  111. PrintMessage( RenameFile( '@@tempfi.dbt', string ) );
  112. END (* if *);
  113. PrintMessage( RenameFile( '@@tempfi.dbf', name ) );
  114. SetIndexList(dbf,indexes);
  115. ELSE
  116. WARN('Unable to create temporary file in Pack, Operation aborted');
  117. END;
  118. DisposeDBF(TempDBF);
  119. END DBPack;
  120. PROCEDURE DBFieldCopy
  121. ( VAR Source : DBFile;
  122. VAR Dest : DBFile );
  123. VAR
  124. i,
  125. j : CARDINAL;
  126. ok : BOOLEAN;
  127. string : POINTER TO ARRAY[ 0 .. 5000 ] OF CHAR;(* for memo *)
  128. SourceName,
  129. DestName : ARRAY[ 0 .. 9 ] OF CHAR;
  130. SourceRec,
  131. DestRec :POINTER TO ARRAY[1..MaxRecLength] OF CHAR;
  132. DestFields,
  133. SourceFields :DBFieldPtr;
  134. BEGIN
  135. NEW(string);
  136. SourceRec:=RecordPtr(Source);
  137. DestRec:=RecordPtr(Dest);
  138. DestFields:=FieldList(Dest);
  139. SourceFields:=FieldList(Source);
  140. DestRec^[1] := SourceRec^[1]; (* copy delete mark *)
  141. FOR i := 1 TO NumberOfFields(Source) DO
  142. FOR j := 1 TO NumberOfFields(Dest) DO
  143. IF CompareStr( SourceFields^[i].name, DestFields^[j].name ) = 0
  144. THEN
  145. IF SourceFields^[i].fldtype = DestFields^[j].fldtype
  146. THEN
  147. IF SourceFields^[i].fldtype = 'M'
  148. THEN
  149. GetMemoField( Source, i, string^ );
  150. ReplaceM( Dest, j, string^ );
  151. ELSE
  152. GetField( Source, i, string^ );
  153. Replace( Dest, j, string^ );
  154. END (* if *);
  155. END (* if *);
  156. END (* if *);
  157. END (* for *);
  158. END (* for *);
  159. DISPOSE(string);
  160. END DBFieldCopy;
  161. PROCEDURE DBCopy
  162. ( VAR Source : DBFile;
  163. VAR Dest : DBFile;
  164. CopyDeleted : BOOLEAN );
  165. VAR
  166. CurRec : LONGINT;
  167. oldbuffer,
  168. pos,i : CARDINAL;
  169. CopyMemo,
  170. SameStructure,
  171. ok : BOOLEAN;
  172. string : ARRAY[ 0 .. 29 ] OF CHAR;
  173. OldSafety : BOOLEAN;
  174. memo : POINTER TO ARRAY[0..5000] OF CHAR;
  175. SourceRec,
  176. DestRec :POINTER TO ARRAY[1..MaxRecLength] OF CHAR;
  177. DestFields,
  178. SourceFields :DBFieldPtr;
  179. BEGIN
  180. IF NOT OpenDBF(Source)
  181. THEN
  182. WARN('Not able to open Source file in DBCopy');
  183. END;
  184. IF NOT OpenDBF(Dest)
  185. THEN
  186. WARN('Not able to open Dest file in DBCopy');
  187. END;
  188. SourceRec:=RecordPtr(Source);
  189. DestRec:=RecordPtr(Dest);
  190. DestFields:=FieldList(Dest);
  191. SourceFields:=FieldList(Source);
  192. oldbuffer:=BufferSize(Source);
  193. SetDBBuffer( Source, 32000 );
  194. OldSafety:=SafetySet(Dest);
  195. SetDBSafetyOff(Dest);
  196. IF HasMemo(Source) AND HasMemo(Dest)
  197. THEN
  198. CopyMemo := TRUE;
  199. ELSE
  200. CopyMemo := FALSE;
  201. END (* if hasmemo *);
  202. SameStructure := FALSE;
  203. IF ( NumberOfFields(Source) = NumberOfFields(Dest) )
  204. THEN
  205. IF CompareDescriptor( SourceFields^, DestFields^,
  206. NumberOfFields(Source) )
  207. THEN
  208. SameStructure := TRUE;
  209. END (* if *);
  210. END (* if *);
  211. IF SameStructure AND CopyMemo
  212. THEN
  213. NEW(memo);
  214. END;
  215. CurRec := VAL( LONGINT, 1 );
  216. WHILE CurRec <= NumberRecords(Source) DO
  217. ReadDBRec( Source, CurRec );
  218. IF CopyDeleted OR NOT Deleted( Source )
  219. THEN
  220. AppendBlank( Dest );
  221. IF SameStructure
  222. THEN
  223. Move( SourceRec, DestRec, RecordLength(Source));
  224. IF CopyMemo
  225. THEN
  226. (* both structures are the same *)
  227. FOR i := 1 TO NumberOfFields(Dest) DO
  228. IF SourceFields^[i].fldtype = 'M'
  229. THEN
  230. GetMemoField( Source, i, memo^ );
  231. ReplaceM( Dest, i, memo^ );
  232. END (* if *);
  233. END (* for *);
  234. END (* IF COPY MEMO *);
  235. ELSE
  236. DBFieldCopy( Source, Dest );
  237. END (* if *);
  238. WriteDBRec( Dest );
  239. END (* if *);
  240. INC( CurRec );
  241. END (* while *);
  242. IF OldSafety THEN
  243. SetDBSafetyOn(Dest)
  244. END;
  245. UpdateDBFile(Dest);
  246. IF SameStructure AND CopyMemo
  247. THEN
  248. DISPOSE(memo);
  249. END;
  250. SetDBBuffer( Source, oldbuffer );
  251. END DBCopy;
  252. END DBCopier.