*DECK DB$RVRS 
USETEXT CDCSCTX 
      PROC DB$RVRS; 
      BEGIN 
 #
* *   DB$RVRS - RECOVERY/RESTORE CONTROL ROUTINE PAGE  1
* *   J E ESLER                                  DATE  06/10/76 
* 
* DC  PURPOSE 
* 
*     EXECUTE MODULES TO INTERPRET INPUT PARAMETERS,
*     SELECT AND SORT LOG RECORDS, AND MODIFY THE DATABASE. 
* 
* DC  ENTRY CONDITIONS
* 
*     ITEM RECREATE IN DB$RCOM SET FOR RECREATE OR RESTORE. 
* 
* DC  EXIT CONDITIONS 
* 
*     BY OPTION, A FILE OF SELECTED LOG RECORDS HAS BEEN CREATED AND
*     SAVED.
*     BY OPTION, A SELECTION FILE FROM THIS OR ANOTHER RUN IS APPLIED 
*     TO THE DATABASE.
* 
* DC  CALLING ROUTINES
* 
*     DBRCN - DATABASE RECREATION UTILITY.
*     DBRST - DATABASE RESTORE UTILITY
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ABRT;           # ISSUE ABORT MACRO                 #
      XREF FUNC DB$CDIS C(10);     #CONVERT BINARY TO DISPLAY CODE# 
      XREF PROC DB$CRIN;           #BUILD CRITERIA TABLE FROM INPUT FIL#
      XREF PROC DB$MDER;           #MD ERROR PROCESSOR# 
      XREF FUNC DB$MGSS;           #GET CMM SUMMARY STATISTICS# 
      XREF PROC DB$MSG;            #ISSUE DAYFILE MESSAGE#
      XREF PROC DB$RINP;           #RECOVERY/RESTORE INPUT PROCESSER# 
      XREF PROC DB$RSEL;           #RECOVERY/RESTORE SELECTION PROCESSR#
      XREF PROC DB$SORT;           #RECOVERY/RESTORE SORT INTERFACE#
      XREF PROC DB$RUPD;           #RECOVERY/RESTORE DB UPDATE CONTROLL#
      XREF PROC DB$EXT;            #EXTEND A PERMANENT FILE#
      XREF FUNC DB$STAT;           #GET STATUS OF FILE# 
      XREF PROC DB$UCLF;           #CLOSE INPUT AND OUTPUT FILES# 
      XREF PROC DB$UOPF;           #OPEN INPUT AND OUTPUT FILES#
      XREF PROC DB$WOPN;           #OPEN WA FILE# 
      XREF PROC DB$WGET;           #READ WA FILE# 
# 
* DC  NON-LOCAL VARIABLES 
# 
*CALL FITMDDCLS 
# 
*     CDCS COMMON, RECOVERY/RESTORE COMMON
 #
      CONTROL NOLIST;              # RVRSCOMMN                         #
*CALL     RVRSCOMMN 
      CONTROL LIST; 
# 
*     LOCAL VARIABLES 
# 
      ITEM ERRCODE;                #ERROR CODE# 
      BASED ARRAY STATS (6);           #SUMMARY STATISTICS FOR CMM# 
        BEGIN 
        ITEM MAXMM U(0,0,60); 
        ITEM MAXFL U(1,0,60); 
        ITEM NUMCRASH U(2,0,60);
        ITEM NUMINCR U(3,0,60); 
        ITEM NUMDECR U(4,0,60); 
        ITEM NUMOVER U(5,0,60); 
        END 
      ITEM FLMSG C(34) = "    XXXXXX MAXIMUM SCM WORDS USED:";
 #
* DC  DESCRIPTION 
 #
      CONTROL EJECT;
 #
*     INTERPRET PARAMETERS ON THE CONTROL CARD
*     AND THE INPUT FILE. USE THE PARAMETERS TO INITIALIZE ALL REQUIRED 
*     TABLES. 
 #
      DB$RINP;
 #
*     OPEN INPUT AND OUTPUT FILES.
*     OPEN MASTER DIRECTORY.
 #
      DB$UOPF;               #OPEN INPUT AND OUTPUT FILES#
      DB$WOPN(DB$FTMD,DB$MDER); 
      P<SAL> = LOC(DUMMYSAL);      # SET BASED ARRAY IN CDCS COMMON    #
                                   # TO SAL ARRAY IN RVRS COMMON.      #
      SALX = 0; 
      SALL = 0; 
      VNLSIZE = DFVNLRECU;         # SET SIZE OF VERSION NAME LIST FOR #
                                   # RECOVERY UTILITIES.               #
 #
*     READ AND INTERPRET INPUT FILE PARAMETERS. 
 #
      DB$CRIN;
  
      SASCWD09[0] = 0;             # CLEAR INTERNAL SAL WORDS          #
      SASCWD10[0] = 0;
      SASCWD11[0] = 0;
      SASCWD12[0] = 0;
 #
*     READ MD CONTROL WORDS INTO CDCS COMMON. 
 #
  
      DB$WGET(DB$FTMD,MDCW,DFMDNUMCW,1,DB$MDER);
 #
*     VERIFY THAT A VALID AND CURRENT MASTER DIRECTORY IS BEING USED. 
*     IF NOT, ABORT INITIALIZATION. 
* 
*     VERIFICATION INVOLVES THE FOLLOWING CONSISTENCY CHECKS--
* 
* 
*       - THE LOCATION AND SIZE OF THE PERMANENT FILE TABLE (MINUS 2) 
*         DOES NOT EXCEED THE LAST WORD OF THE MD 
* 
*       - THE LOCATION AND SIZE OF THE SCHEMA DIRECTORY (MINUS 2) DOES
*         NOT EXCEED THE LAST WORD OF THE MD
* 
*       - THE INTERNAL VERSION NUMBER EQUALS THE CURRENT NUMBER 
* 
*       -THE INTERNAL MD IDENTIFIER EQUALS THE CURRENT IDENTIFIER 
* 
*       - THE EXTERNAL PRODUCT VERSION EQUALS THE CURRENT VERSION 
* 
 #
      IF MDWAPFN [0] + MDSZPFN [0] - 2 GQ MDWALUWD [0]
        OR MDSDWA [0] + (MDSDNO [0] * DFMDSCDESIZE) - 2 GQ MDWALUWD [0] 
          OR (MDCWVERS [0] NQ DFMDVERSOL
            AND MDCWVERS [0] NQ DFMDVERS) 
        OR MDCWIDNT [0] NQ DFMDIDNT 
          OR (MDCWPROD [0] NQ DFMDPRODOL
            AND MDCWPROD [0] NQ DFMDPROD) 
      THEN
        BEGIN 
        DB$MSG(" RECOVERY ABORT, INVALID MASTER DIRECTORY :");
        DB$ABRT;
        END 
  
      P<APL> = 0; 
      SASCMAXLOG[0] = SASCMDMLOG[0];
      IF SASCMAXLXL[0]
      THEN
        BEGIN 
        SASCMAXLOG[0] = SASCMDMLOG[0] * 80; 
        END 
 #
*     IF A LOG FILE IS TO BE SCANNED TO BUILD A SELECTION FILE, 
*     PERFORM THE SELECTION.
 #
      IF SELECTION THEN 
        BEGIN 
        DB$RSEL;
 #
*     IF A SELECTION FILE HAS BEEN BUILT, SORT IT NOW IF REQUIRED.
 #
        IF SORTREQD THEN
          DB$SORT;
  
#     IF THE (SORTED) SELECT FILE IS TO BE SAVED ON A PERMANENT FILE,  #
#     EXTEND THE FILE NOW.                                             #
  
        IF SAVESORT AND DB$STAT(SELLFN) EQ 2 THEN 
          DB$EXT(SELLFN,ERRCODE); 
        END 
 #
*     IF THE DATABASE IS TO BE UPDATED IN THIS RUN, 
*     APPLY THE (SORTED) SELECTION FILE TO THE DATABASE.
 #
      IF UPDATERUN THEN 
        BEGIN 
        DB$RUPD;
        END 
  
#     OUTPUT CM STATISTICS                                             #
  
      P<STATS> = DB$MGSS; 
      C<0,10>FLMSG = DB$CDIS(MAXFL,10,8," "); 
      DB$MSG(FLMSG);
      DB$UCLF;                         #CLOSE INPUT AND OUTPUT FILES# 
      END 
      TERM
