home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / SYSPC22.ZIP / DATABASE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-01-17  |  12.9 KB  |  602 lines

  1. overlay procedure datamenu;
  2. var curbase:baserec;
  3.     curbasenum:integer;
  4.  
  5. procedure packentry (var p:parsedentry; var a:anystr);
  6. var cnt:integer;
  7. begin
  8.   a:='';
  9.   for cnt:=1 to curbase.numcats do
  10.     if length(a)+length(p[cnt])>254 then begin
  11.       writeln ('Entry to big, truncated.');
  12.       exit
  13.     end else a:=a+p[cnt]+#1
  14. end;
  15.  
  16. procedure parseentry (var oa:anystr; var p:parsedentry);
  17. var d,cnt:integer;
  18.     a:anystr;
  19. begin
  20.   a:=oa;
  21.   for cnt:=1 to curbase.numcats do begin
  22.     d:=pos(#1,a);
  23.     if d=0
  24.       then p[cnt]:=''
  25.      else
  26.       begin
  27.         p[cnt]:=copy(a,1,d-1);
  28.         a:=copy(a,d+1,255)
  29.      end
  30.   end
  31. end;
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. procedure makenewbase;
  40.  
  41.   function getnumber (r1,r2:integer; txt:mstr):integer;
  42.   var t:integer;
  43.   begin
  44.     repeat
  45.       writestr (txt+':');
  46.       t:=valu(input);
  47.       if (t<r1) or (t>r2) then
  48.         writeln ('Sorry, must be from ',r1,' to ',r2,'.')
  49.     until (t>=r1) and (t<=r2);
  50.     getnumber:=t
  51.   end;
  52.  
  53. var n,cnt:integer;
  54.     b:baserec;
  55.     p:parsedentry;
  56. begin
  57.   n:=filesize(ddfile)+1;
  58.   writehdr ('Create database number '+strr(n));
  59.   writestr ('Database name:');
  60.   if length(input)=0 then exit;
  61.   b.basename:=input;
  62.   writestr ('Access level:');
  63.   if length(input)=0
  64.     then b.level:=1
  65.     else b.level:=valu(input);
  66.   b.numcats:=getnumber (1,maxcats,'Number of categories');
  67.   b.numents:=0;
  68.   for cnt:=1 to b.numcats do begin
  69.     writestr ('Category #'+strr(cnt)+' name:');
  70.     if length(input)=0 then exit;
  71.     p[cnt]:=input
  72.   end;
  73.   curbase:=b;
  74.   packentry (p,b.catnames);
  75.   seek (ddfile,n-1);
  76.   write (ddfile,b);
  77.   writeln ('Database created!');
  78.   writelog (7,2,b.basename);
  79.   curbase:=b;
  80.   curbasenum:=n
  81. end;
  82.  
  83. procedure nobases;
  84. begin
  85.   rewrite (ddfile);
  86.   writeln ('No databases exist!');
  87.   if not issysop then exit;
  88.   writestr ('Create first database now? *');
  89.   if not yes then exit;
  90.   makenewbase
  91. end;
  92.  
  93. procedure openddfile;
  94. begin
  95.   assign (ddfile,'DataDir');
  96.   reset (ddfile);
  97.   if ioresult<>0
  98.     then nobases
  99.     else begin
  100.       reset (ddfile);
  101.       if filesize (ddfile)=0 then begin
  102.         close (ddfile);
  103.         nobases
  104.       end
  105.     end
  106. end;
  107.  
  108. procedure writecurbase;
  109. begin
  110.   seek (ddfile,curbasenum-1);
  111.   write (ddfile,curbase)
  112. end;
  113.  
  114. procedure readcurbase;
  115. begin
  116.   seek (ddfile,curbasenum-1);
  117.   read (ddfile,curbase)
  118. end;
  119.  
  120. procedure openefile;
  121. var i:integer;
  122. begin
  123.   readcurbase;
  124.   if isopen(efile) then close(efile);
  125.   i:=ioresult;
  126.   assign (efile,'Database.'+strr(curbasenum));
  127.   reset (efile);
  128.   if ioresult<>0 then rewrite (efile);
  129.   curbase.numents:=filesize(efile);
  130.   writecurbase
  131. end;
  132.  
  133. function getparsedentry (var p:parsedentry):boolean;
  134. var cnt:integer;
  135.     pr:parsedentry;
  136.     nonblank:boolean;
  137. begin
  138.   nonblank:=false;
  139.   parseentry (curbase.catnames,pr);
  140.   writeln ('(*=',unam,')');
  141.   for cnt:=1 to curbase.numcats do begin
  142.     writestr (pr[cnt]+': &');
  143.     if length(input)>0 then nonblank:=true;
  144.     if input='*'
  145.       then p[cnt]:=unam
  146.       else p[cnt]:=input
  147.   end;
  148.   getparsedentry:=nonblank
  149. end;
  150.  
  151. function getentry (var a:anystr):boolean;
  152. var p:parsedentry;
  153. begin
  154.   getentry:=getparsedentry (p);
  155.   packentry (p,a)
  156. end;
  157.  
  158. const shownumbers:boolean=false;
  159. procedure showparsedentry (var p:parsedentry);
  160. var cnt:integer;
  161.     pr:parsedentry;
  162. begin
  163.   parseentry (curbase.catnames,pr);
  164.   for cnt:=1 to curbase.numcats do begin
  165.     if shownumbers then write (cnt,'. ');
  166.     writeln (pr[cnt],': '^S,p[cnt]);
  167.     if break then exit
  168.   end;
  169.   shownumbers:=false
  170. end;
  171.  
  172. procedure showentry (var a:anystr);
  173. var p:parsedentry;
  174. begin
  175.   parseentry (a,p);
  176.   showparsedentry (p)
  177. end;
  178.  
  179. procedure showentrynum (var a:anystr; num:integer);
  180. begin
  181.   writeln (^M,num,':');
  182.   showentry (a)
  183. end;
  184.  
  185. function noentries:boolean;
  186. begin
  187.   if curbase.numents>0
  188.     then noentries:=false
  189.     else
  190.       begin
  191.         writeln ('Sorry, database is empty!');
  192.         noentries:=true
  193.       end
  194. end;
  195.  
  196. procedure changeentryrec (var e:entryrec);
  197. var p:parsedentry;
  198.     c:integer;
  199.     done:boolean;
  200. begin
  201.   parseentry (e.data,p);
  202.   repeat
  203.     shownumbers:=true;
  204.     showparsedentry (p);
  205.     writestr (^M'Category number to change [CR to exit]:');
  206.     done:=length(input)=0;
  207.     if not done then begin
  208.       c:=valu(input);
  209.       if (c>0) and (c<=curbase.numcats) then begin
  210.         writestr ('New value [*=Your name, CR to leave unchanged]: &');
  211.         if length(input)<>0 then
  212.           if input='*'
  213.             then p[c]:=unam
  214.             else p[c]:=input
  215.       end
  216.     end
  217.   until done;
  218.   packentry (p,e.data)
  219. end;
  220.  
  221. procedure adddata;
  222. var e:entryrec;
  223. begin
  224.   writehdr ('Add an entry');
  225.   if not getentry (e.data) then begin
  226.     writeln ('Blank entry!');
  227.     exit
  228.   end;
  229.   writestr (^M'Make changes (Y/N/X)? *');
  230.   if length(input)<>0 then
  231.     case upcase(input[1]) of
  232.       'X':begin
  233.             writestr ('Entry not added.');
  234.             exit
  235.           end;
  236.       'Y':changeentryrec (e)
  237.     end;
  238.   e.eda:=datestr;
  239.   e.eti:=timestr;
  240.   e.addedby:=unum;
  241.   seek (efile,curbase.numents);
  242.   write (efile,e);
  243.   curbase.numents:=curbase.numents+1;
  244.   writecurbase
  245. end;
  246.  
  247. procedure listdata;
  248. var cnt,f,l:integer;
  249.     e:entryrec;
  250. begin
  251.   if noentries then exit;
  252.   writeln;
  253.   parserange (curbase.numents,f,l);
  254.   if f=0 then exit;
  255.   writeln;
  256.   for cnt:=f to l do begin
  257.     seek (efile,cnt-1);
  258.     read (efile,e);
  259.     showentrynum (e.data,cnt);
  260.     if break then exit
  261.   end
  262. end;
  263.  
  264. function getdatanum (txt:mstr):integer;
  265. var n:integer;
  266. begin
  267.   getdatanum:=0;
  268.   if noentries then exit;
  269.   repeat
  270.     writestr (^M'Entry to '+txt+' [?=list]:');
  271.     if length(input)=0 then exit;
  272.     if input='?' then begin
  273.       listdata;
  274.       input:=''
  275.     end
  276.   until length(input)>0;
  277.   n:=valu(input);
  278.   if (n>0) and (n<=curbase.numents) then getdatanum:=n
  279. end;
  280.  
  281. function notuseradded (var e:entryrec):boolean;
  282. var b:boolean;
  283. begin
  284.   b:=not ((e.addedby=unum) or issysop);
  285.   notuseradded:=b;
  286.   if b then writestr ('You didn''t add this entry!')
  287. end;
  288.  
  289. procedure changedata;
  290. var n:integer;
  291.     e:entryrec;
  292. begin
  293.   n:=getdatanum ('change');
  294.   if n=0 then exit;
  295.   seek (efile,n-1);
  296.   read (efile,e);
  297.   if notuseradded (e) then exit;
  298.   writelog (8,3,copy(e.data,1,pos(#1,e.data)-1));
  299.   changeentryrec (e);
  300.   seek (efile,n-1);
  301.   write (efile,e);
  302. end;
  303.  
  304. procedure deletedata;
  305. var n,cnt:integer;
  306.     e:entryrec;
  307.     p:parsedentry;
  308. begin
  309.   n:=getdatanum ('delete');
  310.   if n=0 then exit;
  311.   seek (efile,n-1);
  312.   read (efile,e);
  313.   if notuseradded(e) then exit;
  314.   parseentry (e.data,p);
  315.   writelog (8,6,p[1]);
  316.   curbase.numents:=curbase.numents-1;
  317.   writecurbase;
  318.   for cnt:=n to curbase.numents do begin
  319.     seek (efile,cnt);
  320.     read (efile,e);
  321.     seek (efile,cnt-1);
  322.     write (efile,e)
  323.   end;
  324.   seek (efile,curbase.numents);
  325.   truncate (efile)
  326. end;
  327.  
  328. procedure listbases;
  329. var cnt:integer;
  330.     b:baserec;
  331. begin
  332.   writehdr ('List of Databases');
  333.   if break then exit;
  334.   for cnt:=1 to filesize (ddfile) do begin
  335.     seek (ddfile,cnt-1);
  336.     read (ddfile,b);
  337.     if b.level<=ulvl then writeln ('[',cnt,'][',b.basename,']');
  338.     if break then exit
  339.   end
  340. end;
  341.  
  342. procedure selectdata;
  343. var n:integer;
  344.     b:baserec;
  345. begin
  346.   if length(input)>1 then input:=copy(input,2,255) else
  347.     repeat
  348.       writestr ('Database number [?=list]:');
  349.       if length(input)=0 then exit;
  350.       if input='?' then begin
  351.         listbases;
  352.         input:=''
  353.       end
  354.     until length(input)>0;
  355.   n:=valu(input);
  356.   if (n<1) or (n>filesize(ddfile)) then begin
  357.     writeln ('No such database: '^S,n);
  358.     if not issysop then exit;
  359.     n:=filesize(ddfile)+1;
  360.     writestr ('Create database #'+strr(n)+'? *');
  361.     if yes then begin
  362.       writecurbase;
  363.       makenewbase;
  364.       openefile
  365.     end;
  366.     exit
  367.   end;
  368.   seek (ddfile,n-1);
  369.   read (ddfile,b);
  370.   if b.level>ulvl then begin
  371.     reqlevel (b.level);
  372.     exit
  373.   end;
  374.   writecurbase;
  375.   curbasenum:=n;
  376.   openefile
  377. end;
  378.  
  379. procedure searchdata;
  380. var cnt,f,en:integer;
  381.     e:entryrec;
  382.     pattern:anystr;
  383.     p:parsedentry;
  384. begin
  385.   if noentries then exit;
  386.   writestr ('Search pattern:');
  387.   if length(input)=0 then exit;
  388.   pattern:=input;
  389.   for cnt:=1 to length(pattern) do pattern[cnt]:=upcase(pattern[cnt]);
  390.   for en:=1 to curbase.numents do begin
  391.     seek (efile,en-1);
  392.     read (efile,e);
  393.     parseentry (e.data,p);
  394.     for f:=1 to curbase.numcats do begin
  395.       for cnt:=1 to length(p[f]) do p[f][cnt]:=upcase(p[f][cnt]);
  396.       if pos(pattern,p[f])<>0 then showentrynum (e.data,en)
  397.     end
  398.   end;
  399.   writeln (^M'Search complete')
  400. end;
  401.  
  402. const beenaborted:boolean=false;
  403.  
  404. function aborted:boolean;
  405. begin
  406.   if beenaborted then begin
  407.     aborted:=true;
  408.     exit
  409.   end;
  410.   aborted:=xpressed or hungupon;
  411.   if xpressed then begin
  412.     beenaborted:=true;
  413.     writeln (^B'Newscan aborted!')
  414.   end
  415. end;
  416.  
  417. procedure newscan;
  418. var cnt:integer;
  419.     e:entryrec;
  420. begin
  421.   beenaborted:=false;
  422.   for cnt:=1 to curbase.numents do begin
  423.     seek (efile,cnt-1);
  424.     read (efile,e);
  425.     if aborted then exit;
  426.     if later (e.eda,e.eti,lastonda,lastonti)
  427.       then showentrynum (e.data,cnt)
  428.   end
  429. end;
  430.  
  431. procedure newscanall;
  432. begin
  433.   writehdr ('New-scanning... Press [X] to abort.');
  434.   for curbasenum:=1 to filesize(ddfile) do begin
  435.     if aborted then exit;
  436.     openefile;
  437.     if curbase.level<=ulvl then begin
  438.       writeln (^B^M'Scanning ',curbase.basename,^M);
  439.       newscan;
  440.       if aborted then exit
  441.     end
  442.   end;
  443.   curbasenum:=1;
  444.   openefile;
  445.   writeln (^B'Newscan complete!')
  446. end;
  447.  
  448. procedure killdatabase;
  449. var b:baserec;
  450.     cnt:integer;
  451. begin
  452.   writestr ('Kill database:  Are you sure? *');
  453.   if not yes then exit;
  454.   writecurbase;
  455.   close (efile);
  456.   erase (efile);
  457.   for cnt:=curbasenum to filesize(ddfile)-1 do begin
  458.     seek (ddfile,cnt);
  459.     read (ddfile,b);
  460.     seek (ddfile,cnt-1);
  461.     write (ddfile,b);
  462.     assign (efile,'Database.'+strr(cnt+1));
  463.     rename (efile,'Database.'+strr(cnt))
  464.   end;
  465.   seek (ddfile,filesize(ddfile)-1);
  466.   truncate (ddfile);
  467.   writelog (8,5,'');
  468.   if filesize(ddfile)>0 then begin
  469.     curbasenum:=1;
  470.     openefile
  471.   end
  472. end;
  473.  
  474. procedure reorderdata;
  475. var numd,curd,newd:integer;
  476.     b1,b2:baserec;
  477.     f1,f2:file;
  478.     fn1,fn2:sstr;
  479. label exit;
  480. begin
  481.   writecurbase;
  482.   writehdr ('Re-order databases');
  483.   writelog (8,1,'');
  484.   numd:=filesize (ddfile);
  485.   writeln ('Number of database: ',numd);
  486.   for curd:=0 to numd-2 do begin
  487.     repeat
  488.       writestr ('New database #'+strr(curd+1)+' [?=List, CR to quit]:');
  489.       if length(input)=0 then goto exit;
  490.       if input='?'
  491.         then
  492.           begin
  493.             listbases;
  494.             newd:=-1
  495.           end
  496.         else
  497.           begin
  498.             newd:=valu(input)-1;
  499.             if (newd<0) or (newd>=numd) then begin
  500.               writeln ('Not found!  Please re-enter...');
  501.               newd:=-1
  502.             end
  503.           end
  504.     until (newd>0);
  505.     seek (ddfile,curd);
  506.     read (ddfile,b1);
  507.     seek (ddfile,newd);
  508.     read (ddfile,b2);
  509.     seek (ddfile,curd);
  510.     write (ddfile,b2);
  511.     seek (ddfile,newd);
  512.     write (ddfile,b1);
  513.     fn1:='Database.';
  514.     fn2:=fn1+strr(newd+1);
  515.     fn1:=fn1+strr(curd+1);
  516.     assign (f1,fn1);
  517.     assign (f2,fn2);
  518.     rename (f1,'Temp$$$$');
  519.     rename (f2,fn1);
  520.     rename (f1,fn2)
  521.   end;
  522.   exit:
  523.   curbasenum:=1;
  524.   openefile
  525. end;
  526.  
  527. procedure renamedata;
  528. begin
  529.   writeln ('Current name: '^S,curbase.basename);
  530.   writestr ('Enter new name:');
  531.   if length(input)>0 then begin
  532.     curbase.basename:=input;
  533.     writecurbase;
  534.     writelog (8,2,input)
  535.   end
  536. end;
  537.  
  538. procedure setlevel;
  539. begin
  540.   writeln ('Current level: '^S,curbase.level);
  541.   writestr ('Enter new level:');
  542.   if length(input)>0 then begin
  543.     curbase.level:=valu(input);
  544.     writecurbase;
  545.     writelog (8,4,strr(curbase.level))
  546.   end
  547. end;
  548.  
  549. procedure sysopcommands;
  550. var q:integer;
  551. begin
  552.   writelog (7,1,curbase.basename);
  553.   repeat
  554.     q:=menu('Database Sysop','DSYSOP','QCDEKOR');
  555.     case q of
  556.       2:changedata;
  557.       3:deletedata;
  558.       4:setlevel;
  559.       5:killdatabase;
  560.       6:reorderdata;
  561.       7:renamedata
  562.     end
  563.   until (q=1) or hungupon or (filesize(ddfile)=0)
  564. end;
  565.  
  566. var q:integer;
  567. begin
  568.   cursection:=databasesysop;
  569.   openddfile;
  570.   if filesize(ddfile)=0 then exit;
  571.   curbasenum:=1;
  572.   seek (ddfile,0);
  573.   read (ddfile,curbase);
  574.   if curbase.level>ulvl then begin
  575.     reqlevel (curbase.level);
  576.     close (ddfile);
  577.     exit
  578.   end;
  579.   openefile;
  580.  
  581.   repeat
  582.     writeln (^B^M'Active:  '^S,curbase.basename);
  583.     writeln ('Entries: '^S,curbase.numents);
  584.     q:=menu('Database','DATA','QA*SLVNH%@CD');
  585.     case q of
  586.       2:adddata;
  587.       3:selectdata;
  588.       4:searchdata;
  589.       5:listdata;
  590.       6:newscan;
  591.       7:newscanall;
  592.       8:;
  593.       9:sysopcommands;
  594.       10:changedata;
  595.       11:deletedata;
  596.  
  597.     end
  598.   until hungupon or (q=1) or (filesize(ddfile)=0);
  599.   close (ddfile);
  600.   close (efile)
  601. end;
  602.