*DECK DB$BALT 
USETEXT BRGENTX 
      PROC DB$BALT( (EXTINDEX) ); 
      BEGIN 
 #
* *   DB$BALT -                                  PAGE  1
* *   ALLOCATE TRANSACTION RECOVERY FILES 
* *   E. P. JOHNSON                              DATE  03/19/81 
* * 
* 
* DC  PURPOSE 
* 
*     TO PRESET THE TRANSACTION RECOVERY FILES AND TO 
*     INITIALIZE THE HEADERS. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM EXTINDEX I;                 # INDEX INTO THE EXECUTION TABLE#
# 
* DC  ASSUMPTIONS 
* 
*     MDSCDIR                MD SCHEMA DIRECTORY TABLE HAS BEEN READ IN.
*     MDSCINFO               MD SCHEMA INFORMATION TABLE HAS BEEN 
*                            READ IN. 
*     PRESETBUF              THE LOCATION OF THE PRESET BUFFER IS SET.
*     SDTINDX                THE INDEX INTO THE MD SCHEMA DIRECTORY 
*                            TABLE IS SET.
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL - THE SPECIFIED NUMBER OF FILES HAVE BEEN ALLOCATED
*              WITHOUT ERROR. 
* 
*     ABNORMAL - AT LEAST ONE OF THE FILES TO BE ALLOCATED HAS
*               HAD ONE OF THE FOLLOWING ERRORS:  
* 
*               (1) IF A FILE WAS NOT SUCCESSFULLY ATTACHED, THEN 
*                  ISSUE ERROR MESSAGE DFERR05 AND CONTINUE WITH
*                  THE NEXT FILE. 
* 
*               (2) IF AN ERROR OCCURRED WHILE PRESETTING A FILE, THEN
*                  ISSUE ERROR MESSAGE DFERR03, RETURN THE FILE AND 
*                  CONTINUE WITH THE NEXT FILE. 
* 
*               (3) IF AN ERROR OCCURRED DURING A REWIND, THEN ISSUE
*                  ERROR MESSAGE DFERR02, RETURN THE FILE AND 
*                  CONTINUE WITH THE NEXT FILE. 
* 
*               (4) IF AN ERROR OCCURRED WHILE REWRITING THE HEADER 
*                  AND THE ART, THEN ISSUE ERROR MESSAGE DFERR03, 
*                  RETURN THE FILE AND CONTINUE WITH THE NEXT FILE. 
* 
*               (5) IF AN ERROR OCCURRED DURING THE EXTEND OF THE FILE, 
*                  THEN ISSUE ERROR MESSAGE DFERR04, RETURN THE FILE
*                  AND CONTINUE WITH THE NEXT FILE. 
* 
* DC  CALLING ROUTINES
* 
*     DB$BALL                ALLOCATE DIRECTIVE 
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC CLOCK C(10);           # OBTAIN SYSTEM TIME.           #
      XREF FUNC DATE C(10);            # OBTAIN SYSTEM DATE.           #
      XREF PROC DB$ATWR;               # ATTACH PROCESSOR.             #
      XREF PROC DB$BERR;               # DBREC ERROR PROCESSOR.        #
      XREF PROC DB$BURP;               # USER REPORT GENERATOR.        #
      XREF PROC DB$EXT;                # EXTEND NOS/BE PERM FILES.     #
      XREF PROC DB$IORW;               # CIO REWIND.                   #
      XREF PROC DB$IOWR;               # CIO REWRITER.                 #
      XREF PROC DB$PRST;               # WRITE PRESET.                 #
      XREF PROC DB$RCLL;               # WAIT FOR I/O TO COMPLETE.     #
      XREF PROC DB$RTN;                # CIO RETURN.                   #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     FET                    THE FET USED FOR TRF I/O.
*     INSERTITEMI            SPECIAL MESSAGE TEXT FORMATTER INTEGER 
*                            INSERTION ITEM.
*     P<MDPIT>               PERMANENT FILE INFORMATION TABLE BASED 
*                            ARRAY POINTER. 
*         MDPITNAME          PERMANENT FILE NAME. 
* 
* DC  DESCRIPTION 
* 
*     - COMPUTE THE SIZE OF A TRANSACTION RECOVERY FILE (TRF) SEGMENT 
*       IN PRUS BY USING THE UPDATE LIMIT, THE AFTER IMAGE MULTIPLIER 
*       (1 IF NO AFTER IMAGE LOGGING, 2 IF AFTER IMAGE LOGGING), AND
*       THE MAXIMUM RECORD LENGTH OF THE JOURNAL LOG FILE.
* 
*     - COMPUTE THE SIZE OF THE TRF IN WORDS BY USING THE UNIT LIMIT
*       AND THE SEGMENT SIZE. 
* 
*     - COMPUTE THE SIZE OF THE AUTOMATIC RECOVERY TABLE (ART) IN WORDS 
*       BY USING THE UNIT LIMIT, THE ART ENTRY SIZE AND THE ART HEADER
*       SIZE. 
* 
*     - COMPUTE THE TOTAL SIZE TO BE ALLOCATED FOR THE TRF, BY USING
*       THE TRF SIZE, THE ART SIZE (COMPUTED TO AN EVEN NUMBER OF PRUS) 
*       AND A PRU FOR THE TRF HEADER. 
* 
*     - SET THE BASED ARRAY POINTER OF THE TRANSACTION RECOVERY 
*       PERMANENT FILE INFORMATION TABLE. 
* 
*     - IF A FILE NUMBER IS SPECIFIED IN THE EXECUTION TABLE, THEN SET
*       THE ALLOCATION LOOP LIMITS FOR THE ALLOCATION OF ONE FILE. ELSE,
*       SET THE LOOP LIMITS FOR THE ALLOCATION OF ALL FILES.
* 
*     - LOOP UNTIL THE SPECIFIED NUMBER OF FILES HAVE BEEN ALLOCATED. 
* 
*     - APPEND THE FILE NUMBER (LOOP VARIABLE) ONTO THE PERMANENT 
*       FILE NAME.
* 
*     - TRY TO ATTACH THE FILE. 
* 
*     - IF THE FILE WAS NOT SUCCESSFULLY ATTACHED, THEN ISSUE AN
*       ERROR MESSAGE AND CONTINUE WITH THE NEXT FILE.
* 
*     - INITIALIZE THE FET USING THE MODEL TRANSACTION RECOVERY FILE
*       FET.
* 
*     - PRESET THE FILE FOR THE NUMBER OF WORDS SPECIFIED.
* 
*     - IF AN ERROR OCCURRED WHILE PRESETTING THE FILE, THEN ISSUE
*       AN ERROR MESSAGE, RETURN THE FILE AND CONTINUE WITH 
*       THE NEXT FILE.
* 
*     - REWIND THE FILE.
* 
*     - IF AN ERROR OCCURRED DURING THE REWIND, THEN ISSUE AN ERROR 
*       MESSAGE, RETURN THE FILE AND CONTINUE WITH THE NEXT FILE. 
* 
*     - INITIALIZE THE HEADER OF THE FILE.
* 
*     - SET THE BASED ARRAY POINTER OF THE ART TO THE START OF THE
*       SECOND PRU OF THE PRESET BUFFER. CDCS ASSUMES THAT THE ART
*       BEGINS IN THE SECOND PRU OF THE FILE. 
* 
*     - INITIALIZE THE ART HEADER.
* 
*     - INITIALIZE THE ART ENTRIES. 
* 
*     - REWRITE THE HEADER RECORD AND THE ART.
* 
*     - IF AN ERROR OCCURRED WHILE REWRITING THE HEADER AND THE ART,
*       THEN ISSUE AN ERROR MESSAGE, RETURN THE FILE AND CONTINUE 
*       THE NEXT FILE.
* 
*     - ISSUE A SYSTEM PERMANENT FILE EXTEND REQUEST. 
* 
*     - IF AN ERROR OCCURRED DURING THE EXTEND OF THE FILE, THEN ISSUE
*       AN ERROR MESSAGE, RETURN THE FILE AND CONTINUE WITH THE 
*       NEXT FILE.
* 
*     - RETURN THE FILE.
* 
*     - PRINT A SUCCESSFUL ALLOCATION MESSAGE ON THE DBREC OUTPUT FILE. 
* 
*     - CONTINUE WITH THE NEXT FILE.
* 
*     - RETURN TO THE CALLER. 
* 
 #
  
# LOCAL VARIABLES.                                                     #
  
      ITEM AFTMLT    I;                # AFTER IMAGE MULTIPLIER.       #
      ITEM ARTSIZE   I;                # SIZE OF THE ART IN WORDS.     #
      ITEM ATTACHSTATUS I;             # STATUS OF AN ATTACH.          #
      ITEM DATETIME  C(10);            # FOR SYSTEM DATE AND TIME      #
                                       # REQUEST.                      #
      ITEM EXTENDSTATUS I;             # STATUS OF EXTEND REQUEST.     #
      ITEM FIRSTFILE I;                # THE NUMBER OF THE FIRST FILE  #
                                       # TO ALLOCATE.                  #
      ITEM I         I;                # LOOP VARIABLE.                #
      ITEM INDEX     I;                # LOOP VARIABLE.                #
      ITEM LASTFILE  I;                # THE NUMBER OF THE LAST FILE   #
                                       # TO ALLOCATE.                  #
      ITEM NUMWORDS  I;                # THE NUMBER OF WORDS NECESSARY #
                                       # TO REWRITE THE HEADER AND THE #
                                       # ART ONTO THE TRF.             #
      ITEM SEGSIZE   I;                # NUMBER OF PRUS PER SEGMENT.   #
      ITEM SIZE      I;                # TOTAL SIZE TO ALLOCATE.       #
      ITEM TRFSIZE   I;                # SIZE OF THE TRF IN WORDS.     #
  
*CALL ARTDCLS 
  
*CALL TRFDCLS 
  
# EXTERNALLY REFERENCED ARRAYS.                                        #
  
      XREF ARRAY DB$LFET;              # MODEL TRF FET.                #
        BEGIN 
        ITEM TRFETWD U(00,00,60); 
        END 
  
  
  
# S T A R T   O F   D B $ B A L T   E X E C U T A B L E   C O D E      #
  
  
# COMPUTE THE SIZE OF A TRANSACTION RECOVERY FILE (TRF) SEGMENT IN PRUS#
# BY USING THE UPDATE LIMIT, THE AFTER IMAGE MULTIPLIER (1 IF NO AFTER #
# IMAGE LOGGING, 2 IF AFTER IMAGE LOGGING), AND THE MAXIMUM RECORD     #
# LENGTH OF THE JOURNAL LOG FILE.                                      #
  
      IF MDSCNBAFTIM[SDTINDX] EQ 0     # COMPUTE THE AFTER IMAGE       #
                                       # MULTIPLIER.                   #
      THEN
        BEGIN 
        AFTMLT = 1;                    # NO AFTER IMAGE LOGGING.       #
        END 
      ELSE
        BEGIN 
        AFTMLT = 2;                    # AFTER IMAGE LOGGING.          #
        END 
  
      IF MDSCMAXLXL[SDTINDX]           # IF EXTRA LARGE MAXIMUM RECORD #
      THEN
        BEGIN 
        SEGSIZE = 
          ((MDSIUPDL[0]*AFTMLT*MDSCMAXLOG[SDTINDX]*8)+DFPRUSIZ+1) 
          /DFPRUSIZ;
        END 
      ELSE
        BEGIN 
        SEGSIZE = 
          ((MDSIUPDL[0]*(AFTMLT*((MDSCMAXLOG[SDTINDX]+9)/10)))
          +DFPRUSIZ+1)/DFPRUSIZ;
        END 
  
  
# COMPUTE THE SIZE OF THE TRF IN WORDS BY USING THE UNIT LIMIT AND     #
# THE SEGMENT SIZE.                                                    #
  
      TRFSIZE = MDSIUNIL[0] * SEGSIZE * DFPRUSIZ; 
  
# COMPUTE THE SIZE OF THE AUTOMATIC RECOVERY TABLE (ART) IN WORDS.     #
  
      ARTSIZE = (MDSIUNIL[0] * DFARTENSIZE) + DFARTHDSIZE;
  
# COMPUTE THE TOTAL SIZE TO BE ALLOCATED FOR THE TRF, BY USING THE     #
# TRF SIZE, THE ART SIZE (COMPUTED TO AN EVEN NUMBER OF PRUS) AND A    #
# PRU FOR THE TRF HEADER.                                              #
  
      SIZE = TRFSIZE + (((ARTSIZE + DFPRUSIZ) / DFPRUSIZ) * DFPRUSIZ) 
             + DFPRUSIZ;
  
# COMPUTE THE NUMBER OF WORDS NECESSARY TO REWRITE THE HEADER PRU AND  #
# THE ART ONTO THE TRF.                                                #
  
      NUMWORDS = DFPRUSIZ + ARTSIZE;
  
# SET THE BASED ARRAY POINTER OF THE TRANSACTION RECOVERY              #
# PERMANENT FILE INFORMATION TABLE.                                    #
  
      P<MDPIT> = LOC(MDSCINFO) + MDSITRFP[0]; 
  
# IF A FILE NUMBER IS SPECIFIED IN THE EXECUTION TABLE, THEN SET THE   #
# ALLOCATION LOOP LIMITS FOR THE ALLOCATION OF ONE FILE. ELSE, SET THE #
# LOOP LIMITS FOR ALLOCATION OF ALL FILES.                             #
  
      IF EXTRNUM[EXTINDEX] GR 0 
      THEN
        BEGIN 
        LASTFILE = EXTRNUM[EXTINDEX]; 
        FIRSTFILE = LASTFILE; 
        END 
      ELSE
        BEGIN 
        LASTFILE = MDSITRFN[0]; 
        FIRSTFILE = 1;
        END 
  
# LOOP UNTIL THE SPECIFIED NUMBER OF FILES HAVE BEEN ALLOCATED.        #
  
      FOR I = FIRSTFILE STEP 1 UNTIL LASTFILE 
      DO
        BEGIN 
  
# APPEND THE FILE NUMBER (LOOP VARIABLE) ONTO THE PERMANENT FILE NAME. #
  
        C<6,1>MDPITNAME[0] = I + O"33"; 
  
# TRY TO ATTACH THE FILE.                                              #
  
        DB$ATWR(B<0,42>MDPITNAME[0],MDPIT,ATTACHSTATUS);
  
# IF THE FILE WAS NOT SUCCESSFULLY ATTACHED, THEN ISSUE AN ERROR       #
# MESSAGE AND CONTINUE WITH THE NEXT FILE.                             #
  
        IF ATTACHSTATUS NQ 0
        THEN
          BEGIN 
          INSERTITEMI = ATTACHSTATUS; 
          DB$BERR(DFERR05); 
          TEST;                        # CONTINUE WITH THE NEXT FILE.  #
  
          END 
  
# INITIALIZE THE FET USING THE MODEL TRANSACTION RECOVERY FILE FET.    #
  
        FOR INDEX = DFFETLEN - 1 STEP - 1 UNTIL 0 
        DO
          BEGIN 
          FETLFNWD[INDEX] = TRFETWD[INDEX]; 
          END 
  
        FETLFN[0] = MDPITNAME[0]; 
  
# PRESET THE FILE FOR THE NUMBER OF WORDS SPECIFIED.                   #
  
        FETFIRST[0] = PRESETBUF;       # SET FETFIRST TO THE LOCATION  #
                                       # OF THE PRESET BUFFER.         #
  
        FETLIMIT[0] = FETFIRST[0] + DFPRESETBUF;
                                       # SET FETLIMIT TO THE LOCATION  #
                                       # OF THE PRESET BUFFER PLUS THE #
                                       # LENGTH OF THE PRESET BUFFER.  #
  
        DB$PRST(LOC(FET),SIZE,FALSE); 
  
# IF AN ERROR OCCURRED WHILE PRESETING THE FILE, THEN ISSUE AN ERROR   #
# MESSAGE, RETURN THE FILE AND CONTINUE WITH THE NEXT FILE.            #
  
        IF FETNOSAT[0] NQ 0 
        THEN
          BEGIN 
          DB$BERR(DFERR03); 
          DB$RTN(FETLFNU[0]); 
          TEST;                        # CONTINUE WITH THE NEXT FILE.  #
  
          END 
  
# REWIND THE FILE.                                                     #
  
        DB$IORW(LOC(FET));
        DB$RCLL(LOC(FET));             # WAIT FOR THE REWIND TO        #
                                       # COMPLETE.                     #
  
# IF AN ERROR OCCURRED DURING THE REWIND, THEN ISSUE AN ERROR          #
# MESSAGE, RETURN THE FILE AND CONTINUE WITH THE NEXT FILE.            #
  
        IF FETNOSAT[0] NQ 0 
        THEN
          BEGIN 
          DB$BERR(DFERR02); 
          DB$RTN(FETLFNU[0]); 
          TEST;                        # CONTINUE WITH THE NEXT FILE.  #
  
          END 
  
# INITIALIZE THE HEADER OF THE FILE.                                   #
  
        P<TRHDREC> = PRESETBUF; 
  
        TRHDSCNAME[0] = MDSCNAME[SDTINDX];
        TRHDCDATE[0] = DATE(DATETIME);
        TRHDCTIME[0] = CLOCK(DATETIME); 
        TRHDSEG[0] =  MDSIUNIL[0];
        TRHDPRU[0] =  SEGSIZE;
  
# SET THE BASED ARRAY POINTER OF THE ART TO THE START OF THE           #
# SECOND PRU OF THE PRESET BUFFER.                                     #
  
        P<ART> = LOC(TRHDREC) + DFPRUSIZ; 
  
# INITIALIZE THE ART HEADER.                                           #
  
        ARNPRU[0] = SEGSIZE;
        ARMODFET[0] = 0;
        ARNTRF[0] = MDSITRFN[0];
        ARNTUP[0] = MDSIUPDL[0];
        ARNTUN[0] = MDSIUNIL[0];
        ARLARID[0] = "AAAAA     ";
  
# INITIALIZE THE ART ENTRIES.                                          #
  
        FOR INDEX = 1 STEP 1 UNTIL MDSIUNIL[0]
        DO
          BEGIN 
          ARBCID[INDEX] = " ";
          ARURID[INDEX] = " ";
          ARTRCS[INDEX] = FALSE;
          ARTRN[INDEX] = I; 
          ARCURUP[INDEX] = 0; 
          ARFETPTR[INDEX] = 0;
          END 
  
# REWRITE THE HEADER RECORD AND THE ART.                               #
  
        DB$IOWR(LOC(FET),P<TRHDREC>,NUMWORDS);
        DB$RCLL(LOC(FET));             # WAIT FOR THE REWRITE TO       #
                                       # COMPLETE.                     #
  
# IF AN ERROR OCCURRED WHILE REWRITING THE HEADER AND THE ART, THEN    #
# ISSUE AN ERROR MESSAGE, RETURN THE FILE AND CONTINUE WITH THE        #
# NEXT FILE.                                                           #
  
        IF FETNOSAT[0] NQ 0 
        THEN
          BEGIN 
          DB$BERR(DFERR03); 
          DB$RTN(FETLFNU[0]); 
          TEST;                        # CONTINUE WITH THE NEXT FILE.  #
  
          END 
  
# ISSUE A SYSTEM PERMANENT FILE EXTEND REQUEST. AN EXPLICIT EXTEND     #
# REQUEST IS ONLY REQUIRED ON NOS/BE. ON NOS THIS ROUTINE DOES NOTHING.#
  
        EXTENDSTATUS = 0; 
        DB$EXT(FETLFN[0],EXTENDSTATUS); 
  
# IF AN ERROR OCCURRED DURING THE EXTEND OF THE FILE, THEN ISSUE AN    #
# ERROR MESSAGE, RETURN THE FILE AND CONTINUE WITH THE NEXT FILE.      #
  
        IF EXTENDSTATUS NQ 0
        THEN
          BEGIN 
          INSERTITEMI = EXTENDSTATUS; 
          DB$BERR(DFERR04); 
          DB$RTN(FETLFNU[0]); 
          TEST;                        # CONTINUE WITH THE NEXT FILE.  #
  
          END 
  
# RETURN THE FILE.                                                     #
  
        DB$RTN(FETLFNU[0]); 
  
# PRINT A SUCCESSFUL ALLOCATION MESSAGE ON THE DBREC OUTPUT FILE.      #
  
        DB$BURP(DFURP03); 
  
        END                            # END OF ALLOCATION LOOP.       #
  
# RETURN TO THE CALLER.                                                #
  
      RETURN; 
  
      END 
      TERM
