*DECK DB$WRAR 
USETEXT CDCSCTX 
      PROC DB$WRAR(ARERRBLK); 
      BEGIN 
 #
* *   DB$WRAR - WRAP UP AUTO-RECOVERY            PAGE  1
* *   D E TRIGLIA/W P CEAGLIO/A P WONG           DATE  04/10/81 
* 
* DC  PURPOSE 
* 
*     TO WRAP UP AUTO-RECOVERY PROCESSING FOR A SCHEMA. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
* 
*     THE ACTUAL PARAMETER MUST BE THE LOCATION OF THE ARRAY, NOT 
*     THE ARRAY ITSELF. 
# 
      ITEM ARERRBLK I;             # LOC OF AUTO RECOVERY ERROR BLOCK  #
# 
* D   ASSUMPTIONS 
* 
*     QRF IS ATTACHED IF IT IS SPECIFIED. 
*     RCB   (RCMBA) SHOULD BE SET IF TEMPORARY TABLE EXISTS.
*     SAL   (SAOFTLSP,SAQRFPTR) SHOULD BE SET.
*     SALX IS SET.
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL - ONLY DUMMY OFTS FOR *DOWNED* AREAS ARE LEFT IN 
*              MANAGED MEMORY.
*              TEMPORARY TABLES ARE RETURNED. 
*              THERE ARE NO FILES LEFT ATTACHED FOR THIS SCHEMA.
* 
*     ABNORMAL - SCHEMA WILL BE PLACED IN *DOWNED* STATUS IF QRF
*                IS NOT EMPTY OR ALL AREAS ARE IN *DOWNED* STATUS, AND
*                ERROR BLOCK WILL BE SET ACCORDINGLY. 
* 
* DC  CALLING ROUTINES
* 
*     DB$CARS      AUTO-RECOVERY CONTROL ROUTINE
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CLOSEM;            # CALL CRM TO CLOSE ALL OPEN AREAS  #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$FLSH;           # FLUSH ALL DATABASE AREAS          #
      XREF PROC DB$LNKD;           # RETURN OFTS, UFTS TO CMM          #
      XREF PROC DB$MBFA;           # FREE ALL TEMPORARY TABLES         #
      XREF PROC DB$PUNT;           # CDCS INTERNAL ERROR PROCESSOR     #
      XREF PROC DB$QRP;            # QRF RECOVERY POINT PROCESSOR      #
      XREF PROC DB$RA0;            # TERMINATE PARAMETER LIST          #
      XREF PROC DB$RCLL;           # CDCS RECALL PROCESSOR             #
      XREF PROC DB$RLSF;           # RETURN FILE AND OFT               #
      XREF PROC DB$SCHD;           # SCHEDULE OTHER TASKS WHILE WAITING#
      XREF PROC DB$SFRT;           # RETURN SYSTEM FILES AND CMM SPACE #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     P<OFT>        OFT POINTER 
*     P<UFT>        UFT POINTER 
*     SASCHST[SALX] SCHEMA STATUS--MAY BE SET TO "DOWN" 
*     SREFTYP       FILE TYPE IN THE ERROR BLOCK--WILL BE SET IN CASE 
*                   OF ERROR. 
*     SRENUMB       ERROR NUMBER IN THE ERROR BLOCK--WILL BE SET IN 
*                   CASE OF ERROR.
* 
* DC  DESCRIPTION 
* 
*     - IF A QRF FLUSH TASK IS IN EXECUTION, WAIT FOR IT TO COMPLETE. 
* 
*     - IF THE SCHEMA STATUS IS NOT *ERRDOWN* AND IF A QUICK
*       RECOVERY FILE IS BEING USED FOR THIS SCHEMA, THEN CALL DB$QRP 
*       TO DO RECOVERY POINT PROCESSING AND TO REINITIALIZE THE QRF.
* 
*     - RETURN ALL FILES, OFTS, UFTS FOR ALL AREAS, EXCEPT DUMMY OFTS 
*       FOR *DOWNED* AREAS ARE LEFT IN MANAGED MEMORY.
* 
*     - RETURN ALL TEMPORARY TABLES.
* 
*     - IF ALL AREAS ARE IN *DOWNED* STATUS, PLACE SCHEMA IN
*       *DOWNED* STATUS, AND SET ERROR BLOCK. 
* 
*     - CLOSE ANY OPEN FILES, AND RETURN ALL SYSTEM FILES AND 
*       ASSOCIATED BUFFERS AND TABLES.
* 
 #
  
# 
*     COMDECK QRTABDCLS -- COMDECK FOR QRF TABLE
# 
*CALL QRTABDCLS 
  
# 
*     COMDECK SRERRDCLS -- COMDECK FOR ERROR PARAMETER BLOCK
# 
*CALL SRERRDCLS 
  
  
# 
*     LOCAL VARIABLES 
# 
      ITEM AREAUP       B;        # TRUE IF AREA IS UP                 #
      ITEM INDEX        I;        # SCRATCH - FOR LOOPS                #
      ITEM NUMBAREADOWN I;        # NUMBER OF AREAS IN *DOWN* STATUS   #
      ITEM TOTALAREA    I;        # TOTAL NUMBER OF AREAS IN SCHEMA    #
  
      BASED ARRAY FIT;;           # DUMMY FIT                          #
  
  
      BASED ARRAY QH;;            # HEADER RECORD ON QRF FILE          #
  
  
  
# 
*     S T A R T   O F   D B $ W R A R   E X E C U T A B L E   C O D E 
# 
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("WRAR");
      CONTROL ENDIF;
  
# 
*     IF A QRF FLUSH TASK HAS BEEN INITIATED, 
*       LET SCHEDULER RUN IT TO COMPLETION. 
*     THERE ARE NO OTHER TASKS AROUND DURING SYSTEM RECOVERY. 
# 
      IF SAQRFPTR[SALX] NQ 0
      THEN
        BEGIN 
        P<QFT> = SAQRFPTR[SALX];
        FOR INDEX = INDEX WHILE QFFLUSHF[0] 
        DO
          BEGIN 
          DB$SCHD(LOC(STATCOMP),DFWAITLOG); 
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP("WRAR-S1"); 
          CONTROL ENDIF;
  
          P<QFT> = SAQRFPTR[SALX];
          END 
        END 
      P<SRERRBLK> = ARERRBLK; 
      SREWORD[0] = 0; 
      SREWORD[1] = 0; 
  
# 
*     IF A QUICK RECOVERY FILE IS BEING USED AND THE SCHEMA IS
*     IS NOT IN *ERRDOWN* STATUS, CALL DB$QRP TO PERFORM A
*     RECOVERY POINT AND TO REINITIALIZE THE QRF. 
# 
      IF SAQRFPTR[SALX] NQ 0
        AND SASCHST[SALX] NQ S"ERRDOWN" 
      THEN
       BEGIN
        DB$FLSH;
        DB$QRP(0);
        END 
  
      NUMBAREADOWN = 0;           # PRESET NBR OF AREA IN *DOWN* TO 0  #
  
# 
*     SCAN THRU OFT CHAIN FOR SCHEMA.  FOR EACH OFT, DELINK ANY ACTIVE
*     UFT AND THEN RETURN THE FILE AND OFT. 
# 
  
      P<OFT> = LOC(SAOFTLSP[SALX]); 
      P<OFT> = OFNEXT[0];         # GET FIRST OFT TABLE                #
  
  
      FOR INDEX = INDEX 
        WHILE P<OFT> NQ 0 
      DO
        BEGIN 
  
  
        IF OFSTATUS[0] EQ S"UP"   # CHECK IF AREA IS "UP"              #
        THEN
          BEGIN 
          AREAUP = TRUE;
          END 
        ELSE
          BEGIN 
          AREAUP = FALSE; 
          NUMBAREADOWN = NUMBAREADOWN + 1;
                                     # INCREMENT NBR OF *DOWN* AREA    #
          END 
  
        P<UFT> = LOC(OFUFT[0]); 
        IF UFWORD[0] NQ DFNPTR    # IF THERE IS AN OPEN FILE           #
        THEN
          BEGIN 
          IF UFNEXT[0] NQ LOC(UFT)
          THEN
            BEGIN 
            DB$PUNT("DB$WRAR 1"); 
            END 
          IF AREAUP               # CLOSE USER FILE IF AREA IS "UP"    #
          THEN
            BEGIN 
            P<FIT> = LOC(UFFIT[0]); 
            CLOSEM(FIT,DFFITCFDET,DB$RA0);
            UFWORD[0] = DFNPTR; 
            END 
          P<UFT> = 0; 
  
          END 
  
# 
*       CALL DB$RLSF TO RETURN FILE AND OFT TABLE.
* 
*       NOTE : UPON RETURN FROM DB$RLSF, P<OFT> MAY OR MAY NOT
*             BE CHANGED--- 
*         IF AREA IS NOT "UP", OR RETAIN COUNT IS NQ 0, THEN OFT IS 
*         NOT RETURNED, AND P<OFT> NOT CHANGED. 
*         IF AREA IS "UP" AND RETAIN COUNT IS 0, THEN CURRENT OFT 
*         IS RETURNED AND P<OFT> SET TO THE NEXT OFT. 
# 
  
                                  # IF P<OFT> NOT CHANGED UPON RETURN  #
                                  # FROM DB$RLSF, -AREAUP- SHOULD BE   #
                                  # SET TO FALSE.                      #
                                  # NOTE.  -AREAUP- IS ALREADY FALSE   #
                                  #        IF AREA IS IN *DOWNED*.     #
        IF OFRETCT[0] NQ 0
        THEN
          BEGIN 
          AREAUP = FALSE;         # SET -AREAUP- FALSE IF RETCT NQ 0   #
          END 
  
        DB$RLSF;                  # RETURN FILE AND OFT TABLE          #
  
        IF NOT AREAUP             # AREA DOWN, PICK UP NEXT OFT        #
        THEN
          BEGIN 
          P<OFT> = OFNEXT[0]; 
          END 
  
        END 
  
# 
*     RETURN TEMPORARY TABLES IF ANY EXISTED. 
# 
      IF RCMBA[0] NQ 0
      THEN
        BEGIN 
        DB$MBFA;
        END 
# 
*     CALCULATE TOTAL NUMBER OF AREAS IN THE SCHEMA 
# 
      TOTALAREA = SASCNBAR[SALX]; 
      IF SASCNOVER[SALX] GR 1     # MORE THAN 1 VERSION IS ACTIVE      #
      THEN
        BEGIN 
        TOTALAREA = TOTALAREA * SASCNOVER[SALX];
        END 
  
  
# 
*     IF ALL AREAS ARE IN *DOWNED* STATUS, PLACE SCHEMA IN *DOWNED* 
*     STATUS ALSO.
# 
      IF NUMBAREADOWN EQ TOTALAREA
      THEN
        BEGIN 
        SRENUMB[0] = DFSRENAAD; 
        SASCHST[SALX] = S"DOWN";
        END 
  
# 
*     RETURN ALL SYSTEM FILES AND ASSOCIATED BUFFERS AND TABLES.
# 
      DB$SFRT;
  
      END 
      TERM
