*DECK DB$DSCS 
USETEXT CDCSCTX 
      PROC DB$DSCS; 
      BEGIN 
 #
* *   DB$DSCS - SEMANTICS FOR CHANGING STATUS    PAGE  1
* *   C F RICHARDS                               DATE  11/30/78 
* *   W P CEAGLIO                                DATE  10/30/79 
* *   A W ALLEN / L G WHITE                      DATE  12/03/79 
* *   M. E. STERMER                              DATE  11/21/80 
* 
* DC  PURPOSE 
* 
*     CONTAIN THE ROUTINES THAT CHANGE THE STATUS OF AN OBJECT. 
* 
*     EMBEDDED ROUTINES 
* 
*     THE FOLLOWING ROUTINES ARE CALLED WITH SEPARATE ENTRY POINTS, 
*     BUT THEY ARE ALL CONTAINED WITHIN THE SAME MODULE.
# 
      XDEF PROC DB$DS06;           # DOWN AN OBJECT                    #
      XDEF PROC DB$DS07;           # IDLE AN OBJECT                    #
      XDEF PROC DB$DS20;           # UP AN OBJECT                      #
      XDEF PROC DB$DS28;           # TERM COMMAND. DB$YES IF CDCS UP   #
      XDEF PROC DB$DS30;           # RETAIN AN OBJECT                  #
      XDEF PROC DB$DS31;           # RETURN AN OBJECT                  #
# 
* DC  GLOBAL COMMON BLOCKS
* 
*     CDCSCOMMN 
* 
* DC  NON-LOCAL VARIABLES 
# 
      XREF ITEM DB$DNAU I;         # NUMBER OF ACTIVE CDCS USERS       #
      XREF ITEM DB$DSAI I;         # AREA-ID                           #
      XREF ITEM DB$DSAN C(30);     # AREA-NAME                         #
      XREF ITEM DB$DSCY B;         # TRUE IF CONFIRMATION RESPONSE YES #
      XREF ITEM DB$DSSI I;         # SCHEMA-ID                         #
      XREF ITEM DB$DSSN C(30);     # SCHEMA-NAME                       #
      XREF ITEM DB$DSSB C(30);     # RETAIN/RETURN SUBSCHEMA NAME      #
      XREF ITEM DB$DSST S:SACSTAT; # CDCS SYSTEM STATUS                #
      XREF ITEM DB$DSVN C(7);      # VERSION NAME                      #
      XREF ITEM DB$TRMF B;         # TRUE IF CDCS SHOULD END WHEN NO   #
  
*CALL DSFDCLS 
  
 #                                                                     #
# 
*     LOCAL ITEMS 
* 
*     THESE LOCAL ITEMS ARE USED BY ALL THE SEPARATE ROUTINES CONTAINED 
*     IN THIS MODULE. 
# 
      ITEM FOUND B;                # PARAMETER FOR DB$DSCF. TRUE IF AN #
                                   # ENTRY WAS FOUND FOR THE SCHEMA    #
      ITEM ERSTAT I;               # ERROR STATUS FOR RETAIN/RETURN    #
      ITEM MSG1 C(15) = "NOW IN PROGRESS";
      ITEM MSG2 C(09) = "COMPLETED";
      ITEM MSG3 C(39) = "A DOWN IS IN PROGRESS - COMMAND IGNORED";
      ITEM MSG4 C(42) = "SCHEMA DOWN BECAUSE CDCS DETECTED AN ERROR"; 
      ITEM MSG5 C(58) = 
          "THE SCHEMA ID/NAME IS NNNN/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:"; 
      ITEM MSG6 C(14) = "UNKNOWN SCHEMA"; 
      ITEM MSG7 C(15) = "COMMAND IGNORED";
      ITEM MSG8 C(33) = "AREA DOWN DUE TO FATAL CRM ERRORS";
      ITEM MSG9 C(56) = 
          "THE AREA ID/NAME IS NNNN/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:"; 
      ITEM MSG10 C(33) = "AREA ALREADY UP - COMMAND IGNORED"; 
      ITEM MSG11 C(35) = "SUBSCHEMA ALREADY IN RETENTION MODE"; 
      ITEM MSG12 C(29) = "UNKNOWN OR INACTIVE SUBSCHEMA"; 
      ITEM MSG13 C(32) = "SCHEMA ALREADY IN RETENTION MODE";
      ITEM MSG14 C(31) = "SUBSCHEMA NOT IN RETENTION MODE"; 
      ITEM MSG15 C(28) = "VERSION AFFECTED IS XXXXXXX:";
      ITEM MSG16 C(39) = "SCHEMA RECOVERY FAILED, CONSULT DAYFILE"; 
      ITEM SAVSALX I;              # VALUE OF SALX AT TIME OF REQUEST  #
                                   # FOR OPERATOR CONFIRMATION.        #
  
  
#     LOCAL DEFS                                                       #
  
      DEF DFLGMSG1 # 15 #;         # LENGTH OF MESSAGE 1               #
      DEF DFLGMSG2 # 09 #;         # LENGTH OF MESSAGE 2               #
      DEF DFLGMSG3 # 39 #;         # LENGTH OF MESSAGE 3               #
      DEF DFLGMSG4 # 42 #;         # LENGTH OF MESSAGE 4               #
      DEF DFLGMSG5 # 57 #;         # LENGTH OF MESSAGE 5 (-1 FOR MSG :)#
      DEF DFLGMSG6 # 14 #;         # LENGTH OF MESSAGE 6               #
      DEF DFLGMSG7 # 15 #;         # LENGTH OF MESSAGE 7               #
      DEF DFLGMSG8 # 33 #;         # LENGTH OF MESSAGE 8               #
      DEF DFLGMSG9 # 55 #;         # LENGTH OF MESSAGE 9               #
      DEF DFLGMSG10 # 33 #;        # LENGTH OF MESSAGE 10              #
      DEF DFLGMSG11 # 35 #;        # LENGTH OF MESSAGE 11              #
      DEF DFLGMSG12 # 29 #;        # LENGTH OF MESSAGE 12              #
      DEF DFLGMSG13 # 32 #;        # LENGTH OF MESSAGE 13              #
      DEF DFLGMSG14 # 31 #;        # LENGTH OF MESSAGE 14              #
      DEF DFLGMSG15 # 27 #;        # LENGTH OF MESSAGE 15              #
      DEF DFLGMSG16 # 39 #;        # LENGTH OF MESSAGE 16              #
  
      DEF DFCPMSG5ID # 22 #;       # BCP OF ID PORTION OF MSG5         #
      DEF DFCPMSG5NM # 27 #;       # BCP OF NAME PORTION OF MSG5       #
      DEF DFCPARID # 20 #;         # CHAR POS OF AREA ID               #
      DEF DFCPARNM # 25 #;         # CHAR POS OF AREA NAME             #
      DEF DFCPVERSION # 20 #;      # CHAR POS OF THE VERSION AFFECTED  #
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 0 6 .        #
  
  
      PROC DB$DS06; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS06 - DOWN AN OBJECT
* *   C F RICHARDS                               DATE  11/30/78 
* *   L G WHITE                                  DATE  12/03/79 
* 
* DC  PURPOSE 
* 
*     HANDLES THE *DOWN* COMMAND FOR CDCS, OR A SCHEMA, OR AN AREA. 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     DB$DSAI - AREA ID IF SPECIFIED, ELSE ZEROS. 
*     DB$DSAN - AREA NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSFL - OPTION FLAGS SET FOR THIS COMMAND.
*     DB$DSSI - SCHEMA-ID IF SPECIFIED, ELSE ZERO.
*     DB$DSSN - SCHEMA-NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSVN - PRIMARY VERSION NAME DETERMINED IN DB$DS19
* 
* DC  EXIT CONDITIONS 
* 
*     EXIT IS VIA DB$YES. 
*     IF OPERATOR CONFIRMATION IS REQUIRED, AN EXIT IS MADE FROM THIS 
*     ROUTINE TO THE CONFIRMATION HANDLER, DB$DSCF. A SUBSEQUENT
*     OPERATOR YES/NO RESPONSE WILL CAUSE EXECUTION TO RESUME IN THIS 
*     ROUTINE (THE CONFIRMATION RESPONSE HANDLERS EXIT THROUGH THE ENTRY
*     POINT RETURN LINK OF DB$DSCF). A SUBSEQUENT DB$YES EXIT FROM THIS 
*     ROUTINE WILL ACT LIKE AN EXIT FROM THE CONFIRMATION RESPONSE
*     HANDLER. THEREFORE, THE SYNGEN CODE FOLLOWING THE ORIGINAL CALL TO
*     THIS ROUTINE WILL BE UNREACHABLE AFTER A CALL TO THE CONFIRMATION 
*     HANDLER.
*     IF THE DOWN CANNOT BE INITIATED, A DIAGNOSTIC WILL BE ISSUED TO 
*     THE CONSOLE DISPLAY.
*     IF THE DOWN IS INITIATED, DAYFILE MESSAGES ARE ISSUED TO RECORD 
*     THE EVENT ON THE DAYFILE. 
*     IN CERTAIN CASES, THE DOWN CAN BE COMPLETED IMMEDIATELY, AND A
*     DAYFILE MESSAGE WILL BE ISSUED. 
*     ALL USERS BEING TERMINATED VIA DB$TSCH HAVE A CONTINUATION
*     ADDRESS AT AN OTHERWISE UNREACHABLE DB$ERR CALL AT THE END OF THIS
*     ROUTINE.
* 
* DC  CALLING ROUTINES
* 
*     DB$DSTX - SYNGEN SPECIFICATION (THROUGH DB$DDIF)
*     DB$DS03 - CONFIRMATION RESPONSE *NO* HANDLER (DB$DSCF RETURN) 
*     DB$DS04 - CONFIRMATION RESPONSE *YES* HANDLER (DB$DSCF RETURN)
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CLOU B;         # CLOSE OPEN UFT'S                  #
      XREF LABEL DB$CRER;          # CONTINUATION FOR AREA DOWN        #
      XREF PROC DB$DCRL;           # CLEAR CDCS RESPONSE LINES         #
      XREF PROC DB$DDIL;           # LOCK IN THE DISPLAY DRIVER OVCAP  #
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DERL;           # ENTER RESPONSE LINE               #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$GOFT;           # GET OFT ENTRY IF ANY              #
                                   # SPECIFIED BY DB$DSAI              #
      XREF PROC DB$DSCF;           # CONFIRMATION HANDLER              #
      XREF PROC DB$DUDF;           # UPDATE DYNAMIC FIELDS             #
      XREF PROC DB$ERR;            # ERROR AND INFORMATIVE MSG HANDLER #
      XREF FUNC DB$LNK;            # GET AND LINK A BLOCK              #
      XREF PROC DB$MSG;            # ISSUE DAYFILE AND B DISPLAY MSG   #
      XREF PROC DB$ODLC;           # DECREMENT OVCAP LOCK COUNTS       #
      XREF PROC DB$OFTC;           # CREATE AN OFT                     #
      XREF PROC DB$TQTD;           # DELETE TQT ENTRY                  #
      XREF PROC DB$TQTT;           # TERMINATE THE CURRENT TQT         #
      XREF PROC DB$TSCH;           # TERMINATE USERS OF SCHEMA         #
      XREF PROC DB$WRP;            # REQUEST END PROCESSOR             #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
*     INTERNAL CALLED ROUTINES
* 
*     PROC SETMSG5  - SET ID/NAME FIELDS IN MESSAGE 5 
*     PROC SETMSG9  - SET ID/NAME FIELDS IN MESSAGE 9 
*     PROC SETMSG15 - SET VERSION FIELD IN MESSAGE 15 
* 
* DC  DESCRIPTION 
* 
*     USE THREE STATUS SWITCHES TO DETERMINE HOW TO DO THIS DOWN.  ONE
*     IS FOR CDCS, ONE FOR SCHEMAS, ONE FOR AREAS.
*     ALL EXITS FROM THIS ROUTINE ARE VIA DB$YES. 
 #
  
  
#     LOCAL ITEMS                                                      #
  
      ITEM INDEX I;                # LOOP COUNTER                      #
      ITEM FOUND B;                # PARAMETER TO DB$GOFT              #
      ITEM OLDSALX I;              # TEMPORARY FOR RESTORING SALX      #
  
  
#     STATUS SWITCHES                                                  #
  
      SWITCH DOWNCDCS:SACSTAT      # SWITCH FOR DOWN OF CDCS           #
        DOWNCDCS1:UP, 
        DOWNCDCS1:IDLING, 
        DOWNCDCS2:IDLE, 
        DOWNCDCS1:DOWNING,
        DOWNCDCS2:DOWN; 
  
  
  
      SWITCH DOWNSCHEMA:SACSTAT    # SWITCH FOR DOWN OF A SCHEMA       #
        DOWNSCHEMA1:UP, 
        DOWNSCHEMA1:IDLING, 
        DOWNSCHEMA2:IDLE, 
        DOWNSCHEMA1:DOWNING,
        DOWNSCHEMA2:DOWN, 
        DOWNSCHEMA3:ERRDOWN;       # TELL OF INTERNALLY DOWNED SCHEMA  #
  
  
  
      SWITCH DOWNAREA:SACSTAT      # SWITCH FOR DOWN OF AN AREA        #
        DOWNAREA1: UP,
        DOWNAREA1: IDLING,
        DOWNAREA2: IDLE,
        DOWNAREA1: DOWNING, 
        DOWNAREA2: DOWN,
        DOWNAREA3: ERRDOWN; 
  
  
  
  
#     E X E C U T A B L E   C O D E   F O R   D B $ D S 0 6            #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS06");
      CONTROL ENDIF;
  
#     D O W N   O F   C D C S                                          #
  
  
  
      IF DSFCDCS[0]                # IF *CDCS* OPTION SPECIFIED        #
      THEN
        BEGIN 
        GOTO DOWNCDCS[DB$DSST];    # ACTION BASED ON CURRENT STATUS    #
  
  
DOWNCDCS1:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-C1"); 
        CONTROL ENDIF;
  
        IF DB$DNAU EQ 0            # IF NO ACTIVE CDCS USERS           #
        THEN
          BEGIN 
          GOTO DOWNCDCS[SACSTAT"DOWN"];  # TREAT AS IF ALREADY DOWN    #
          END 
  
        IF DB$DSST NQ S"DOWNING"   # IF A DOWN IS NOT IN PROGRESS      #
        THEN
          BEGIN 
          DB$DDIL;                 # DUMMY CALL WILL LOCK IN THE OVCAP #
          OLDSALX = SALX;          # SAVE CURRENT SALX                 #
          FOR SALX = 0 STEP 1      # FOR EACH SAL ENTRY                #
            UNTIL SALL             # UNTIL NO MORE LEFT                #
          DO
            BEGIN 
            IF SASCUSERS[SALX] GR 0  # IF SCHEMA HAS USERS             #
            THEN
              BEGIN 
              DB$TSCH(LOC(ENDCDCS)); # TERMINATE USERS BY HAVING THEM  #
                                   # CONTINUE EXECUTION AT ENDCDCS.    #
              END 
            END 
          DB$ODLC;                 # UNLOCK THE OVCAP                  #
          SALX = OLDSALX;          # RESTORE SALX                      #
          END 
  
        DB$DSST = S"DOWNING";      # CDCS IS NOW STARTING TO DOWN      #
        DB$DEDL(MSG1, DFLGMSG1);   # ISSUE *IN PROGRESS* MESSAGE       #
        DB$MSG(" DOWN,CDCS:");
        DB$MSG("  DOWN IN PROGRESS:");
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
DOWNCDCS2:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-C2"); 
        CONTROL ENDIF;
  
        DB$DSST = S"DOWN";         # CDCS IS NOW DOWN                  #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETED* MESSAGE         #
        DB$MSG(" DOWN,CDCS:");
        DB$MSG("  DOWN COMPLETE:"); 
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
        END 
  
  
  
  
#     D O W N   O F   A   S C H E M A                                  #
  
  
      IF DSFSC[0] AND NOT DSFAR[0] # IF DOWNING AN ENTIRE SCHEMA, NOT  #
      THEN                         # AN INDIVIDUAL AREA                #
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("DS06-S");
        CONTROL ENDIF;
  
        SETMSG5;                   # INSERT NAME AND ID INTO MESSAGE 5 #
        DB$DCRL;                   # CLEAR CDCS RESPONSE LINES         #
        DB$DERL(MSG5, DFLGMSG5);   # ISSUE *SCHEMA IS...* MESSAGE      #
        SAVSALX = SALX;            # SAVE SALX FOR THIS SCHEMA         #
        DB$DSCF;                   # REQUEST CONFIRMATION BEFORE DOWN  #
        SALX = SAVSALX;            # RESTORE SALX FOR THIS SCHEMA      #
        DB$DCRL;                   # CLEAR CDCS RESPONSE LINES         #
        IF NOT DB$DSCY             # IF OPERATOR RESPONSE NOT *YES*    #
        THEN
          BEGIN 
          DB$DEDL(MSG7, DFLGMSG7); # ISSUE *COMMAND IGNORED* MESSAGE   #
          DB$YES;                  # EXIT TO SCANNER                   #
  
          END 
  
        GOTO DOWNSCHEMA[SASCHST[SALX]];  # ACTION BASED ON CURRENT STS #
  
  
DOWNSCHEMA1:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-S1"); 
        CONTROL ENDIF;
  
        IF SASCUSERS[SALX] EQ 0    # IF NO ACTIVE USERS OF THIS SCHEMA #
        THEN
          BEGIN 
          GOTO DOWNSCHEMA[SACSTAT"DOWN"];  # TREAT AS IF DOWN ALREADY  #
          END 
  
        IF SASCHST[SALX] NQ S"DOWNING"  # IF A DOWN IS NOT IN PROGRESS #
        THEN
          BEGIN 
          DB$DDIL;                 # DUMMY CALL WILL LOCK IN THE OVCAP #
          DB$TSCH(LOC(ENDSCHEMA)); # TERMINATE USERS BY HAVING THEM    #
                                   # CONTINUE EXECUTION AT ENDSCHEMA.  #
          DB$ODLC;                 # UNLOCK THE OVCAP                  #
          END 
  
        SASCHST[SALX] = S"DOWNING";  # SCHEMA NOW STARTING TO DOWN     #
        DB$DEDL(MSG1, DFLGMSG1);     # ISSUE *IN PROGRESS* MESSAGE     #
        DB$MSG(MSG5);              # ISSUE SCHEMA IDENTIFICATION MSG   #
        DB$MSG("  DOWN IN PROGRESS:");
        DB$YES;                      # EXIT TO SCANNER                 #
  
  
DOWNSCHEMA2:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-S2"); 
        CONTROL ENDIF;
  
        SASCHST[SALX] = S"DOWN";   # SCHEMA IS NOW DOWN                #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETE* MESSAGE          #
        DB$MSG(MSG5);              # ISSUE SCHEMA IDENTIFICATION MSG   #
        DB$MSG("  DOWN COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
DOWNSCHEMA3:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-S3"); 
        CONTROL ENDIF;
  
        DB$DCRL;                   # CLEAR CDCS CONSOLE RESPONSE LINES #
        DB$DERL(MSG4, DFLGMSG4);   # TELL OF INTERNALLY DOWNED SCHEMA  #
        DB$DEDL(MSG7, DFLGMSG7);   # ISSUE *COMMAND IGNORED* MESSAGE   #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
        END 
  
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS06-A");
      CONTROL ENDIF;
  
  
#     D O W N   O F   A N   A R E A                                    #
  
  
        SETMSG5;                   # INSERT SCHEMA NAME/ID INTO MSG5   #
        SETMSG9;                   # INSERT AREA NAME/ID INTO MSG9     #
        SETMSG15;                  # INSERT VERSION NAME IN MESSAGE 15 #
        DB$DCRL;                   # CLEAR CDCS RESPONSE LINE          #
        DB$DERL(MSG5,DFLGMSG5);    # ISSUE SCHEMA NAME IS ...          #
        DB$DERL(MSG9,DFLGMSG9);    # ISSUE AREA NAME IS..              #
        DB$DERL(MSG15,DFLGMSG15);  # ISSUE VERSION AFFECTED...         #
        SAVSALX = SALX;            # STORE SALX FOR SUSPEND            #
        DB$DSCF;                   # REQUEST CONFIRMATION FOR DOWN     #
        DB$DCRL;                   # CLEAR RESPONSE LINES              #
        IF NOT DB$DSCY THEN        # RESPONSE WASN*T YES               #
          BEGIN 
          DB$DEDL(MSG7, DFLGMSG7); # ISSUE COMMAND IGNORED             #
          DB$YES;                  # RETURN TO SCANNER                 #
          END 
  
        SALX = SAVSALX; 
        DB$GOFT(DB$DSAI,DB$DSVN,FOUND); # FIND OFT FOR THIS AREA       #
        IF NOT FOUND THEN          # CREATE A DUMMY OFT                #
          BEGIN 
          DB$OFTC;                 # CREATE AN OFT                     #
          OFVENAME[0] = DB$DSVN;   # INSERT VERSION NAME FOR THIS OFT  #
          OFARID[0] = DB$DSAI;     # INSERT AREA ID                    #
          OFSTATUS[0] = S"DOWN";   # SET STATUS OF AREA TO DOWN        #
          OFUSERS[0] = 0;          # NO USERS NEW OFT                  #
          END 
  
        GOTO DOWNAREA [OFSTATUS[0]]; # GOTO CODE DEPENDING ON CURR STAT#
  
  
DOWNAREA1:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-A1"); 
        CONTROL ENDIF;
  
        OFSTATUS[0] = S"DOWNING";  # DOWN IS IN PROGRESS               #
        IF OFUSERS[0] EQ 0 THEN    # NO USERS HAVE FILE OPEN           #
          GOTO DOWNAREA[SACSTAT"DOWN"]; #TREAT AS IF ALREADY DOWN      #
        ELSE
          BEGIN 
          P<TQT> = TQTCHAIN;       # START AT BEGINNING OF TQT*S       #
          DB$DDIL;                 # DUMMY CALL WILL LOCK IN THE OVCAP #
          FOR INDEX=INDEX WHILE TQNEXT[0] NQ 0 DO 
            BEGIN 
            IF DB$CLOU(P<OFT>)     # SEARCH FOR ACTIVE UFT'S FOR       #
                                   # THIS AREA, CLOSE THEM, AND        #
                                   # RETURN "TRUE" IF ANY ARE FOUND.   #
  
            THEN                   # USER HAD THIS AREA OPEN.          #
              BEGIN 
              DB$TQTT(LOC(DB$CRER),0);  # TERMINATE THE TQT            #
              END 
            P<TQT> =TQNEXT[0];
            END                    # TQT LOOP    #
          DB$ODLC;                 # UNLOCK THE OVCAP                  #
          END                      # USERS OF THIS OFT                 #
  
        P<TQT> = TQTMTR;           # RESTORE POINTERS TO MONITOR       #
        P<RCB> = LOC(RCBMTR); 
  
        DB$DEDL(MSG1,DFLGMSG1);    # ISSUE *IN PROGRESS* MESSAGE       #
        DB$MSG(" DOWN IN PROGRESS:"); # NOTIFY DAYFILE                 #
        DB$YES;                    # RETURN TO SCANNER                 #
  
  
DOWNAREA2:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-A2"); 
        CONTROL ENDIF;
  
        OFSTATUS[0] = S"DOWN";     # AREA NOW DOWN                     #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETE* MESSAGE          #
        DB$MSG(MSG9);              # IDENTIFY AREA TO DAYFILE          #
        DB$MSG(MSG15);             # DAYFILE MSG *VERSION AFFECTED...* #
        DB$MSG("  DOWN COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
DOWNAREA3:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS06-A3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG8, DFLGMSG8);   # AREA ERRDOWNED                    #
        DB$DEDL(MSG7,DFLGMSG7);    # ISSUE COMMAND IGNORE...           #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
  
  
ENDCDCS:                           # CONTINUATION LOCATION FOR DB$TSCH #
      DB$ERR(54);                  # RUN ABORT, CDCS DOWN.             #
      GOTO WRAPUP;                 # RETURN FROM DB$ERR IF LTC FLAG    #
                                   # NOT SET.                          #
  
ENDSCHEMA:                         # CONTINUATION LOCATION FOR DB$TSCH #
      DB$ERR(44);                  # RUN ABORT, SCHEMA DOWN.           #
  
WRAPUP:                            # DELETE TQT ENTRY AND PROCESS      #
      DB$TQTD;                     # COMMAND COMPLETION.  TQTMTR WILL  #
      DB$WRP;                      # NOT BE DELETED DUE TO CHECKS IN   #
                                   # DB$TSCH AND DB$DSUA.              #
  
      END 
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 0 7 .        #
  
  
      PROC DB$DS07; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS07 - IDLE AN OBJECT
* *   C F RICHARDS                               DATE  11/30/78 
* *   A W ALLEN                                  DATE  12/03/79 
* 
* DC  PURPOSE 
* 
*     HANDLES THE *IDLE* COMMAND FOR CDCS OR A SCHEMA OR AN AREA. 
* 
* DC  ENTRY CONDITIONS
* 
*     AN IDLE COMMAND HAS BEEN ENTERED. 
*     SC AND AR PARAMETERS, IF ENTERED, HAVE BEEN VALIDATED AND ARE 
*     CORRECT.
* 
*     ASSUMPTIONS 
* 
*     DB$DSAI - AREA ID IF SPECIFIED, ELSE ZEROS. 
*     DB$DSAN - AREA NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSFL - OPTION FLAGS SET FOR THIS COMMAND.
*     DB$DSSI - SCHEMA-ID IS SPECIFIED, ELSE ZERO.
*     DB$DSSN - SCHEMA-NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSVN - PRIMARY VERSION NAME DETERMINED IN DB$DS19
* 
* DC  EXIT CONDITIONS 
* 
*     EXIT IS VIA DB$YES. 
*     IF OPERATOR CONFIRMATION IS REQUIRED, AN EXIT IS MADE FROM THIS 
*     ROUTINE TO THE CONFIRMATION HANDLER, DB$DSCF. A SUBSEQUENT
*     OPERATOR YES/NO RESPONSE WILL CAUSE EXECUTION TO RESUME IN THIS 
*     ROUTINE (THE CONFIRMATION RESPONSE HANDLERS EXIT THROUGH THE ENTRY
*     POINT RETURN LINK OF DB$DSCF). A SUBSEQUENT DB$YES EXIT FROM THIS 
*     ROUTINE WILL ACT LIKE AN EXIT FROM THE CONFIRMATION RESPONSE
*     HANDLER. THEREFORE, THE SYNGEN CODE FOLLOWING THE ORIGINAL CALL TO
*     THIS ROUTINE WILL BE UNREACHABLE AFTER A CALL TO THE CONFIRMATION 
*     HANDLER.
*     IF THE IDLE CANNOT BE INITIATED, A DIAGNOSTIC WILL BE ISSUED TO 
*     THE CONSOLE DISPLAY.
*     IF THE IDLE IS INITIATED, DAYFILE MESSAGES ARE ISSUED TO RECORD 
*     THE EVENT ON THE DAYFILE. 
*     IN CERTAIN CASES, THE IDLE CAN BE COMPLETED IMMEDIATELY, AND A
*     DAYFILE MESSAGE WILL BE ISSUED. 
* 
* DC  CALLING ROUTINES
* 
*     DB$DS03 - CONFIRMATION RESPONSE *NO* HANDLER (DB$DSCF RETURN) 
*     DB$DS04 - CONFIRMATION RESPONSE *YES* HANDLER (DB$DSCF RETURN)
*     DB$DSTX - SYNGEN SPECIFICATION (THROUGH DB$DDIF)
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$DCRL;           # CLEAR CDCS RESPONSE LINES         #
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DERL;           # ENTER RESPONSE LINE               #
      XREF PROC DB$DSCF;           # CONFIRMATION HANDLER              #
      XREF PROC DB$DUDF;           # UPDATE DYNAMIC FIELDS             #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$GOFT;           # GET OFT ENTRY IF ANY              #
      XREF FUNC DB$LNK;           # GET AND LINK A BLOCK               #
      XREF PROC DB$MSG;            # ISSUE DAYFILE AND B DISPLAY MSG   #
      XREF PROC DB$OFTC;           # CREATE AN OFT                     #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
*     INTERNAL CALLED ROUTINES
* 
*     PROC SETMSG5                - SET SCHEMA ID/NAME IN MESSAGE 5    -
*     PROC SETMSG9                - SET AREA ID/NAME IN MESSAGE 9      -
*     PROC SETMSG15               - SET VERSION NAME IN MESSAGE 15     -
* 
* DC  DESCRIPTION 
* 
*     USE THREE STATUS SWITCHES TO DETERMINE HOW TO DO THIS IDLE.  ONE
*     IS FOR CDCS, ONE FOR SCHEMAS, ONE FOR AREAS.
*     ALL EXITS FROM THIS ROUTINE ARE VIA DB$YES. 
 #
#     LOCAL VARIABLES                                                  #; 
  
      ITEM FOUND B;                # PARAMETER TO DB$GOFT              #
  
  
#     STATUS SWITCHES                                                  #
  
      SWITCH IDLECDCS:SACSTAT      # SWITCH FOR IDLE OF CDCS           #
        IDLECDCS1:UP, 
        IDLECDCS1:IDLING, 
        IDLECDCS2:IDLE, 
        IDLECDCS3:DOWNING,         # IDLE DISALLOWED IF DOWN INCOMPLETE#
        IDLECDCS2:DOWN; 
  
  
  
      SWITCH IDLESCHEMA:SACSTAT    # SWITCH FOR IDLE OF A SCHEMA       #
        IDLESCHEMA1:UP, 
        IDLESCHEMA1:IDLING, 
        IDLESCHEMA2:IDLE, 
        IDLESCHEMA3:DOWNING,       # IDLE DISALLOWED IF DOWN INCOMPLETE#
        IDLESCHEMA2:DOWN, 
        IDLESCHEMA4:ERRDOWN;       # TELL OF INTERNALLY DOWNED SCHEMA  #
  
  
  
      SWITCH IDLEAREA:SACSTAT      # SWITCH FOR IDLE OF AN AREA        #
        IDLEAREA1:UP, 
        IDLEAREA1:IDLING, 
        IDLEAREA2:IDLE, 
        IDLEAREA3:DOWNING,         # IDLE DISALLOWED IF DOWN INCOMPLETE#
        IDLEAREA2:DOWN, 
        IDLEAREA4:ERRDOWN;         # NO IDLE OF INTERNALLY DOWN AREA   #
  
  
  
  
#     E X E C U T A B L E   C O D E   F O R   D B $ D S 0 7            #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS07");
      CONTROL ENDIF;
  
#     I D L E   O F   C D C S                                          #
  
  
  
      IF DSFCDCS[0]                # IF *CDCS* OPTION SPECIFIED        #
      THEN
        BEGIN 
        GOTO IDLECDCS[DB$DSST];    # ACTION BASED ON SURRENT STATUS    #
  
  
IDLECDCS1:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-C1"); 
        CONTROL ENDIF;
  
        IF DB$DNAU EQ 0            # IF NO ACTIVE CDCS USERS           #
        THEN
          BEGIN 
          GOTO IDLECDCS[SACSTAT"IDLE"];  # TREAT AS IF IDLE ALREADY    #
          END 
  
        DB$DSST = S"IDLING";       # CDCS IS NOW STARTING TO IDLE      #
        DB$DEDL(MSG1, DFLGMSG1);   # ISSUE *IN PROGRESS* MESSAGE       #
        DB$MSG(" IDLE,CDCS:");
        DB$MSG("  IDLE IN PROGRESS:");
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLECDCS2:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-C2"); 
        CONTROL ENDIF;
  
        DB$DSST = S"IDLE";         # CDCS IS NOW IDLE                  #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETE* MESSAGE          #
        DB$MSG(" IDLE,CDCS:");
        DB$MSG("  IDLE COMPLETE:"); 
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLECDCS3:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-C3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3, DFLGMSG3);   # ISSUE *DOWN IN PROGRESS* MESSAGE  #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
        END 
  
  
  
  
#     I D L E   O F   A   S C H E M A                                  #
  
  
  
      IF DSFSC[0] AND NOT DSFAR[0] # IF SCHEMA SPECIFIED, BUT NOT AREA #
      THEN
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("DS07-S");
        CONTROL ENDIF;
  
        SETMSG5;                   # INSERT NAME AND ID INTO MESSAGE 5 #
        DB$DCRL;                   # CLEAR CDCS RESPONSE LINES         #
        DB$DERL(MSG5, DFLGMSG5);   # ISSUE *SCHEMA IS...* MESSAGE      #
        SAVSALX = SALX;            # SAVE SALX FOR THIS SCHEMA         #
        DB$DSCF;                   # REQUEST CONFIRMATION BEFORE IDLE  #
        SALX = SAVSALX;            # RESTORE SALX FOR THIS SCHEMA      #
        DB$DCRL;                   # CLEAR CDCS RESPONSE LINES         #
        IF NOT DB$DSCY             # IF OPERATOR RESPONSE NOT *YES*    #
        THEN
          BEGIN 
          DB$DEDL(MSG7, DFLGMSG7); # ISSUE *COMMAND IGNORED* MESSAGE   #
          DB$YES;                  # UNCONFIRMED - EXIT TO SCANNER     #
  
          END 
  
        GOTO IDLESCHEMA[SASCHST[SALX]];  # ACTION BASED ON CURRENT STS #
  
  
IDLESCHEMA1:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-S1"); 
        CONTROL ENDIF;
  
        IF SASCUSERS[SALX] EQ 0    # IF NO ACTIVE USER OF THIS SCHEMA  #
        THEN
          BEGIN 
          GOTO IDLESCHEMA[SACSTAT"IDLE"];  # TREAT AS IF IDLE ALREADY  #
          END 
  
        SASCHST[SALX] = S"IDLING"; # THE SCHEMA IS NOW STARTING TO IDLE#
        DB$DEDL(MSG1, DFLGMSG1);   # ISSUE *IN PROGRESS* MESSAGE       #
        DB$MSG(MSG5);              # ISSUE SCHEMA IDENTIFICATION MSG   #
        DB$MSG("  IDLE IN PROGRESS:");
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLESCHEMA2:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-S2"); 
        CONTROL ENDIF;
  
        SASCHST[SALX] = S"IDLE";   # SCHEMA IS NOW IDLE                #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETE* MESSAGE          #
        DB$MSG(MSG5);              # ISSUE SCHEMA IDENTIFICATION MSG   #
        DB$MSG("  IDLE COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLESCHEMA3:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-S3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3, DFLGMSG3);   # ISSUE *DOWN IN PROGRESS* MESSAGE  #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLESCHEMA4:  
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-S4"); 
        CONTROL ENDIF;
  
        DB$DCRL;                   # CLEAR CDCS CONSOLE RESPONSE LINES #
        DB$DERL(MSG4, DFLGMSG4);   # TELL OF INTERNALLY DOWNED SCHEMA  #
        DB$DEDL(MSG7, DFLGMSG7);   # ISSUE *COMMAND IGNORED* MESSAGE   #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
        END 
  
  
  
  
#     I D L E   O F   A N   A R E A                                    #
  
  
  
        BEGIN 
  
#     SCHEMA, AREA AND VERSION WERE DETERMINED IN DB$DS19              #
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("DS07-A");
        CONTROL ENDIF;
  
        SETMSG5;                   # PUT SCHEMA NAME/ID INTO MESSAGE 5 #
        DB$DCRL;                   # CLEAR DISPLAY RESPONSE LINES      #
        DB$DERL(MSG5,DFLGMSG5);    # ISSUE *SCHEMA IS...* MESSAGE      #
        SETMSG9;                   # PUT AREA NAME/ID INTO MESSAGE 9   #
        DB$DERL(MSG9,DFLGMSG9);    # ISSUE *AREA IS...* MESSAGE        #
        SETMSG15;                  # INSERT VERSION NAME IN MESSAGE 15 #
        DB$DERL(MSG15,DFLGMSG15);  # ISSUE *VERSION AFFECTED...*       #
        SAVSALX = SALX;            # SAVE SAL ADDRESS                  #
        DB$DSCF;                   # REQUEST OPERATOR CONFIRMATION     #
                                   # (INTERRUPTABLE ROUTINE)           #
        SALX = SAVSALX;            # RESTORE SAL ADDRESS               #
        DB$DCRL;                   # CLEAR DISPLAY RESPONSE LINES      #
        IF NOT DB$DSCY             # IF OPERATOR RESPONSE WAS NOT *YES*#
        THEN
          BEGIN 
          DB$DEDL(MSG7,DFLGMSG7);  # DIAGNOSTIC =*COMMAND IGNORED*     #
          DB$YES;                  # COMMAND NOT CONFIRMED - EXIT TO   #
                                   # SCANNER                           #
          END 
  
        DB$GOFT(DB$DSAI,DB$DSVN,FOUND); # FIND OFT FOR THIS AREA       #
        IF NOT FOUND               # CREATE ONE IF NONE                #
        THEN                       # THEN GET AN OFT BLOCK AND LINK IT #
          BEGIN                    # TO THE SAL AS THE FIRST ENTRY IN  #
                                   # THE OFT CHAIN                     #
          DB$OFTC;                 # CREATE AN OFT                     #
          OFVENAME[0] = DB$DSVN;   # INSERT VESRION NAME FOR THIS OFT  #
          OFARID[0] = DB$DSAI;     # SET AREA ID IN NEW OFT            #
          OFUSERS[0] = 0;          # NO USERS FOR NEW OFT              #
          OFSTATUS[0] = S"IDLE";   # SET STATUS OF OFT IS IDLE         #
          END 
  
        GOTO IDLEAREA[OFSTATUS[0]];# WHEN OFT EXISTS ACTION IS BASED ON#
                                   # CURRENT AREA STATUS               #
  
IDLEAREA1:                         # CURRENT STATUS = UP OR IDLING     #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-A1"); 
        CONTROL ENDIF;
  
        IF OFUSERS[0] EQ 0         # IF NO ACTIVE USERS OF THIS AREA   #
        THEN
          BEGIN 
          GOTO IDLEAREA[SACSTAT"IDLE"];   # GO SAY IDLE IS COMPLETE    #
          END 
  
        OFSTATUS[0] = S"IDLING";   # AREA IS STARTING TO IDLE          #
        DB$DEDL(MSG1,DFLGMSG1);    # ISSUE *NOW IN PROGRESS* MESSAGE   #
        DB$MSG(MSG9);              # DAYFILE MESSAGE = *AREA IS...*    #
        DB$MSG(MSG15);             # DAYFILE MSG *VERSION AFFECTED...* #
        DB$MSG("  IDLE IN PROGRESS:");
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLEAREA2:                         # CURRENT STATUS = IDLE OR DOWN     #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-A2"); 
        CONTROL ENDIF;
  
        OFSTATUS[0] = S"IDLE";     # JUST SAY THAT IDLE IS COMPLETED   #
        DB$DEDL(MSG2,DFLGMSG2);    # ISSUE *COMPLETED* MESSAGE         #
        DB$MSG(MSG9);              # DAYFILE MESSAGE = *AREA IS...*    #
        DB$MSG(MSG15);             # DAYFILE MSG *VERSION AFFECTED...* #
        DB$MSG("  IDLE COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLEAREA3:                         # CURRENT STATUS = DOWNING          #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-A3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3,DFLGMSG3);    # ISSUE *DOWN IN PROGRESS - IGNORED*#
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
IDLEAREA4:                         # CURRENT STATUS = ERRDOWN          #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS07-A4"); 
        CONTROL ENDIF;
  
        DB$DCRL;                   # CLEAR DISPLAY RESPONSE LINES      #
        DB$DERL(MSG8,DFLGMSG8);    # ISSUE *AREA DOWN DUE TO CRM ERROR*#
        DB$DEDL(MSG7,DFLGMSG7);    # ISSUE *COMMAND IGNORED* MESSAGE   #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
        END                        # END OF IDLE AREA PROCESSING       #
      END                          # END OF DB$DS07 (IDLE PROCESSING)  #
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 2 0 .        #
  
  
      PROC DB$DS20; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS20 - UP AN OBJECT
* *   C F RICHARDS                               DATE  11/30/78 
* *   A W ALLEN                                  DATE  12/03/79 
* 
* DC  PURPOSE 
* 
*     HANDLE THE *UP* COMMAND FOR CDCS OR A SCHEMA OR AN AREA.
* 
* DC  ENTRY CONDITIONS
* 
*     AN UP COMMAND HAS BEEN ENTERED. 
*     SC AND AR PARAMETERS, IF ENTERED, HAVE BEEN VALIDATED AND ARE 
*     CORRECT.
* 
*     ASSUMPTIONS 
* 
*     DB$DSAI - AREA ID IF SPECIFIED, ELSE ZEROS. 
*     DB$DSAN - AREA NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSFL - OPTION FLAGS SET FOR THIS COMMAND 
*     DB$DSSI - SCHEMA-ID IF SPECIFIED, ELSE ZERO.
*     DB$DSSN - SCHEMA-NAME IF SPECIFIED, ELSE BLANKS.
*     DB$DSVN - PRIMARY VERSION NAME DETERMINED IN DB$DS19
* 
* DC  EXIT CONDITIONS 
* 
*     EXIT VIA DB$YES. DB$TRMF SET FALSE IF UP OF CDCS. 
*     IF THE UP CAN NOT BE COMPLETED, A DIAGNOSTIC WILL BE ISSUED.
*     IF OPERATOR CONFIRMATION IS REQUIRED, EXIT FROM THIS ROUTINE WILL 
*     BE TO THE CONFIRMATION HANDLER FROM WHICH WE RETURN AFTER THE 
*     CONFIRMATION RESPONSE HAS BEEN RECEIVED. THE SUBSEQUENT EXIT VIA
*     DB$YES WILL ACT LIKE AN EXIT FROM THE CONFIRMATION RESPONSE 
*     HANDLER, THUS SYNGEN CODE FOLLOWING THE CALL TO THIS PROC WILL BE 
*     UNREACHABLE AFTER A CALL TO THE CONFIRMATION HANDLER. 
* 
* DC  CALLING ROUTINES
* 
*     DB$DSTX - SYNGEN SPECIFICATION (THROUGH DB$DDIF)
*     DB$DS03 - CONFIRMATION RESPONSE *NO* HANDLER (DB$DSCF RETURN) 
*     DB$DS04 - CONFIRMATION RESPONSE *YES* HANDLER (DB$DSCF RETURN)
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$CARS;           # AUTO-RECOVERY SEQUENCER           #
      XREF PROC DB$DCRL;           # CLEAR RESPONSE LINES              #
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DERL;           # ENTER RESPONSE LINES              #
      XREF PROC DB$DSCF;           # CONFIRMATION HANDLER              #
      XREF PROC DB$DUDF;           # UPDATE DYNAMIC FIELDS             #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$GOFT;           # GET OFT ENTRY IF ANY              #
      XREF PROC DB$LNKD;           # DELINK A BLOCK                    #
      XREF PROC DB$MSG;            # ISSUE DAYFILE AND B DISPLAY MSG   #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
* DC  DESCRIPTION 
* 
*     USE THREE STATUS SWITCHES TO DETERMINE HOW TO DO THIS UP.  ONE
*     SET IS FOR CDCS, ONE SET FOR SCHEMAS, AND ONE FOR AREAS.  ALL 
*     EXITS ARE THRU DB$YES.
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ABTFLG B;               # PARAMETER FOR DB$CARS             #
      ITEM FOUND B;                # PARAMETER FOR DB$GOFT             #
      ITEM XX;                     # INDUCTION VARIABLE                #
  
#     STATUS SWITCHES                                                  #
  
      SWITCH UPCDCS:SACSTAT        # SWITCH FOR UP OF CDCS             #
        UPCDCS1:UP, 
        UPCDCS1:IDLING, 
        UPCDCS1:IDLE, 
        UPCDCS2:DOWNING,           # UP DISALLOWED IF DOWN INCOMPLETE  #
        UPCDCS1:DOWN; 
  
  
      SWITCH UPSCHEMA:SACSTAT      # SWITCH FOR UP OF A SCHEMA         #
        UPSCHEMA2:UP, 
        UPSCHEMA2:IDLING, 
        UPSCHEMA2:IDLE, 
        UPSCHEMA3:DOWNING,         # UP DISALLOWED IF DOWN INCOMPLETE  #
        UPSCHEMA1:DOWN,            # RECOVER A DOWNED SCHEMA           #
        UPSCHEMA1:ERRDOWN;
  
  
      SWITCH UPAREA:SACSTAT        # SWITCH FOR UP OF AN AREA          #
        UPAREA1:UP,                # AREA ALREADY UP - COMMAND IGNORED #
        UPAREA2:IDLING,            # IDLE IN PROGRESS - UP THE AREA    #
        UPAREA4:IDLE,              # PROCESS UP COMMAND                #
        UPAREA3:DOWNING,           # DOWN IN PROGRESS - COMMAND IGNORED#
        UPAREA4:DOWN,              # PROCESS UP COMMAND                #
        UPAREA4:ERRDOWN;           # PROCESS UP COMMAND                #
  
  
  
  
#     E X E C U T A B L E   C O D E   F O R   D B $ D S 2 0            #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS20");
      CONTROL ENDIF;
  
#     U P   O F   C D C S                                              #
  
      IF DSFCDCS[0]                # IF *CDCS* OPTION SPECIFIED        #
      THEN
        BEGIN 
  
        CONTROL IFEQ DFFLOP,1;
          DB$FLOP("DS20-C");
        CONTROL ENDIF;
  
        DB$TRMF = FALSE;           # INSURE TERMINATION FLAG CLEARED   #
        GOTO UPCDCS[DB$DSST];      # ACTION BASED ON CURRENT STATUS    #
  
  
UPCDCS1:  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-C1"); 
        CONTROL ENDIF;
  
        DB$DSST = S"UP";           # CDCS STATUS IS NOW UP             #
        DB$DEDL(MSG2, DFLGMSG2);   # ISSUE *COMPLETE* MESSAGE          #
        DB$MSG(" UP,CDCS:");
        DB$MSG("  UP COMPLETE:"); 
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPCDCS2:  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-C2"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3, DFLGMSG3);   # ISSUE *DOWN IN PROGRESS* MESSAGE  #
        DB$DUDF;                   # UPDATE DYNAMIC FIELDS             #
        DB$YES;                    # EXIT TO SCANNER                   #
  
        END 
  
  
  
  
#     U P   O F   A   S C H E M A                                      #
  
  
  
      IF DSFSC[0] AND NOT DSFAR[0] # IF SCHEMA SPECIFIED, BUT NOT AREA #
      THEN
        BEGIN 
  
        CONTROL IFEQ DFFLOP,1;
          DB$FLOP("DS20-S");
        CONTROL ENDIF;
  
        GOTO UPSCHEMA[SASCHST[SALX]]; # ACTION BASED ON CURRENT STATUS #
  
  
UPSCHEMA1:                         # CURRENT STATUS = DOWN OR ERRDOWN  #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-S1"); 
        CONTROL ENDIF;
  
        DB$MSG("  UP IN PROGRESS:");
  
#       "UP" ALL THE AREAS ASSOCIATED WITH THE SCHEMA                  #
  
        P<OFT> = SAOFTLSP[SALX];
        FOR XX=XX WHILE LOC(OFT) NQ 0 
        DO
          BEGIN 
          IF OFRETCT[0] EQ 0
            AND OFUSERS[0]EQ 0
          THEN
            BEGIN                  # IF NOT RETAINED,                  #
            DB$LNKD(P<OFT>);       # RETURN DUMMY OFT'S                #
            END 
          ELSE
            BEGIN 
            OFSTATUS[0] = S"UP";
            END 
          END 
  
        SASCHST[SALX] = S"UP";     # FLAG THE SCHEMA STATUS AS "UP"    #
        DB$CARS(ABTFLG,SALX +1);   # RECOVER THE SCHEMA                #
        IF ABTFLG 
        THEN
          BEGIN 
          SASCHST[SALX] = S"ERRDOWN";  # FLAG THE SCHEMA AS ERROR DOWN #
          DB$DEDL(MSG16,DFLGMSG16);  # SCHEMA RECOVERY FAILED          #
          END 
        ELSE
          BEGIN 
          DB$DEDL(MSG2,DFLGMSG2);  # "COMPLETED" MESSAGE               #
          DB$MSG("  UP COMPLETE:"); 
          END 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPSCHEMA2:                         # CURRENT STATUS = UP, IDLE OR      #
                                   #                  IDLING           #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-S2"); 
        CONTROL ENDIF;
  
        SASCHST[SALX] = S"UP";     # SCHEMA STATUS IS NOW UP           #
        DB$DEDL(MSG2,DFLGMSG2);    # ISSUE *COMPLETED* MESSAGE         #
        SETMSG5;                   # PUT SCHEMA NAME/ID INTO MESSAGE 5 #
        DB$MSG(MSG5);              # DAYFILE MESSAGE = *SCHEMA IS...*  #
        DB$MSG("  UP COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPSCHEMA3:                         # CURRENT STATUS = DOWNING          #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-S3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3,DFLGMSG3);    # ISSUE *DOWN IN PROGRESS - IGNORED*#
        DB$YES;                    # EXIT TO SCANNER                   #
  
        END                        # END OF UP SCHEMA PROCESSING       #
  
  
  
  
#     U P   O F   A N   A R E A                                        #
  
  
  
        BEGIN 
        DB$GOFT(DB$DSAI,DB$DSVN,FOUND); # FIND OFT FOR THIS AREA       #
        IF NOT FOUND               # TREAT AS THOUGH IT*S UP           #
        THEN
          BEGIN                    # TREAT AS IF AREA IS ALREADY UP    #
          GOTO UPAREA[SACSTAT"UP"]; 
          END 
  
        GOTO UPAREA[OFSTATUS[0]];  # ACTION BASED ON CURRENT STATUS    #
  
  
UPAREA1:                           # CURRENT STATUS = UP               #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-A1"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG10,DFLGMSG10);  # ISSUE *AREA ALREADY UP - IGNORED* #
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPAREA2:                           # CURRENT STATUS = IDLING           #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-A2"); 
        CONTROL ENDIF;
  
        OFSTATUS[0] = S"UP";       # OFT IS NOW UP                     #
        DB$DEDL(MSG2,DFLGMSG2);    # ISSUE *COMPLETED* MESSAGE         #
        SETMSG9;                   # PUT AREA NAME/ID INTO MESSAGE 9   #
        DB$MSG(MSG9);              # DAYFILE MESSAGE = *AREA IS...*    #
        SETMSG15;                  # INSERT VERSION NAME IN MESSAGE 15 #
        DB$MSG(MSG15);             # DAYFILE MSG *VERSION AFFECTED...* #
        DB$MSG("  UP COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPAREA3:                           # CURRENT STATUS = DOWNING          #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-A3"); 
        CONTROL ENDIF;
  
        DB$DEDL(MSG3,DFLGMSG3);    # ISSUE *DOWN IN PROGRESS - IGNORED*#
        DB$YES;                    # EXIT TO SCANNER                   #
  
  
UPAREA4:                           # CURRENT STATUS = IDLE, DOWN OR    #
                                   # ERRDOWN.  BRING AREA UP.          #
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS20-A4"); 
        CONTROL ENDIF;
  
        IF OFRETCT[0] EQ 0         # IF AREA IS NOT RETAINED           #
        THEN
          BEGIN 
          DB$LNKD(P<OFT>);         # THEN JUST DELINK THE OFT          #
          END 
        ELSE                       # WHEN AREA HAS BEEN RETAINED,      #
          BEGIN                    # OFT STAYS ON OFT CHAIN            #
          OFSTATUS[0] = S"UP";     # AND OFT IS NOW UP                 #
          END 
        DB$DEDL(MSG2,DFLGMSG2);    # ISSUE *COMPLETED* MESSAGE         #
        SETMSG9;                   # PUT AREA NAME/ID INTO MESSAGE 9   #
        DB$MSG(MSG9);              # DAYFILE MESSAGE = *AREA IS...*    #
        SETMSG15;                  # INSERT VERSION NAME IN MESSAGE 15 #
        DB$MSG(MSG15);             # DAYFILE MSG *VERSION AFFECTED...* #
        DB$MSG("  UP COMPLETE:"); 
        DB$YES;                    # EXIT TO SCANNER                   #
        END                        # END OF UP AREA PROCESSING         #
  
      END                          # END OF DB$DS20 (UP PROCESSING)    #
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 2 8 .        #
  
  
      PROC DB$DS28; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS28 - *TERM* COMMAND EXECUTION
* *   C F RICHARDS                               DATE  11/30/78 
* 
* DC  PURPOSE 
* 
*     SET THE CDCS TERMINATION FLAG, DB$TRMF, AND COMMUNICATE WHETHER 
*     CDCS IS UP OR NOT TO THE SYNGEN CODE. 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     IF DB$TRMF ALREADY SET, THEN CDCS IS NOT IN STATUS S"UP". 
* 
* DC  EXIT CONDITIONS 
* 
*     DB$TRMF IS SET TRUE.
*     EXIT VIA DB$YES IF CDCS IS UP.
*     OTHERWISE EXIT VIA DB$NO
* 
* DC  CALLING ROUTINES
* 
*     DB$DSTX - SYNGEN SPECIFICATION (THROUGH DB$DDIF)
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DUDF;           # UPDATE DYNAMIC FIELDS             #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$MSG;            # ISSUE DAYFILE AND B DISPLAY MSG   #
      XREF PROC DB$NO;             # FAILURE RETURN TO SCANNER         #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
* DC  DESCRIPTION 
* 
*     ECHO THE COMMAND TO THE DAYFILE.
*     IF DB$TRMF IS ALREADY TRUE, THEN CDCS IS ALREADY ON ITS WAY TO
*     TERMINATION, ISSUE IN PROGRESS MESSAGE, EXIT VIA DB$NO. 
*     SET DB$TRMF.
*     IF CDCS IS *UP*, THEN EXIT VIA DB$YES SO FURTHER ACTIONS CAN
*     IDLE CDCS.
*     ALL OTHER CASES ISSUE IN PROGRESS MESSAGE AND EXIT VIA DB$NO. 
 #
  
  
  
#     B E G I N   D B $ D S 2 8   E X E C U T A B L E   C O D E .      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS28");
      CONTROL ENDIF;
  
      DB$MSG(" TERM:"); 
      IF DB$TRMF                   # IF TERMINATION FLAG ALREADY SET   #
      THEN
        BEGIN 
        DB$DEDL(MSG1, DFLGMSG1);   # ISSUE *IN PROGRESS* MESSAGE       #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS28-1");
        CONTROL ENDIF;
  
        DB$NO;                     # EXIT - CDCS CANNOT BE *UP*        #
  
        END 
  
      DB$TRMF = TRUE;              # SET TERMINATION FLAG              #
      IF DB$DSST EQ S"UP"          # IF CDCS IS *UP*                   #
      THEN
        BEGIN 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS28-2");
        CONTROL ENDIF;
  
        DB$YES;                    # EXIT - CDCS IS *UP*               #
  
        END 
  
      DB$DEDL(MSG1, DFLGMSG1);     # ISSUE *IN PROGRESS* MESSAGE       #
      DB$DUDF;                     # UPDATE DYNAMIC FIELDS             #
      DB$NO;                       # EXIT - CDCS IS NOT *UP*           #
  
      END 
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 3 0 .        #
  
  
  
      PROC DB$DS30; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS30 -- RETAIN AN OBJECT 
* *   W P CEAGLIO                                DATE  05/01/79 
* 
* DC  PURPOSE 
* 
*     PERFORM THE LONG-TERM ACTION FOR THE RETAIN COMMAND 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     DB$DSSN      CONTAINS SCHEMA NAME 
*     DB$DSSB      CONTAINS SUBSCHEMA NAME OR BLANKS
*     SALX         CONTAINS INDEX OF SAL ENTRY FOR SPECIFIED SCHEMA 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL
* 
*       EXIT VIA DB$YES 
* 
*       SCHEMA NAME ONLY--LONG-TERM FLAG SET IN SAL ENTRY 
* 
*       SCHEMA AND SUBSCHEMA NAMES--LONG-TERM FLAG SET IN ASL ENTRY (AN 
*       ASL ENTRY IS CREATED IF NECESSARY)
* 
*     ABNORMAL
* 
*       EXIT VIA DB$NO
* 
*       COMMAND IGNORED.  IF UNKNOWN SCHEMA OR SUBSCHEMA, MESSAGE IS
*       DISPLAYED ON CONSOLE. 
* 
* DC  CALLING ROUTINES
* 
*     DB$DSTX      SYNGEN SPECIFICATION (THRU DB$DDIF)
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DCRL;           # CLEAR CDCS RESPONSE LINES         #
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DERL;           # ENTER RESPONSE LINE               #
      XREF PROC DB$DSCF;           # CONFIRM COMMAND PARAMETERS        #
      XREF PROC DB$DSFS;           # FIND SCHEMA                       #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$LTSC;           # SCHEMA LONG-TERM INVOKE PROC      #
      XREF PROC DB$LTSB;           # SUB-SCHEMA LONG-TERM INVOKE PROC  #
      XREF PROC DB$NO;             # FAILURE RETURN TO SCANNER         #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
*     INTERNAL CALLED PROCS 
* 
*     SETMSG5      SET NAME/ID IN MESSAGE 5 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     -  LOCATE SCHEMA NAME IN SAL--IF NOT THERE, ISSUE ERROR.
* 
*     -  DISPLAY SELECTED SCHEMA AND REQUEST CONFIRMATION.  IF RESPONSE 
*        IS NOT *YES*, IGNORE COMMAND.
* 
*     -  IF SUB-SCHEMA NAME WAS NOT SPECIFIED, CALL THE SCHEMA LONG-TERM
*        INVOKE PROCESSOR.  EXIT TO DB$YES. 
* 
*     -  OTHERWISE, COMMAND INVOLVES SUB-SCHEMA.  IF SCHEMA LONG-TERM 
*        MODE IS ALREADY IN EFFECT, THEN ISSUE DIAGNOSTIC AND EXIT TO 
*        DB$NO.  ELSE, CALL THE SUB-SCHEMA LONG-TERM INVOKE PROCESSOR.
*        IF THERE WAS NO ERROR, EXIT TO DB$YES--ELSE ISSUE DIAGNOSTIC 
*        AND EXIT TO DB$NO. 
* 
 #
  
  
  
#     S T A R T  O F  D B $ D S 3 0  E X E C U T A B L E  C O D E      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS30");
      CONTROL ENDIF;
  
  
#     FIND SCHEMA ENTRY IN THE SAL--IF NOT THERE, ISSUE ERROR          #
  
      DB$DSFS(FOUND); 
      IF NOT FOUND
      THEN
        BEGIN 
        DB$DEDL(MSG6,DFLGMSG6);    # UNKNOWN SCHEMA                    #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS30-1");
        CONTROL ENDIF;
  
        DB$YES; 
        END 
  
#     OUTPUT MESSAGE OF SELECTED SCHEMA AND REQUEST CONFIRMATION FROM  #
#     THE OPERATOR.  IF RESPONSE IS NOT *YES*, IGNORE COMMAND.         #
  
      SETMSG5;                     # INSERT SCHEMA NAME/ID INTO MESSAGE#
      DB$DEDL(MSG5,DFLGMSG5);      # ISSUE MESSAGE                     #
                                   # THE SCHEMA ID/NAME IS NNNN/XXXX...#
      SAVSALX = SALX; 
      DB$DSCF;                     # REQUEST CONFIRMATION              #
      SALX = SAVSALX; 
      DB$DCRL;
      IF NOT DB$DSCY               # IGNORE COMMAND IF NOT *YES*       #
      THEN
        BEGIN 
        DB$DEDL(MSG7,DFLGMSG7); 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS30-2");
        CONTROL ENDIF;
  
        DB$YES; 
        END 
  
#     CALL SCHEMA OR SUBSCHEMA LONG-TERM MANAGER DEPENDING ON WHETHER  #
#     OR NOT A SUBSCHEMA NAME WAS SPECIFIED(RETAIN OPTION IS *TRUE*)   #
  
      IF DB$DSSB EQ " " 
      THEN
        BEGIN 
        IF SASCLTIF [SALX]
        THEN
          BEGIN 
          DB$DERL(MSG13,DFLGMSG13);# SCHEMA ALREADY IN RETENTION MODE  #
          DB$DEDL(MSG7,DFLGMSG7);  # COMMAND IGNORED                   #
  
          CONTROL IFGR DFFLOP,1;
            DB$FLOP("DS30-3");
          CONTROL ENDIF;
  
          DB$NO;
          END 
        ELSE
          BEGIN 
          DB$LTSC(TRUE);
  
          CONTROL IFGR DFFLOP,1;
            DB$FLOP("DS30-4");
          CONTROL ENDIF;
  
          DB$YES; 
          END 
        END 
  
#     SUBSCHEMA RETENTION CALL. IGNORE IF SCHEMA ALREADY IN RETENTION  #
#     MODE                                                             #
  
  
      IF SASCLTIF [SALX]
      THEN
        BEGIN 
        DB$DERL(MSG13,DFLGMSG13);  # SCHEMA ALREADY IN RETENTION MODE  #
        DB$DEDL(MSG7,DFLGMSG7);    # COMMAND IGONORED                  #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS30-5");
        CONTROL ENDIF;
  
        DB$NO;
        END 
  
#     OTHERWISE, CALL THE SUB-SCHEMA LONG-TERM MANAGER. IF THERE WAS   #
#     AN ERROR, DISPLAY MESSAGE.                                       #
  
      ELSE
        BEGIN 
        DB$LTSB(DB$DSSB,TRUE,ERSTAT); 
        IF ERSTAT EQ 0
        THEN
          BEGIN 
  
          CONTROL IFGR DFFLOP,1;
            DB$FLOP("DS30-6");
          CONTROL ENDIF;
  
          DB$YES; 
          END 
  
        IF ERSTAT EQ 1
        THEN
          BEGIN 
          DB$DEDL(MSG12,DFLGMSG12);# UNKNOWN OR INACTIVE SUBSCHEMA     #
          END 
        ELSE
          BEGIN 
          DB$DERL(MSG11,DFLGMSG11);# SUBSCHEMA ALREADY IN RETENTION    #
                                   #                      MODE         #
          DB$DEDL(MSG7,DFLGMSG7);  # COMMAND IGNORED                   #
          END 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS30-7");
        CONTROL ENDIF;
  
        DB$NO;
        END 
  
      END 
  
  
  
  
#     E M B E D D E D   P R O C E D U R E   -   D B $ D S 3 1 .        #
  
  
      PROC DB$DS31; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   DB$DS31 -- RETURN AN OBJECT 
* *   W P CEAGLIO                                DATE  05/01/79 
* 
* DC  PURPOSE 
* 
*     PERFORM THE LONG-TERM ACTION FOR THE RETURN COMMAND 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     DB$DSSN      CONTAINS SCHEMA NAME 
*     DB$DSSB      CONTAINS SUBSCHEMA NAME OR BLANKS
*     SALX         CONTAINS INDEX OF SAL ENTRY FOR SPECIFIED SCHEMA 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL
* 
*       EXIT VIA DB$YES 
* 
*       SCHEMA NAME ONLY--LONG-TERM FLAG CLEARED IN SAL ENTRY 
* 
*       SCHEMA AND SUBSCHEMA NAMES--LONG-TERM FLAG CLEARED IN ASL ENTRY 
* 
*     ABNORMAL
* 
*       EXIT VIA DB$NO
* 
*       COMMAND IGNORED.  IF UNKNOWN SCHEMA OR SUBSCHEMA, MESSAGE IS
*       DISPLAYED ON CONSOLE. 
* 
* DC  CALLING ROUTINES
* 
*     DB$DSTX      SYNGEN SPECIFICATION (THRU DB$DDIF)
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DCRL;           # CLEAR CDCS RESPONSE LINES         #
      XREF PROC DB$DEDL;           # ENTER DIAGNOSTIC LINE             #
      XREF PROC DB$DERL;           # ENTER RESPONSE LINE               #
      XREF PROC DB$DSCF;           # CONFIRM COMMAND PARAMETERS        #
      XREF PROC DB$DSFS;           # FIND SCHEMA                       #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$LTSC;           # SCHEMA LONG-TERM INVOKE PROC      #
      XREF PROC DB$LTSB;           # SUBSCHEMA RETAIN/RETURN PROCESSOR #
      XREF PROC DB$NO;             # FAILURE RETURN TO SCANNER         #
      XREF PROC DB$YES;            # SUCCESS RETURN TO SCANNER         #
# 
*     INTERNAL CALLED PROCS 
* 
*     SETMSG5      SET NAME/ID IN MESSAGE 5 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     -  LOCATE SCHEMA NAME IN SAL--IF NOT THERE, ISSUE ERROR.
* 
*     -  DISPLAY SELECTED SCHEMA AND REQUEST CONFIRMATION.  IF RESPONSE 
*        IS NOT *YES*, IGNORE COMMAND.
* 
* 
*     -  IF SUB-SCHEMA NAME WAS NOT SPECIFIED, CALL THE SCHEMA LONG-TERM
*        INVOKE PROCESSOR.  EXIT TO DB$YES. 
* 
*     -  OTHERWISE, COMMAND INVOLVES SUB-SCHEMA.  IF SCHEMA LONG-TERM 
*        MODE IS ALREADY IN EFFECT, THEN ISSUE DIAGNOSTIC AND EXIT TO 
*        DB$NO.  ELSE, CALL THE SUB-SCHEMA LONG-TERM INVOKE PROCESSOR.
*        IF THERE WAS NO ERROR, EXIT TO DB$YES--ELSE ISSUE DIAGNOSTIC 
*        AND EXIT TO DB$NO. 
* 
 #
  
  
  
#     S T A R T  O F  D B $ D S 3 1  E X E C U T A B L E  C O D E      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DS31");
      CONTROL ENDIF;
  
#     FIND SCHEMA ENTRY IN THE SAL--IF NOT THERE, ISSUE ERROR          #
  
      DB$DSFS(FOUND); 
      IF NOT FOUND
      THEN
        BEGIN 
        DB$DEDL(MSG6,DFLGMSG6); 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS31-1");
        CONTROL ENDIF;
  
        DB$YES; 
        END 
  
#     OUTPUT MESSAGE OF SELECTED SCHEMA AND REQUEST CONFIRMATION FROM  #
#     THE OPERATOR.  IF RESPONSE IS NOT *YES*, IGNORE COMMAND.         #
  
      SETMSG5;                     # INSERT SCHEMA NAME/ID INTO MESSAGE#
      DB$DEDL(MSG5,DFLGMSG5);      # ISSUE MESSAGE                     #
      SAVSALX = SALX; 
      DB$DSCF;                     # REQUEST CONFIRMATION              #
      SALX = SAVSALX; 
      DB$DCRL;
      IF NOT DB$DSCY               # IGNORE COMMAND IF NOT *YES*       #
      THEN
        BEGIN 
        DB$DEDL(MSG7,DFLGMSG7); 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS31-2");
        CONTROL ENDIF;
  
        DB$YES; 
        END 
  
  
#     CALL SCHEMA OR SUBSCHEMA LONG-TERM MANAGER DEPENDING ON WHETHER  #
#     OR NOT A SUBSCHEMA NAME WAS SPECIFIED(RETURN OPTION IS *FALSE*)  #
  
      IF DB$DSSB EQ " " 
      THEN
        BEGIN 
        DB$LTSC(FALSE);            # SCHEMA RETAIN/RETURN PROCESSOR    #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS31-3");
        CONTROL ENDIF;
  
        DB$YES; 
        END 
  
#     SUB-SCHEMA LONG-TERM CALL.  IGNORE IF SCHEMA ALREADY IN LONG-TERM#
#     MODE                                                             #
  
      IF SASCLTIF [SALX]
      THEN
        BEGIN 
        DB$DERL(MSG13,DFLGMSG13);  # SCHEMA ALREADY IN RETENTION MODE  #
        DB$DEDL(MSG7,DFLGMSG7);    # COMMAND IGNORED                   #
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS31-4");
        CONTROL ENDIF;
  
        DB$NO;
        END 
  
#     OTHERWISE, CALL THE SUB-SCHEMA LONG-TERM MANAGER. IF THERE WAS   #
#     AN ERROR, DISPLAY MESSAGE.                                       #
  
      ELSE
        BEGIN 
        DB$LTSB(DB$DSSB,FALSE,ERSTAT);
        IF ERSTAT EQ 0
        THEN
          BEGIN 
  
          CONTROL IFGR DFFLOP,1;
            DB$FLOP("DS31-5");
          CONTROL ENDIF;
  
          DB$YES; 
          END 
  
        IF ERSTAT EQ 1             # UNKNOWN OR INACTIVE SUBSCHEMA     #
        THEN
          BEGIN 
          DB$DEDL(MSG12,DFLGMSG12);# UNKNOWN OR INACTIVE SUBSCHEMA     #
          END 
        ELSE
          BEGIN 
          DB$DEDL(MSG14,DFLGMSG14);# SUBSCHEMA NOT IN RETENTION MODE   #
          END 
  
        CONTROL IFGR DFFLOP,1;
          DB$FLOP("DS31-6");
        CONTROL ENDIF;
  
        DB$NO;
        END 
  
      END 
  
  
  
#     I N T E R N A L   P R O C E D U R E   -   S E T M S G 5 .        #
  
  
      PROC SETMSG5; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   SETMSG5 - INSERT NAME AND ID IN MESSAGE 5 
* *   C F RICHARDS                               DATE  11/30/78 
* 
* DC  PURPOSE 
* 
*     INSERT THE SCHEMA NAME AND SCHEMA ID INTO A MESSAGE ITEM WHICH IS 
*     GLOBAL TO THE DOWN, UP, AND IDLE PROCESSORS. THIS MESSAGE IS
*     USED ON THE CONSOLE DISPLAY AND CAN BE ISSUED TO THE DAYFILE. 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     SALX - INDICATES THE SCHEMA ENTRY FROM WHICH WE GET THE SCHEMA ID 
*            AND SCHEMA NAME. 
* 
* DC  EXIT CONDITIONS 
* 
*     MSG5 - CONTAINS THE SCHEMA-ID (PIC ZZZ9) AND SCHEMA-NAME
*            (PIC X(30)) INSERTED AT CHARACTER POSITIONS
*            DFCPMSG5ID  AND  DFCPMSG5NM. 
* 
* DC  CALLING ROUTINES
* 
*     DB$DS06 - DOWN AN OBJECT
*     DB$DS07 - IDLE AN OBJECT
*     DB$DS20 - UP AN OBJECT
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEB C(10);  # BINARY TO DECIMAL WITH BLANK FILL    #
# 
* DC  DESCRIPTION 
* 
*     MOVE THE NAME AND ID INTO THE MESSAGE.
 #
  
  
  
#     E X E C U T A B L E   C O D E   F O R   S E T M S G 5            #
  
  
      C<DFCPMSG5ID, 4>MSG5 = DB$CDEB(SASCHID[SALX], 4); 
      C<DFCPMSG5NM,30>MSG5 = SASCNAME[SALX];
      RETURN; 
  
      END 
  
  
  
  
#     I N T E R N A L   P R O C E D U R E   -   S E T M S G 9 .        #
  
  
      PROC SETMSG9; 
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   SETMSG9 - INSERT NAME AND ID INTO MESSAGE 9 
* *   LG WHITE                                   DATE  11/03/79 
* 
* DC  PURPOSE 
* 
*     INSERT AREA NAME AND AREA ID INTO A MESSAGE WHICH IS COMMON 
*     TO UP, DOWN, AND IDLE PROCESSING.  THIS MESSAGE CAN BE ISSUED 
*     TO CONSOLE OR DAYFILE.
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     DB$DSAI CONTAINS AREA ID.  DB$DSAN CONTAINS AREA NAME.
* 
* DC  EXIT CONDITIONS 
* 
*     NAME AND ID ARE IN MESSAGE 9
* 
* DC  CALLING ROUTINES
* 
*     DB$DS06 - DOWN AN OBJECT
*     DB$DS07 - IDLE AN OBJECT
*     DB$DS20 - UP AN OBJECT
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEB C(10);  # BINARY TO DECIMAL WITH BLANK FILL    #
# 
* DC DESCRIPTION
* 
*     MOVE NAME AND ID INTO APPROPRIATE PLACE IN MESSAGE
 #
  
  
#     E X E C U T A B L E   C O D E   S E T M S G 9                    #
  
  
      C<DFCPARID,4>MSG9 = DB$CDEB(DB$DSAI,4); 
      C<DFCPARNM,30>MSG9 = DB$DSAN; 
  
      END 
  
  
  
#     I N T E R N A L   P R O C E D U R E   -   S E T M S G 1 5 .      #
  
  
      PROC SETMSG15;
      BEGIN 
 #
* *   DB$DSCS                                    PAGE  1
* *   SETMSG15 - INSERT VERSION NAME IN MESSAGE 15
* *   M. E. STERMER                              DATE  11/21/80 
* 
* DC  PURPOSE 
* 
*     INSERT THE PRIMARY VERSION NAME INTO A MESAGE ITEM WHICH IS 
*     GLOBAL TO THE DOWN, UP, AND IDLE PROCESSOR.  THIS MESSAGE IS
*     USED ON THE CONSOLE DISPLAY AND CAN BE ISSUED TO THE DAYFILE. 
* 
* DC  ASSUMPTIONS 
* 
*     DB$DSVN CONTAINS THE PRIMARY VERSION NAME.
* 
* DC  EXIT CONDITIONS 
* 
*     VERSION NAME IS IN MESSAGE 15.
* 
* DC  CALLING ROUTINES
* 
*     DB$DS06 - DOWN AN OBJECT
*     DB$DS07 - IDLE AN OBJECT
*     DB$DS20 - UP AN OBJECT
* 
* DC  CALLED ROUTINES 
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     MOVE VERSION NAME INTO APPROPRIATE PART OF MESSAGE 15.
* 
 #
  
  
#     E X E C U T A B L E    C O D E    S E T M S G 1 5                #
  
  
      C<DFCPVERSION,7>MSG15 = DB$DSVN; # INSERT VERSION NAME           #
  
  
      END 
      END 
  
      TERM
