*DECK DB$LTSC 
USETEXT CDCSCTX 
      PROC DB$LTSC(LTIM); 
      BEGIN 
 #
* *   DB$LTSC -- SCHEMA LONG-TERM INVOKE         PAGE  1
* *   LONG-TERM INVOKE PROCESSOR
* *   W P CEAGLIO                                DATE  05/01/79 
* * 
* 
* DC  PURPOSE 
* 
*     SET OR CLEAR THE LONG-TERM INVOKE MODE FOR A SCHEMA 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
* 
# 
      ITEM LTIM      B;            # MODE (TRUE = SET FLAG)            #
# 
* 
*     ASSUMPTIONS 
* 
*     SALX    SET TO INDEX OF SAL ENTRY FOR APPLICABLE SCHEMA 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL   -- THE ACTION SPECIFIED BY THE MODE PARAMETER WAS DONE 
* 
* DC  CALLING ROUTINES
* 
*     DB$DS30 (WITHIN DB$DSCS)    L-DISPLAY 
*     DB$DS31 (WITHIN DB$DSCS)    L-DISPLAY 
* 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$FLOP;           # GENERATE A FLOW POINT             #
      XREF PROC DB$RLSA;           # RELEASE (RETURN) ASL              #
      XREF PROC DB$RLSF;           # RELEASE (RETURN) AREAS            #
      XREF PROC DB$RLSP;           # RELEASE (RETURN) DBP FILE         #
# 
* 
* 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
* 
* DC  DESCRIPTION 
* 
*     -  IF THE MODE IS TRUE, SET THE LONG-TERM FLAG IN THE SAL ENTRY 
*        AND RETURN 
* 
*     -  OTHERWISE, SCAN THE LIST OF ASL ENTRIES FOR THIS SAL ENTRY.
*        FOR EACH ENTRY WHICH HAS A ZERO USER COUNT,RELEASE THE ASL-
*        ELSE, CLEAR THE LONG-TERM FLAG IN THE ASL ENTRY. 
* 
*     -  NEXT, SCAN THE OFT CHAIN FOR THE SAL ENTRY.  FOR EACH ENTRY
*        WHICH HAS A ZERO USER COUNT, RELEASE THE DATA AND INDEX FILES
*        AND DELINK THE OFT ENTRY FROM THE CHAIN. 
* 
*     -  IF THE ASL CHAIN IS EMPTY, RELEASE THE DATA BASE PROCEDURE FILE
*        AND ANY LOADED PROCEDURES. 
* 
*     -  CLEAR THE LONG-TERM INVOKE FLAG FOR THE SAL ENTRY. 
* 
 #
      CONTROL EJECT;
  
#     LOCAL VARIABLES                                                  #
  
      ITEM I       I;              # SCRATCH -- FOR LOOPS              #
      ITEM J       I;              # SCRATCH -- FOR LOOPS              #
  
      CONTROL EJECT;
  
#     S T A R T  O F  D B $ L T S C  E X E C U T A B L E  C O D E      #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("LTSC   ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
#     IF THE MODE PARAMETER IS TRUE, SET THE LONG-TERM INVOKE FLAG IN  #
#     THE SAL ENTRY AND EXIT.                                          #
  
      IF LTIM 
        THEN
        BEGIN 
        SASCLTIF [SALX] = TRUE; 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("LTSC-R1");          # GENERATE FLOW POINT - RETURN 1#
        CONTROL ENDIF;
  
        RETURN; 
        END 
  
#     SCAN ASL CHAIN AND RELEASE ANY ENTRY WHICH HAS A ZERO COUNT. FOR #
#     AN ENTRY WITH A NON-ZERO COUNT, CLEAR THE LONG-TERM INVOKE FLAG. #
  
      J = SAASLPTR [SALX];
      FOR I=I WHILE J NQ 0
      DO
        BEGIN 
        P<ASL> = J; 
        J = ASNEXT [0]; 
        IF ASNUSERS [0] EQ 0
        THEN
          BEGIN 
          DB$RLSA;
          END 
        ELSE
          BEGIN 
          ASLTIF [0] = FALSE; 
          END 
        END 
  
#     SCAN THE OFT CHAIN FOR THE SAL ENTRY.  ZERO THE FILE RETAIN COUNT#
#     IN THE OFT.  IF THE ENTRY HAS A ZERO USER COUNT, RELEASE THE FILE#
#     AND DELINK THE OFT FROM THE CHAIN.                               #
  
      J = SAOFTLSP [SALX];
      FOR I=I WHILE J NQ 0
      DO
        BEGIN 
        P<OFT> = J; 
        J = OFNEXT [0]; 
        OFRETCT [0] = 0;
        IF OFUSERS [0] EQ 0 
        THEN
          BEGIN 
          DB$RLSF;
          END 
        END 
  
#     IF THE ASL CHAIN IS EMPTY, RELEASE THE DATA BASE PROCEDURE FILE  #
#     AND ANY LOADED PROCEDURES                                        #
  
      IF SAASLPTR [SALX] EQ 0 
        AND SADBPPTR [SALX] NQ 0
      THEN
        BEGIN 
        DB$RLSP;
        END 
  
#     CLEAR THE LONG-TERM INVOKE FLAG IN THE SAL ENTRY                 #
  
      SASCLTIF [SALX] = FALSE;
  
      END 
      TERM
