home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG Library 8 / PC-SIG Library CD-ROM (8th Edition) (1990-04).iso / 001_100 / disk0004 / backup.bas (.txt) next >
Encoding:
GW-BASIC  |  1982-11-09  |  5.8 KB  |  199 lines

  1. 1   REM-------------------------------------------------------
  2. 2  REM
  3. 3  REM                    backup.BAS
  4. 4  REM      copy b-tree index file and master data file
  5. 5  REM         remove deleted items in the database
  6. 6  REM--------------------------------------------------------
  7. 7  CLS:KEY OFF
  8. 10  GOTO 1100          'branch to main program
  9. 20  REM ----------------SUROUTINES---------------------
  10. 30  REM
  11. 100  REM--------------------------------------------------
  12. 105  REM
  13. 110  REM                    READ.BAS
  14. 115  REM    INPUT A B-TREE NODE FROM DISK FILE #1
  15. 120  REM---------------------------------------------------
  16. 130  GET 1,P%:LSET REC$=R$
  17. 131  FOR INDEX%=1 TO N%
  18. 132     CH%=SIZE% *(INDEX%-1)
  19. 133     FLAG$=MID$(REC$,CH%+1,1)
  20. 134     IF FLAG$="E" THEN FLAG%(INDEX%)=0
  21. 135     IF FLAG$="F" THEN FLAG%(INDEX%)=1
  22. 136     IF FLAG$="D" THEN FLAG%(INDEX%)=2
  23. 137     KEYS$(INDEX%)=MID$(REC$,CH%+2,SIZE%-3)
  24. 138     ARC%(INDEX%)=CVI(MID$(REC$,CH%+SIZE%-1,2))
  25. 139   NEXT INDEX%
  26. 140  ARC%(N%+1)=CVI(MID$(REC$,126,2))
  27. 145  RETURN
  28. 150  REM-----------------------------------------------------
  29. 155  REM
  30. 160  REM                     WRITE.BAS
  31. 165  REM     OUTPUT A B-TREE NODE TO FILE #1
  32. 170  REM
  33. 175  REM-----------------------------------------------------
  34. 180  FOR INDEX%=1 TO N%
  35. 181    CH%=SIZE% *(INDEX%-1)
  36. 182    ON FLAG%(INDEX%)+1 GOTO 183,184,185
  37. 183     FLAG$="E":GOTO 186
  38. 184     FLAG$="F":GOTO 186
  39. 185     FLAG$="D"
  40. 186    MID$(REC$,CH%+1,1)=FLAG$
  41. 187    MID$(REC$,CH%+2,SIZE%-3)=KEYS$(INDEX%)
  42. 188    MID$(REC$,CH%+SIZE%-1,2)=MKI$(ARC%(INDEX%))
  43. 189  NEXT INDEX%
  44. 190  MID$(REC$,126,2)=MKI$(ARC%(N%+1))
  45. 195  LSET NR$=REC$:PUT G%,LNF%
  46. 199  RETURN
  47. 250  REM--------------------------------------
  48. 251  REM
  49. 252  REM               restore a b-tree node
  50. 253  REM--------------------------------------
  51. 260  FOR INDEX%=1 TO N%+1
  52. 262   FLAG%(INDEX%)=SFLAG%(INDEX%)
  53. 264   KEYS$(INDEX%)=SKEYS$(INDEX%)
  54. 266   ARC%(INDEX%)=SARC%(INDEX%)
  55. 268  NEXT INDEX%
  56. 270  RETURN
  57. 500  REM---------------------------------------------
  58. 501  REM
  59. 502  REM    search b-tree for left-most item, only
  60. 503  REM---------------------------------------------
  61. 510  PRINT:D$="Found": P0%=ROOT%
  62. 515  GOSUB 100          'read a node
  63. 520  IF ARC%(1)=0 THEN 525 ELSE 535
  64. 525    PRINT:LINE INPUT "File is empty. Strike RETURN ";Y$
  65. 530   PRINT:D$="Not found":RETURN
  66. 535  IF ARC%(1)<0 THEN 540 ELSE 545
  67. 540    ITEM%=1 :RETURN
  68. 545  P0%=ARC%(1)
  69. 550  GOTO 515
  70. 700  REM------------------------------------------
  71. 701  REM     read next sequential node
  72. 702  REM------------------------------------------
  73. 710  D$="":P0%=LINK%
  74. 720  IF P0%=0 THEN 725 ELSE 740
  75. 725    PRINT:D$="Done":RETURN
  76. 740  GOSUB 100:ITEM%=1:RETURN
  77. 750  REM----------------------------------------
  78. 751  REM   fill new index file node
  79. 752  REM-----------------------------------------
  80. 755  FOR NI%=NI% TO N%
  81. 760   SKEYS$(NI%)=ZERO$
  82. 765   SFLAG%(NI%)=0
  83. 770   SARC%(NI%)=0
  84. 775  NEXT NI%
  85. 780  IF D$="Done" THEN SARC%(N%+1)=0 ELSE SARC%(N%+1)=LNF%+1
  86. 795  RETURN
  87. 1000  REM------------------------------
  88. 1001  REM  finish up
  89. 1002  REM------------------------------
  90. 1005  REM
  91. 1015  CLOSE 1,2
  92. 1020  OPEN "O",2,"HEADER.DAT"
  93. 1025  PRINT #2,FSCREEN$;",";ROOT%;NPTR%-1;LNF%-1;AN%;LINS%;N%;SIZE%;
  94. 1030  PRINT #2,INDEX$;MAST$
  95. 1035  CLOSE 2
  96. 1040  RETURN
  97. 1100  REM--------------------------------------
  98. 1101  REM    COPY AND GARBAGE COLLECT
  99. 1102  REM--------------------------------------
  100. 1110  OPEN "I",2,"HEADER.DAT"
  101. 1115   INPUT #2,FSCREEN$,ROOT%,LNG%,LNF%,AN%,LINS%,N%,SIZE%,INDEX$,MAST$
  102. 1120  CLOSE 2
  103. 1125  N0%=N%+1:DIM FLAG%(N0%),KEYS$(N0%),ARC%(N0%)
  104. 1130           DIM SFLAG%(N0%),SKEYS$(N0%),SARC%(N0%)
  105. 1135  OPEN "R",1,INDEX$
  106. 1140  FIELD 1, 127 AS R$
  107. 1145  REC$=SPACE$(127):ZERO$=SPACE$(SIZE%-3):LSET ZERO$="0"
  108. 1150  OPEN "R",2,MAST$
  109. 1155    FIELD 2,127 AS MR$
  110. 1200  REM--------------------------------------------
  111. 1201  REM
  112. 1202  REM      NOW THAT THE FILES ARE OPEN, ETC.
  113. 1203  REM      CREATE BACKUP COPIES...
  114. 1204  REM--------------------------------------------
  115. 1270  LINE INPUT"Enter name of backup data file : ";NW$
  116. 1275  LINE INPUT"        Correct (Y/N) ?";Y$
  117. 1280  IF Y$<>"Y" AND Y$<>"y" THEN 1270
  118. 1290  LINE INPUT"Enter name of backup index file : ";OUTDEX$
  119. 1300  LINE INPUT"        Correct (Y/N) ?";Y$
  120. 1310  IF Y$<>"Y" AND Y$<>"y" THEN 1290
  121. 1320  PRINT"Busy working..."
  122. 1330  OPEN "R",3,OUTDEX$
  123. 1340  FIELD 3,127 AS NR$
  124. 1350  G%=3
  125. 1360  OPEN "R",4,NW$
  126. 1370   FIELD 4,127 AS RR$
  127. 1380  GOSUB 500
  128. 1390  IF D$="Not Found" THEN 1395 ELSE 1400
  129. 1395    CLOSE 1,2,3,4 :RUN "dbmenu"
  130. 1400  REM-----------------copy from old master to new--------------------
  131. 1470  NPTR%=1:LNF%=1:ITEM%=1
  132. 1480  REM ----------loop-------------------
  133. 1490   FOR NI%=1 TO N%-1
  134. 1492   IF ITEM%=N% THEN GOSUB 700
  135. 1496   IF D$="Done" THEN 1760
  136. 1500   MPTR%=-ARC%(ITEM%)
  137. 1505   IF MPTR%=0 THEN 1506 ELSE 1510
  138. 1506     ITEM%=ITEM%+1
  139. 1507     GOTO 1492
  140. 1510   IF FLAG%(ITEM%)=2 THEN 1506
  141. 1550   GET 2,MPTR%
  142. 1560   LSET RR$=MR$
  143. 1570   PUT 4,NPTR%
  144. 1580  REM----copy index info-------
  145. 1590   SKEYS$(NI%)=KEYS$(ITEM%)
  146. 1600   SFLAG%(NI%)=1
  147. 1610   SARC%(NI%)=-NPTR%
  148. 1630  REM-----update new master pointer
  149. 1650     NPTR%=NPTR%+1
  150. 1700  REM -----update old index info----------
  151. 1720     ITEM%=ITEM%+1
  152. 1750  NEXT NI%
  153. 1751  PRINT"Calm down, I'm still working on it..."
  154. 1755  IF (KEYS$(ITEM%)=ZERO$) AND (LINK%=0) THEN 1756 ELSE 1760
  155. 1756   D$="Done":SARC%(N%+1)=0
  156. 1760  GOSUB 750:GOSUB 250:GOSUB 150
  157. 1770  LNF%=LNF%+1
  158. 1780   IF D$="Done" THEN 1850 ELSE 1490
  159. 1850  REM------------------------------------------
  160. 1851  REM   close  files and redefine header file
  161. 1852  REM------------------------------------------
  162. 1880  CLOSE 1,2,3,4
  163. 1890  INDEX$=OUTDEX$
  164. 1900  MAST$=NW$
  165. 1910  PRINT"Data file re-organized. Now for the index file..."
  166. 1930  REM--------------do b-tree tier by tier--------------------
  167. 1950  P0%=1:ROOT%=LNF%
  168. 1960  OPEN "R",1,OUTDEX$
  169. 1965  G%=1:FIELD,1127 AS NR$
  170. 1980  REM---------------------find last key and move it up-----------------
  171. 2000  KOUNT%=1:D$=""
  172. 2010  FOR ITEM%=1 TO N%-1
  173. 2020   GOSUB 100:SFAG%(ITEM%)=1
  174. 2030   I%=0
  175. 2031    I%=I%+1
  176. 2032    SKEYS$(ITEM%)=KEYS$(N%-I%)
  177. 2033    IF KEYS$(N%-I%)=ZERO$ THEN 2031
  178. 2060   SARC%(ITEM%)=P0%
  179. 2070   P0%=LINK%
  180. 2080   IF P0%=0 THEN 2100
  181. 2090  NEXT ITEM%
  182. 2100  REM---------finish off node-------------------
  183. 2105  PRINT"You are being so patient..."
  184. 2130  IF P0%=0 THEN 2140 ELSE 2250
  185. 2140   D$="Done":NI%=ITEM%+1:GOSUB 750
  186. 2150   GOSUB 250:GOSUB 150
  187. 2155   P0%=ROOT%:ROOT%=LNG%+1:LNF%=ROOT%
  188. 2160  GOTO 2330
  189. 2200  REM---------------more still to come---------------------------
  190. 2250    KOUNT%=KOUNT%+1
  191. 2255    NI%=N%
  192. 2260    GOSUB 750:GOSUB 250:GOSUB 150
  193. 2270    LNF%=LNF%+1:GOTO 2010
  194. 2330  IF KOUNT%=1 THEN 2340 ELSE 2000
  195. 2340  PRINT"Done at last."
  196. 2390  ROOT%=ROOT%-1:GOSUB 1000
  197. 2400  RUN "dbmenu"
  198. 2500  END
  199.