*DECK DB$BALQ 
USETEXT BRGENTX 
      PROC DB$BALQ( (EXTINDEX) ); 
      BEGIN 
 #
* *   DB$BALQ -                                  PAGE  1
* *   ALLOCATE THE QUICK RECOVERY FILE
* *   E. P. JOHNSON                              DATE  03/24/81 
* * 
* 
* DC  PURPOSE 
* 
*     TO PRESET THE QUICK RECOVERY FILE AND TO INITIALIZE THE HEADER. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM EXTINDEX I;                 # INDEX INTO THE EXECUTION TABLE#
# 
*     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 FILE HAS BEEN ALLOCATED WITHOUT ERROR. 
* 
*     ABNORMAL - ONE OF THE FOLLOWING ERRORS HAS OCCURRED:  
* 
*               (1) IF THE FILE WAS NOT SUCCESSFULLY ATTACHED, THEN 
*                  ISSUE ERROR MESSAGE DFERR05 AND RETURN TO THE CALLER.
* 
*               (2) IF AN ERROR OCCURRED WHILE PRESETTING THE FILE, THEN
*                  ISSUE ERROR MESSAGE DFERR03, RETURN THE FILE AND 
*                  RETURN TO THE CALLER.
* 
*               (3) IF AN ERROR OCCURRED DURING THE REWIND, THEN ISSUE
*                  ERROR MESSAGE DFERR02, RETURN THE FILE AND RETURN
*                  TO THE CALLER. 
* 
*               (4) IF AN ERROR OCCURRED WHILE REWRITING THE HEADER,
*                  THEN ISSUE ERROR MESSAGE DFERR03, RETURN THE FILE
*                  AND RETURN TO THE CALLER.
* 
*               (5) IF AN ERROR OCCURRED DURING THE EXTEND OF THE FILE, 
*                  THEN ISSUE ERROR MESSAGE DFERR04, RETURN THE FILE
*                  AND RETURN TO THE CALLER.
* 
* DC  CALLING ROUTINES
* 
*     DB$BALL                ALLOCATE DIRECTIVE 
* 
* DC  CALLED ROUTINES 
# 
      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 QUICK RECOVERY FILE I/O.
*     INSERTITEMI            SPECIAL MESSAGE TEXT FORMATTER INTEGER 
*                            INSERTION ITEM.
*     P<MDPIT>               PERMANENT FILE INFORMATION TABLE BASED 
*                            ARRAY POINTER. 
* 
* DC  DESCRIPTION 
* 
*     - COMPUTE THE SIZE OF THE QUICK RECOVERY FILE IN WORDS. 
* 
*     - SET THE BASED ARRAY POINTER OF THE QUICK RECOVERY 
*       PERMANENT FILE INFORMATION TABLE. 
* 
*     - TRY TO ATTACH THE FILE. 
* 
*     - IF THE FILE WAS NOT SUCCESSFULLY ATTACHED, THEN ISSUE AN
*       ERROR MESSAGE AND RETURN TO THE CALLER. 
* 
*     - INITIALIZE THE FET USING THE MODEL QUICK 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 RETURN TO THE CALLER. 
* 
*     - REWIND THE FILE.
* 
*     - IF AN ERROR OCCURRED DURING THE REWIND, THEN ISSUE AN 
*       ERROR MESSAGE, RETURN THE FILE AND RETURN TO THE CALLER.
* 
*     - INITIALIZE THE HEADER OF THE FILE.
* 
*     - REWRITE THE HEADER RECORD OF THE FILE.
* 
*     - IF AN ERROR OCCURRED WHILE REWRITING THE HEADER, THEN ISSUE 
*       AN ERROR MESSAGE, RETURN THE FILE AND RETURN TO THE CALLER. 
* 
*     - 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 RETURN TO THE CALLER. 
* 
*     - RETURN THE FILE.
* 
*     - PRINT A SUCCESSFUL ALLOCATION MESSAGE ON THE DBREC OUTPUT FILE. 
* 
*     - RETURN TO THE CALLER. 
* 
 #
  
# LOCAL VARIABLES.                                                     #
  
      ITEM ATTACHSTATUS I;             # STATUS OF THE ATTACH.         #
      ITEM EXTENDSTATUS I;             # STATUS OF EXTEND REQUEST.     #
      ITEM INDEX  I;                   # LOOP VARIABLE.                #
      ITEM SIZE   I;                   # SIZE OF THE QUICK RECOVERY    #
                                       # FILE IN WORDS.                #
  
      BASED ARRAY QRHDREC;
        BEGIN 
*CALL QRHEDDCLS 
        END 
  
# EXTERNALLY REFERENCED ARRAYS.                                        #
  
      XREF ARRAY DB$IOFT;              # MODEL QUICK RECOVERY FILE FET.#
        BEGIN 
        ITEM QRFETWD U(00,00,60); 
        END 
  
  
  
  
# S T A R T   O F   D B $ B A L Q   E X E C U T A B L E   C O D E      #
  
  
# COMPUTE THE SIZE OF THE QUICK RECOVERY FILE IN WORDS.                #
  
      SIZE = (EXQRFSZ[EXTINDEX] * DFPRUSIZ) + DFQRFPAD; 
  
# SET THE BASED ARRAY POINTER OF THE QUICK RECOVERY                    #
# PERMANENT FILE INFORMATION TABLE.                                    #
  
      P<MDPIT> = LOC(MDSCINFO) + MDSIQRFP[0]; 
  
# 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 RETURN TO THE CALLER.                                    #
  
      IF ATTACHSTATUS NQ 0
      THEN
        BEGIN 
        INSERTITEMI = ATTACHSTATUS; 
        DB$BERR(DFERR05); 
        RETURN;                        # RETURN TO THE CALLER.         #
  
        END 
  
# INITIALIZE THE FET USING THE MODEL QUICK RECOVERY FILE FET.          #
  
      FOR INDEX = DFFETLEN - 1 STEP - 1 UNTIL 0 
      DO
        BEGIN 
        FETLFNWD[INDEX] = QRFETWD[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 RETURN TO THE CALLER.                   #
  
      IF FETNOSAT[0] NQ 0 
      THEN
        BEGIN 
        DB$BERR(DFERR03); 
        DB$RTN(FETLFNU[0]); 
        RETURN;                        # RETURN TO THE CALLER.         #
  
        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 RETURN TO THE CALLER.                            #
  
      IF FETNOSAT[0] NQ 0 
      THEN
        BEGIN 
        DB$BERR(DFERR02); 
        DB$RTN(FETLFNU[0]); 
        RETURN;                        # RETURN TO THE CALLER.         #
  
        END 
  
# INITIALIZE THE HEADER OF THE FILE.                                   #
  
      P<QRHDREC> = PRESETBUF; 
  
      QHGEN[0] = 0; 
      QHSCID[0] = MDSCIDNT[SDTINDX];
      QHGBID[0] = 0;
      QHSIZE[0] = EXQRFSZ[EXTINDEX] * DFPRUSIZ; 
      QHRPNUM[0] = 0; 
      QHINFO[0] = " ";
  
# REWRITE THE HEADER RECORD OF THE FILE.                               #
  
      DB$IOWR(LOC(FET),P<QRHDREC>,DFPRUSIZ);
      DB$RCLL(LOC(FET));               # WAIT FOR THE REWRITE TO       #
                                       # COMPLETE.                     #
  
# IF AN ERROR OCCURRED WHILE REWRITING THE HEADER, THEN ISSUE AN ERROR #
# MESSAGE, RETURN THE FILE AND RETURN TO THE CALLER.                   #
  
      IF FETNOSAT[0] NQ 0 
      THEN
        BEGIN 
        DB$BERR(DFERR03); 
        DB$RTN(FETLFNU[0]); 
        RETURN;                        # RETURN TO THE CALLER.         #
  
        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 RETURN TO THE CALLER.             #
  
      IF EXTENDSTATUS NQ 0
      THEN
        BEGIN 
        INSERTITEMI = EXTENDSTATUS; 
        DB$BERR(DFERR04); 
        DB$RTN(FETLFNU[0]); 
        RETURN;                        # RETURN TO THE CALLER.         #
  
        END 
  
# RETURN THE FILE.                                                     #
  
      DB$RTN(FETLFNU[0]); 
  
# PRINT A SUCCESSFUL ALLOCATION MESSAGE ON THE DBREC OUTPUT FILE.      #
  
      DB$BURP(DFURP02); 
  
# RETURN TO THE CALLER.                                                #
  
      RETURN; 
  
      END 
      TERM
