home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv025.ark / DBUNIT.4 < prev    next >
Text File  |  1984-04-29  |  17KB  |  575 lines

  1. FUNCTION DBPUT(*DESTINATION:DBWRKINDEX):DBERRTYPE*);
  2. (*replace current item in workarea with the contents of DBMAIL*)
  3. VAR DELTA,OLDLINKV,NEWLINKV,ISTACK:INTEGER;
  4.   FP:FLDDESPTR;
  5.   
  6.   PROCEDURE PUTLINKF;
  7.   (*replace current linked item with the item in DBMAIL*)
  8.   BEGIN
  9.     WITH WRKTABLE[DESTINATION] DO
  10.       BEGIN (*replace the linked item*)
  11.         WITH WIB^[TOS] DO
  12.           BEGIN
  13.             OLDLINKV:=LINKVALUE(WA,OFFSET);
  14.             NEWLINKV:=ORD(DBMAIL.TXT[0]);
  15.             IF DBMAIL.DBMAILTYPE = STRINGF THEN
  16.               NEWLINKV:=NEWLINKV+1; (*link is 1 greater than
  17.                                                 string length*)
  18.             DELTA:=NEWLINKV-OLDLINKV;
  19.             IF DELTA > 0 THEN
  20.               DBSHOWERR('DBPUT#1',MOVETAIL(DESTINATION,DELTA,OFFSET))
  21.             ELSE
  22.               DBSHOWERR('DBPUT#2',MOVETAIL(DESTINATION,DELTA,OFFSET-DELTA));
  23. (*$R-*)
  24.             MOVELEFT(DBMAIL.TXT,WA^[OFFSET],NEWLINKV);
  25.             WA^[OFFSET]:=NEWLINKV;
  26. (*$R+*)
  27.           END (*WITH WIB*);
  28.         (*now correct enclosing links also*)
  29.         IF TOS > 0 THEN
  30.           FIXLINKS(DESTINATION,(TOS-1),DELTA);
  31.       END (*WITH WRKTABLE*);
  32.   END (*PUTLINKF*);
  33.   
  34.   PROCEDURE PUTFIXEDF(FP:FLDDESPTR);
  35.   (*replace a fixed width item in a record assumed already present*)
  36.   CONST FIXEDWIDTH = 1;
  37.   VAR SW:CRACKSWTYPE;
  38.     FOFFSET:INTEGER;
  39.   BEGIN
  40.     WITH WRKTABLE[DESTINATION] DO
  41.       WITH WIB^[TOS] DO
  42.         WITH FP^ DO
  43.           BEGIN
  44.             SW.BL:=SWITCHES;
  45.             IF NOT SW.A[FIXEDWIDTH] THEN
  46.               DBPUT:=37 (*fixed width item expected*)
  47.             ELSE
  48. (*$R-*)
  49.               WITH DBMAIL DO
  50.                 MOVELEFT(TXT, WA^[OFFSET+GETFOFFSET(DESTINATION)],
  51.                                         MAXWIDTH);
  52. (*$R+*)
  53.           END (*WITH FP^*);
  54.   END (*PUTFIXEDF*);
  55.   
  56. BEGIN (*DBPUT*)
  57.   DBPUT:=0;
  58.   TRACEWA(14,DESTINATION);
  59.   IF DBTYPECHECK THEN
  60.     WITH WRKTABLE[DESTINATION] DO
  61.       WITH WIB^[TOS] DO
  62.         WITH DBMAIL DO
  63.           BEGIN
  64.             IF DBMAILTYPE = GROUPF THEN
  65.               BEGIN
  66.                 IF LEVEL <> GROUPT THEN
  67.                   DBPUT:=36
  68.                 ELSE
  69.                   PUTLINKF;
  70.               END
  71.             ELSE
  72.               IF LEVEL <> FIELDT THEN
  73.                 DBPUT:=38
  74.               ELSE
  75.               IF (DESCRIPTORNUM >= 0) 
  76.                   AND (DESCRIPTORNUM <= LASTFIELDDESCRIPTOR) THEN
  77.                 BEGIN (*it's a simple field*)
  78.                   FP:=ACTIVEFIELDS[DESCRIPTORNUM];
  79.                   IF FP = NIL THEN
  80.                     DBPUT:=31 (*no such field initialized*)
  81.                   ELSE
  82.                     WITH FP^ DO
  83.                       IF FLDTYPE <> DBMAILTYPE THEN
  84.                         DBPUT:=36 (*mismatch*)
  85.                       ELSE
  86.                         IF DBMAILTYPE IN [STRINGF,INTEGERF,LONGINTF] THEN
  87.                           CASE DBMAILTYPE OF
  88.                             STRINGF: PUTLINKF;
  89.                             LONGINTF,INTEGERF: PUTFIXEDF(FP)
  90.                           END (*CASES*)
  91.                         ELSE
  92.                           DBPUT:=12; (*not yet implemented*)
  93.                 END (*simple field*)
  94.               ELSE
  95.                 DBPUT:=31 (*no such field exists*);
  96.           END (*WITH DBMAIL*)
  97.   ELSE (*item assumed to be linked string*)
  98.     PUTLINKF;
  99.   TRACEWA(15,DESTINATION);
  100. END (*DBPUT*);
  101.  
  102.  
  103. (*SUPPORT PRIMITIVES*)
  104. FUNCTION DBWRITEFIELD(*FID:TEXT; SOURCE:DBWRKINDEX):DBERRTYPE*);
  105. (*access to Pascal's WRITE referring to the item currently pointed to
  106.     in the source workarea; output is to file FID*)
  107. VAR FP:FLDDESPTR;
  108.   S:STRING[255];
  109.   IA:REFLIST;
  110. BEGIN
  111.   DBWRITEFIELD:=0;
  112.   WITH WRKTABLE[SOURCE] DO
  113.     WITH WIB^[TOS] DO
  114.       BEGIN
  115.         IF LEVEL <> FIELDT THEN
  116.           DBWRITEFIELD:=28 (*can't write out a whole group*)
  117.         ELSE
  118.           BEGIN
  119.             FP:=ACTIVEFIELDS[DESCRIPTORNUM];
  120.             IF FP=NIL THEN
  121.               DBWRITEFIELD:=29
  122.             ELSE
  123.               WITH FP^ DO
  124.                 CASE FLDTYPE OF
  125.                   GROUPF: DBWRITEFIELD:=28;
  126.                   STRINGF:
  127.                     BEGIN
  128. (*$R-*)
  129.                       MOVELEFT(WA^[OFFSET],S,LINKVALUE(WA,OFFSET));
  130. (*$R+*)
  131.                       DELETE(S,LENGTH(S),1); (*correct for link*)
  132.                       WRITE(FID,S);
  133.                     END;
  134.                   INTEGERF:
  135.                     BEGIN
  136. (*$R-*)
  137.                       MOVELEFT(WA^[OFFSET+GETFOFFSET(SOURCE)],IA[0],2);
  138. (*$R+*)
  139.                       WRITE(FID,IA[0]);
  140.                     END;
  141.                   BYTEF,LONGINTF,TEXTF: DBWRITEFIELD:=12; (*not implemented*)
  142.                   ADDRCOUPLEF,SETF: DBWRITEFIELD:=30
  143.                 END (*CASE*);
  144.           END (*LEVEL=FIELDT*);
  145.       END (*WITH WIB*);
  146. END (*DBWRITEFIELD*);
  147.  
  148. PROCEDURE DBGETDESCRIPTOR(*LEVEL:DBLEVELTYPE; 
  149.                            DESCRIPTORNUM:INTEGER;
  150.                            VAR PTR:FLDDESPTR)*);
  151. (*used to pass descriptors to external programs. to avoid excessive
  152.   interface symbol table, TRIX record is used to pass pointer as
  153.   FLDDESPTR. external program is expected to declare its own records
  154.   corresponding to RECORDT and GROUPT since they are not in the interface
  155.   part*)
  156. TYPE
  157.   TRIXPTR=
  158.     RECORD CASE DBLEVELTYPE OF
  159.       FIELDT: (F:FLDDESPTR);
  160.       RECORDT:(R:RECDESPTR);
  161.       GROUPT: (G:GRPDESPTR)
  162.     END;
  163. VAR TP:TRIXPTR;
  164. BEGIN
  165.   IF DESCRIPTORNUM < 0 THEN
  166.     TP.F := NIL
  167.   ELSE
  168.     CASE LEVEL OF
  169.       FIELDT:  TP.F:=ACTIVEFIELDS[DESCRIPTORNUM];
  170.       RECORDT: TP.R:=ACTIVERECORDS[DESCRIPTORNUM];
  171.       GROUPT:  TP.G:=ACTIVEGROUPS[DESCRIPTORNUM]
  172.     END (*CASES*);
  173.   PTR:=TP.F;
  174. END (*DBGETDESCRIPTOR*);
  175.  
  176. FUNCTION DBTAG(*NAME:STRING; SOURCE:DBWRKINDEX; VAR ITEMNUM:INTEGER):DBERRTYPE*);
  177. (*search the current level for a descriptor corresponding to NAME*)
  178. BEGIN
  179. END (*DBTAG*);
  180.  
  181.  
  182. (**WORKAREA PRIMITIVES*)
  183. FUNCTION DBWRKOPEN(*WI:DBWRKINDEX; SIZE:INTEGER):DBERRTYPE*);
  184. CONST WADELTA=64;
  185. (*open a workarea for business*)
  186. VAR I:INTEGER;
  187.   P:WAPTR;
  188. BEGIN
  189.   DBWRKOPEN:=0;
  190.   WITH WRKTABLE[WI] DO
  191.     IF (SIZE <= 0) OR (SIZE > (PAGELASTBYTE+1)) THEN
  192.       DBWRKOPEN:=2 (*size out of range*)
  193.     ELSE
  194.       IF (WA <> NIL) OR (WIB<>NIL) THEN
  195.         DBWRKOPEN:=3 (*workarea already open*)
  196.       ELSE
  197.         IF NOT CHECKHEAP(SIZE+SIZEOF(WIBTYPE)) THEN
  198.           DBWRKOPEN:=1 (*insufficient memory*)
  199.         ELSE
  200.           BEGIN  (*should be safe - do it*)
  201.             NEW(WIB);
  202.             NEW(WA); (*allocates WADELTA bytes - minimum wa size*)
  203.             IF SIZE > WADELTA THEN
  204.               I:=HEAPALLOCATE(SIZE-WADELTA); (*already checked for error*)
  205.             WSIZE:=MAX(WADELTA,SIZE);
  206.             ZEROWORKAREA(WI);
  207.           END;
  208. END (*DBWRKOPEN*);
  209.  
  210. FUNCTION DBWRKCLOSE(*WI:DBWRKINDEX):DBERRTYPE*);
  211. BEGIN
  212. END (*DBWRKCLOSE*);
  213.  
  214.  
  215. (**FILE PRIMITIVES*)
  216. FUNCTION DBFOPEN(*FNUM:DBFILENUM; TITLE:STRING):DBERRTYPE*);
  217. BEGIN
  218.   DBFOPEN:=0;
  219. (*$I-*)
  220.   CASE FNUM OF
  221.     0: RESET(F0,TITLE);
  222.     1: RESET(F1,TITLE);
  223.     2: RESET(F2,TITLE);
  224.     3: RESET(F3,TITLE);
  225.     4: RESET(F4,TITLE)
  226.   END (*CASE*);
  227.   DBIORESULT:=IORESULT;
  228.   IF DBIORESULT <> 0 THEN
  229.     DBFOPEN:=23 (*unable to open file*)
  230.   ELSE
  231.     OPENFILES[FNUM]:=TRUE;
  232. (*$I+*)
  233. END (*DBFOPEN*);
  234.  
  235. FUNCTION DBFCLOSE(*FNUM:DBFILENUM):DBERRTYPE*);
  236. BEGIN
  237.   DBFCLOSE:=0;
  238. (*$I-*)
  239.   CASE FNUM OF
  240.     0: CLOSE(F0);
  241.     1: CLOSE(F1);
  242.     2: CLOSE(F2);
  243.     3: CLOSE(F3);
  244.     4: CLOSE(F4)
  245.   END (*CASE*);
  246.   IF IORESULT <> 0 THEN
  247.     DBFCLOSE:=26; (*unable to close file*)
  248. (*$I+*)
  249. END (*DBFCLOSE*);
  250.  
  251. FUNCTION DBFCREATE(*FNUM:DBFILENUM; WASCRATCH:DBWRKINDEX;
  252.                                     SPEXTITLE,NEWTITLE:STRING):DBERRTYPE*);
  253. (*open a new database file; lock it into directory; if there is a non-empty
  254.   specification file fitle, copy the spex into the new file. uses wascratch
  255.   to initialize the file.  assumes wascratch will be associated with fnum
  256.   file*)
  257. VAR RSLT:INTEGER;
  258.  
  259.   PROCEDURE BLANKZEROPAGE(VAR F:FILETYPE);
  260.   VAR BLOCKCOUNT:INTEGER;
  261.   BEGIN
  262.     BLOCKCOUNT:=(PAGELASTBYTE+1) DIV 512;
  263.     RSLT:=BLOCKWRITE(F,WRKTABLE[WASCRATCH].WA^,BLOCKCOUNT,0);
  264.     DBFCREATE:=0;
  265.     IF RSLT <> BLOCKCOUNT THEN
  266.       DBFCREATE:=9
  267.     ELSE
  268. (*$I-*)
  269.       BEGIN
  270.         CLOSE(F,LOCK);
  271.         IF IORESULT <> 0 THEN
  272.           DBFCREATE:=10  (*unable to lock file*)
  273.         ELSE
  274.           BEGIN
  275.             RESET(F,NEWTITLE);
  276.             IF IORESULT <> 0 THEN
  277.               DBFCREATE:=11 (*unable to re-open the file*)
  278.             ELSE
  279.               OPENFILES[FNUM]:=TRUE;
  280.           END;
  281.       END (*RSLT = BLOCKCOUNT*);
  282.   END (*BLANKZEROPAGE*);
  283.  
  284. BEGIN (*DBFCREATE*)
  285.   RSLT:=CHECKWORKAREA(WASCRATCH,(PAGELASTBYTE+1));
  286.   IF RSLT<>0 THEN
  287.     DBFCREATE:=RSLT (*pass on error from checkworkarea*)
  288.   ELSE
  289.     IF OPENFILES[FNUM] THEN
  290.       DBFCREATE:=5 (*file already open and in use*)
  291.     ELSE
  292.       IF LENGTH(NEWTITLE) = 0 THEN
  293.         DBFCREATE:=6 (*requires non-nul title string*)
  294.   ELSE
  295. (*$I-*)
  296.     BEGIN
  297.       CASE FNUM OF
  298.         0: RESET(F0,NEWTITLE);
  299.         1: RESET(F1,NEWTITLE);
  300.         2: RESET(F2,NEWTITLE);
  301.         3: RESET(F3,NEWTITLE);
  302.         4: RESET(F4,NEWTITLE)
  303.       END (*CASE*);
  304.       RSLT:=IORESULT;
  305.   (*$I+*)
  306.       IF RSLT=0 THEN (*file already on disk*)
  307.         DBFCREATE:=4
  308.       ELSE
  309.         IF RSLT = 12 THEN (*file already open, but not caught above*)
  310.           DBFCREATE:=99 (*system error*)
  311.     ELSE
  312.       BEGIN
  313.   (*$I-*)
  314.         CASE FNUM OF
  315.           0: REWRITE(F0,NEWTITLE);
  316.           1: REWRITE(F1,NEWTITLE);
  317.           2: REWRITE(F2,NEWTITLE);
  318.           3: REWRITE(F3,NEWTITLE);
  319.           4: REWRITE(F4,NEWTITLE)
  320.         END (*CASE*);
  321.         RSLT:=IORESULT;
  322.   (*$I+*)
  323.         IF RSLT <> 0 THEN
  324.           DBFCREATE:=7 (*rewrite failure*)
  325.         ELSE
  326.           IF LENGTH(SPEXTITLE) = 0 THEN
  327.             BEGIN  (*ok to create the file now*)
  328.               ZEROWORKAREA(WASCRATCH);
  329.               CASE FNUM OF
  330.                 0: BLANKZEROPAGE(F0);
  331.                 1: BLANKZEROPAGE(F1);
  332.                 2: BLANKZEROPAGE(F2);
  333.                 3: BLANKZEROPAGE(F3);
  334.                 4: BLANKZEROPAGE(F4)
  335.               END (*CASE*);
  336.             END (*LENGTH(SPEXTITLE) = 0*)
  337.           ELSE
  338.             DBFCREATE:=12; (*spexfile transfer not yet implemented*)
  339.       END (*RSLT <> 12*);
  340.     END (*LENGTH(NEWTITLE) <> 0*);
  341. END (*DBFCREATE*);
  342.  
  343. FUNCTION DBFREMOVE(*FNUM:DBFILENUM):DBERRTYPE*);
  344. BEGIN
  345.   DBFREMOVE:=0;
  346. (*$I-*)
  347.   CASE FNUM OF
  348.     0: CLOSE(F0,PURGE);
  349.     1: CLOSE(F1,PURGE);
  350.     2: CLOSE(F2,PURGE);
  351.     3: CLOSE(F3,PURGE);
  352.     4: CLOSE(F4,PURGE)
  353.   END (*CASE*);
  354.   IF IORESULT <> 0 THEN
  355.     DBFREMOVE:=22
  356.   ELSE
  357.     OPENFILES[FNUM]:=FALSE;
  358. (*$I+*)
  359. END (*DBFREMOVE*);
  360.  
  361. FUNCTION DBGETPAGE(*FNUM:DBFILENUM; DESTINATION:DBWRKINDEX;
  362.                                    PAGENUM:INTEGER):DBERRTYPE*);
  363. VAR BLOCKSMOVED,BLOCKSINPAGE,LINKV,LX,DUMMY:INTEGER;
  364.  
  365.   PROCEDURE MOVEWA(VAR F:FILETYPE);
  366.   BEGIN
  367.     BLOCKSMOVED:=BLOCKREAD(F,WRKTABLE[DESTINATION].WA^,
  368.                                     BLOCKSINPAGE, (PAGENUM*BLOCKSINPAGE));
  369.   END;
  370.  
  371. BEGIN
  372.   DBGETPAGE:=DBHOME(DESTINATION);
  373.   BLOCKSINPAGE:=(PAGELASTBYTE+1) DIV 512;
  374.   WITH WRKTABLE[DESTINATION] DO
  375.     CASE FNUM OF
  376.       0: MOVEWA(F0);
  377.       1: MOVEWA(F1);
  378.       2: MOVEWA(F2);
  379.       3: MOVEWA(F3);
  380.       4: MOVEWA(F4)
  381.     END (*CASE*);
  382.   IF BLOCKSMOVED <> BLOCKSINPAGE THEN
  383.     DBGETPAGE:=25
  384.   ELSE
  385.     WITH WRKTABLE[DESTINATION] DO
  386.       BEGIN
  387.         (*get SPACEINUSE by following links to end*)
  388.         LX:=0;
  389.         LINKV:=LINKVALUE(WA,0);
  390.         WHILE LINKV<>0 DO
  391.           BEGIN
  392.             LX:=LX+LINKV;
  393.             LINKV:=LINKVALUE(WA,LX);
  394.           END;
  395.         SPACEINUSE:=LX+1;
  396.         WITH WIB^[0] DO
  397.           BEGIN
  398.             LINKV:=LINKVALUE(WA,0);
  399.             DESCRIPTORNUM:=LINKVALUE(WA,LINKSIZE(LINKV)); (*tag*)
  400.           END;
  401.       END (*WITH WRKTABLE*);
  402. END (*DBGETPAGE*);
  403.  
  404. FUNCTION DBPUTPAGE(*FNUM:DBFILENUM; SOURCE:DBWRKINDEX;
  405.                                    PAGENUM:INTEGER):DBERRTYPE*);
  406. VAR BLOCKSMOVED,BLOCKSINPAGE:INTEGER;
  407.  
  408.   PROCEDURE MOVEWA(VAR F:FILETYPE);
  409.   BEGIN
  410.     BLOCKSMOVED:=BLOCKWRITE(F,WRKTABLE[SOURCE].WA^,
  411.                           BLOCKSINPAGE, (PAGENUM*BLOCKSINPAGE));
  412.   END;
  413.  
  414. BEGIN
  415.   DBPUTPAGE:=0;
  416.   BLOCKSINPAGE:=(PAGELASTBYTE+1) DIV 512;
  417.   WITH WRKTABLE[SOURCE] DO
  418.     CASE FNUM OF
  419.       0: MOVEWA(F0);
  420.       1: MOVEWA(F1);
  421.       2: MOVEWA(F2);
  422.       3: MOVEWA(F3);
  423.       4: MOVEWA(F4)
  424.     END (*CASE*);
  425.   IF BLOCKSMOVED <> BLOCKSINPAGE THEN
  426.     DBPUTPAGE:=24;
  427. END (*DBPUTPAGE*);
  428.  
  429.  
  430. (**DESCRIPTOR INITIALIZING PRIMITIVES*)
  431. FUNCTION DBGROUPINIT(*FNUM:DBFILENUM; VAR GROUPNUM:INTEGER;
  432.                      GROUPNAME:STRING):DBERRTYPE*);
  433. (*load the descriptor lists from groups 1,2,3 of the database using
  434.   workarea 0 as temporary store. note: these groups may extend over
  435.   more than one page*)
  436. CONST
  437.   WA0=0; (*work area #0*)
  438. VAR GN,LINKV,PAGENUM,DUMMY:INTEGER;
  439.  
  440.   PROCEDURE LOADDESCRIPTORS(LVL:DBLEVELTYPE);
  441.   VAR GPTR:GRPDESPTR;
  442.     RPTR:RECDESPTR;
  443.     FPTR:FLDDESPTR;
  444.   BEGIN
  445.     WITH WRKTABLE[WA0] DO
  446.       WITH WIB^[TOS] DO
  447.         BEGIN
  448.           GN:=0;
  449.           LINKV:=LINKVALUE(WA,OFFSET);
  450.           WHILE LINKV > 2 (*ignore empty dummy records*) DO
  451.             BEGIN
  452.               CASE LVL OF
  453.                 GROUPT:
  454.                   BEGIN
  455.                     NEW(GPTR);
  456.                     DBSHOWERR('GROUPINIT(G)',
  457.                               HEAPALLOCATE(LINKV-SIZEOF(GRPDESCRIPTOR)));
  458.       (*$R-*)
  459.                     MOVELEFT(WA^[OFFSET],GPTR^,LINKV);
  460.       (*$R+*)
  461.                     ACTIVEGROUPS[GN]:=GPTR;
  462.                   END (*GROUPT*);
  463.                 RECORDT:
  464.                   BEGIN
  465.                     NEW(RPTR);
  466.                     DBSHOWERR('GROUPINIT(R)',
  467.                               HEAPALLOCATE(LINKV-SIZEOF(RECDESCRIPTOR)));
  468.       (*$R-*)
  469.                     MOVELEFT(WA^[OFFSET],RPTR^,LINKV);
  470.       (*$R+*)
  471.                     ACTIVERECORDS[GN]:=RPTR;
  472.                   END (*RECORDT*);
  473.                 FIELDT:
  474.                   BEGIN
  475.                     NEW(FPTR);
  476.                     DBSHOWERR('GROUPINIT(F)',
  477.                               HEAPALLOCATE(LINKV-SIZEOF(FLDDESCRIPTOR)));
  478.       (*$R-*)
  479.                     MOVELEFT(WA^[OFFSET],FPTR^,LINKV);
  480.       (*$R+*)
  481.                     ACTIVEFIELDS[GN]:=FPTR;
  482.                   END (*FIELDT*)
  483.               END (*CASE*);
  484.               DUMMY:=DBNEXT(WA0);
  485.               LINKV:=LINKVALUE(WA,OFFSET);
  486.               IF LINKV <> 0 THEN GN:=GN+1;
  487.             END (*WHILE*);
  488.         END (*WITH*);
  489.   END (*LOADDESCRIPTORS*);
  490.   
  491.   PROCEDURE NEWPAGE;
  492.   BEGIN
  493.     PAGENUM:=PAGENUM+1;
  494.     DBSHOWERR('GROUPINIT#2',DBGETPAGE(FNUM,WA0,PAGENUM));
  495.   END (*NEWPAGE*);
  496.                      
  497. BEGIN (*DBGROUPINIT*)
  498.   DBGROUPINIT:=0;
  499.   (*initially load all descriptors - selection to be added later*)
  500.   IF GROUPNAME <> 'ALL' THEN
  501.     DBGROUPINIT:=12;
  502.   (*loads descriptor groups into WA0*)
  503.   PAGENUM:=-1;
  504.   NEWPAGE;
  505.   SPECIALGROUPPAGE[1]:=PAGENUM;
  506.   DUMMY:=DBHOME(WA0);
  507.   DUMMY:=DBNEXT(WA0); (*go to head of group descriptor list*)
  508.   DUMMY:=DBDESCEND(WA0); (*head of 1st record*)
  509.   WITH WRKTABLE[WA0] DO
  510.     WITH WIB^[TOS] DO
  511.       BEGIN
  512.         LOADDESCRIPTORS(GROUPT);
  513.         GROUPNUM:=GN;
  514.         (*now load record descriptors*)
  515.         DUMMY:=DBHOME(WA0);
  516.         IF DBSEEK(WA0,2(*RD'S*)) <> 0 THEN NEWPAGE;
  517.         SPECIALGROUPPAGE[2]:=PAGENUM;
  518.         DUMMY:=DBDESCEND(WA0);
  519.         LOADDESCRIPTORS(RECORDT);
  520.         (*now fields*)
  521.         DUMMY:=DBHOME(WA0);
  522.         IF DBSEEK(WA0,3(*FD'S*)) <> 0 THEN NEWPAGE;
  523.         SPECIALGROUPPAGE[3]:=PAGENUM;
  524.         DUMMY:=DBDESCEND(WA0);
  525.         LOADDESCRIPTORS(FIELDT);
  526.       END (*WITH WIB*);
  527. END (*DBGROUPINIT*);
  528.  
  529. FUNCTION DBGROUPRELEASE(*GROUPNUM:INTEGER):DBERRTYPE*);
  530. (*de-allocate storage for the designated group descriptors, and
  531.   their dependent record and field descriptors*)
  532. BEGIN
  533. END (*DBGROUPRELEASE*);
  534.  
  535.  
  536. (**INITIALIZATION*)
  537. PROCEDURE DBINITIALIZE;
  538. VAR WI:INTEGER;
  539. BEGIN
  540.   FOR WI:=0 TO LASTFILENUM DO OPENFILES[WI]:=FALSE;
  541.   FOR WI:=0 TO LASTWRKINDEX DO
  542.     WITH WRKTABLE[WI] DO
  543.       BEGIN
  544.         TOS:=0;
  545.         WIB:=NIL;
  546.         WSIZE:=0;
  547.         SPACEINUSE:=0;
  548.         WA:=NIL;
  549.       END;
  550.   FOR WI:=0 TO LASTSPECIALGROUP DO SPECIALGROUPPAGE[WI]:=0;
  551.   FOR WI:=0 TO LASTGROUPDESCRIPTOR DO ACTIVEGROUPS[WI]:=NIL;
  552.   FOR WI:=0 TO LASTRECDESCRIPTOR DO ACTIVERECORDS[WI]:=NIL;
  553.   FOR WI:=0 TO LASTFIELDDESCRIPTOR DO ACTIVEFIELDS[WI]:=NIL;
  554.   MARK(HEAPMARKER);
  555.   WI:=DBWRKOPEN(0,(PAGELASTBYTE+1)); (*open wa # 0 for full page*)
  556.   DBTYPECHECK:=TRUE;
  557.   
  558.   (*following lines are for debugging*)
  559.   DEBUGGING:=FALSE;
  560.   DBTRACESET:=[ ];
  561.   TRACELB:=0;
  562.   TRACEUB:=99;
  563. END (*DBINITIALIZE*);
  564.  
  565.  
  566. (**ORDERLY TERMINATION*)
  567. FUNCTION DBCLOSEDOWN(*:DBERRTYPE*);
  568. BEGIN
  569. END (*DBCLOSEDOWN*);
  570.  
  571.  
  572.  
  573. END. (*END OF DBUNIT*)
  574.  
  575.