*DECK DB$FLSH 
USETEXT CDCSCTX 
      PROC DB$FLSH; 
      BEGIN 
 #
* *   DB$FLSH                                    PAGE  1
* *   C O GIMBER                                 9/2/76 
* 
* DC  PURPOSE 
* 
*     FLUSH (FORCE ALL ALTERED CRM BLOCKS TO BE WRITTEN TO DISK)
*     FOR ALL AREAS ON SCHEMA.
* 
* DC  ENTRY CONDITIONS
* 
*     SALX SET. 
* 
* DC  CALLING ROUTINES
* 
*     DB$QRF    (QRF FLUSH TASK)
*     DB$TQTD - DELETE USER 
*     DB$RPT$ - RECOVERY POINT SYMBIONT 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     #GENERATE FLOW POINT                      #
      XREF PROC DB$MBA;      #ALLOCATE TEMPORARY BLOCK# 
      XREF PROC FLUSHM;      #CRM FLUSH FILE# 
# 
* DC  NON-LOCAL VARIABLES 
# 
      XREF ARRAY DB$RA0;;    #USED TO TERMINATE PARAMETER LIST# 
# 
* 
*     CDCS COMMON 
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM INDEX; 
      ITEM INDEX2;
      BASED ARRAY LISTFITS;  #FIT LIST TO PASS TO CRM#
        BEGIN 
        ITEM LISTWORD;
        ITEM LISTLFN C(0,0,7);
        ITEM LISTADDR (0,42,18);
        END 
  
  
#     B E G I N   D B $ F L S H   E X E C U T A B L E   C O D E .      #
  
# GENERATE A FLOW POINT.                                               #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP ("FLSH  "); 
      CONTROL ENDIF;
  
 #
* 
* DC  DESCRIPTION 
* 
*     SEARCH OFT CHAIN TO FIND NUMBER OF ENTRIES. 
 #
      P<OFT> = LOC(SAOFTLSP[SALX]); 
      INDEX = 1;
      FOR INDEX=INDEX WHILE OFNEXT[0] NQ 0 DO 
        BEGIN 
        P<OFT> = OFNEXT[0]; 
        INDEX = INDEX+1;
        END 
 #
*     ALLOCATE BUFFER FOR FLUSH FIT LIST. 
 #
      DB$MBA(INDEX,P<LISTFITS>);
 #
*     SEARCH OFT CHAIN
*       SEARCH UFT CHAIN
*        IF OPEN FIT FOUND ADD IT TO FIT LIST.
*     TERMINATE FIT LIST WITH WORD OF ZEROES. 
 #
      P<OFT> = LOC(SAOFTLSP[SALX]); 
      INDEX = 0;
      FOR INDEX=INDEX WHILE OFNEXT[0] NQ 0 DO 
        BEGIN 
        P<OFT> = OFNEXT[0]; 
        IF OFSTATUS[0] EQ S"ERRDOWN"   # IF THE AREA IS DOWN           #
          OR OFUFT[0] EQ DFNPTR        # OR IS NOT OPENED BY ANY USER  #
        THEN
          BEGIN 
          TEST INDEX;                  # PROCESS THE NEXT OFT          #
  
          END 
        P<UFT> = LOC(OFUFT[0]); 
        FOR INDEX2=INDEX2 
        DO
          BEGIN 
          IF UFFITOC[0] EQ 1 THEN 
            BEGIN 
            IF UFFITFNF[0]   # IF FATAL ERROR FLAG IS SET              #
            THEN
              BEGIN 
              FPFTEX[0] = DFFTEX0;      # NEGATE ERROR EXIT PROCESSING #
              UFFITFNF[0] = FALSE;      # RESET FATAL ERROR FLAG       #
              END 
            LISTLFN[INDEX] = UFFITLFN[0]; 
            LISTADDR[INDEX] = LOC(UFFIT[0]);
            INDEX = INDEX+1;
            TEST INDEX;                # EXIT FROM UFT LOOP            #
                                       # PROCESS NEXT OFT              #
            END 
          P<UFT> = UFNEXT[0]; 
          IF LOC(UFT) EQ LOC(OFUFT[0])
          THEN
            BEGIN 
            TEST INDEX;                # EXIT FROM UFT LOOP            #
                                       # PROCESS NEXT OFT              #
            END 
          END  #INDEX2 LOOP#
        END  #INDEX LOOP# 
      LISTWORD[INDEX] = 0;
 #
*     IF AREAS ARE OPENED FOR SCHEMA THEN 
*       ISSUE CRM FLUSH.
 #
      IF INDEX NQ 0 THEN
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP ("FLSH-1");  # GENERATE A FLOW POINT                 #
        CONTROL ENDIF;
  
        FLUSHM(LISTFITS,DB$RA0);
        END 
      RETURN; 
      END  #DB$FLSH#
      TERM; 
