*DECK DB$ARRO 
USETEXT CDGDFTX 
      PROC DB$ARRO; 
      BEGIN 
 #
* *   DB$ARRO - AUTO-RECOVERY ROLL OUT CONTROL   PAGE  1
* *   D E TRIGLIA/W P CEAGLIO                    DATE  01/07/81 
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE ROLLS OUT PART OF THE CDCS FIELD LENGTH TO PREPARE 
*     FOR AUTO-RECOVERY INITIALIZATION AND ROLLS THAT FIELD LENGTH IN 
*     AFTER AUTO-RECOVERY HAS COMPLETED.
* 
* DC  ENTRY CONDITIONS
* 
* D   ASSUMPTIONS 
* 
*     DB$FARR CONTAINS THE FWA OF THE FIELD LENGTH TO BE ROLLED OUT 
*     DURING AUTO-RECOVERY INITIALIZATION.  HHA CONTAINS THE HIGHEST
*     HIGH ADDRESS OF THE LOAD. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL   - WITH THE EXCEPTION OF MANAGED MEMORY, THE CDCS FIELD 
*                LENGTH IS THE SAME AS IT WAS WHEN THIS ROUTINE WAS 
*                CALLED.
* 
*     ABNORMAL - IF AN ERROR IS DETECTED ON EITHER THE ROLL OUT OR THE
*                ROLL IN, THE ERROR IS DIAGNOSED AND CDCS IS ABORTED. 
* 
* DC  CALLING ROUTINES
* 
*     DB$INT       CDCS INITIALIZATION
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CMMSDA;            # SET DYNAMIC AREA BASE ADDRESS     #
      XREF PROC DB$ABRT;           # ABORT CDCS                        #
      XREF PROC DB$CARS;           # CONTROL AUTO-RECOVERY SEQUENCE    #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$MSG;            # ISSUE DAYFILE MESSAGE             #
      XREF FUNC DB$ROLI U;         # ROLL IN FOR NORMAL CDCS OPERATION #
      XREF FUNC DB$ROLO U;         # ROLL OUT FOR AUTO-RECOVERY        #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
# 
      XREF ITEM DB$FWAR U;         # FWA OF AUTO-RECOVERY ROLL OUT     #
      XREF ITEM DB$LWAR U;         # LWA OF AUTO-RECOVERY ROLL OUT     #
# 
* DC  DESCRIPTION 
* 
*     -  ROLL OUT THAT PART OF THE CDCS FIELD LENGTH WHICH IS 
*        UNNECESSARY FOR AUTO-RECOVERY PROCESSING.  IF AN ERROR OCCURS
*        DURING ROLL OUT, ISSUE A DAYFILE MESSAGE AND ABORT CDCS. 
* 
*     -  PERFORM AUTO-RECOVERY INITIALIZATION AND PROCESSING. 
* 
*     -  IF ALL SCHEMAS WERE UNRECOVERABLE, ISSUE A DAYFILE MESSAGE AND 
*        ABORT CDCS.
* 
*     -  ROLL IN THE FIELD LENGTH OF CDCS THAT WAS PREVIOUSLY ROLLED
*        OUT.  IF AN ERROR OCCURS DURING ROLL IN, ISSUE A DAYFILE 
*        MESSAGE AND ABORT CDCS.
* 
 #
  
  
#     NON-LOCAL VARIABLES REFERENCED                                   #
  
      XREF ITEM DB$FARR;           # FWA OF AUTO-RECOVERY ROLL OUT     #
  
      XREF ARRAY DB$RA0;           # ARRAY BASED AT RA+0               #
        BEGIN 
        ITEM HHA     I(65,42,18);  # HIGHEST HIGH ADDRESS OF LOAD      #
        END 
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ABORT     B;            # TRUE IF CDCS IS TO BE ABORTED     #
      ITEM ABRTMSG   C(60) = "  CDCS ABORTED--RECOVERY FOR ALL SCHEMAS I
MPOSSIBLE:";
      ITEM BEGMSG    C(25) = "  CDCS RECOVERY STARTED:";
      ITEM ENDMSG    C(30) = "  CDCS RECOVERY COMPLETED:";
      ITEM RINEMSG   C(40) = "  ERROR DURING ROLL IN--CDCS ABORTED:"; 
      ITEM ROUTEMSG  C(40) = "  ERROR DURING ROLL OUT--CDCS ABORTED:";
  
  
  
# S T A R T   O F   D B $ A R R O   E X E C U T A B L E   C O D E      #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("ARRO");
      CONTROL ENDIF;
  
#     ROLL OUT THAT PART OF THE CDCS FIELD LENGTH WHICH IS UNNECESSARY #
#     FOR AUTO-RECOVERY PROCESSING.  IF AN ERROR OCCURS, ISSUE A       #
#     MESSAGE AND ABORT CDCS.                                          #
  
      DB$FWAR = LOC(DB$FARR); 
      DB$LWAR = HHA[0] -1;
      IF DB$ROLO NQ 0              # IF ERROR DURING ROLL OUT...       #
      THEN
        BEGIN 
        DB$MSG(ROUTEMSG); 
        DB$ABRT;
  
        END 
  
#     PERFORM AUTO-RECOVERY INITIALIZATION AND PROCESSING.             #
  
      DB$MSG(BEGMSG);              # START RECOVERY MESSAGE            #
      DB$CARS(ABORT,0); 
  
#     IF ALL SCHEMAS WERE UNRECOVERABLE, ABORT CDCS.                   #
  
      IF ABORT                     # IF NO SCHEMAS WERE RECOVERABLE... #
      THEN                         # ISSUE MESSAGE AND ABORT CDCS      #
        BEGIN 
        DB$MSG(ABRTMSG);
        DB$ABRT;
        END 
      ELSE                         # ELSE, RECOVERY COMPLETE MESSAGE   #
        BEGIN 
        DB$MSG(ENDMSG); 
        END 
  
#     ROLL IN THE CDCS FIELD LENGTH THAT WAS PREVIOUSLY ROLLED OUT.    #
#     IF AN ERROR OCCURS, ISSUE A MESSAGE AND ABORT CDCS.              #
  
      CMMSDA(HHA[0]);              # SET DYNAMIC AREA BASE ADDRESS     #
  
      IF DB$ROLI NQ 0              # IF ERROR DURING ROLL IN...        #
      THEN
        BEGIN 
        DB$MSG(RINEMSG);
        DB$ABRT;
  
        END 
  
      END 
      TERM; 
