*DECK     DB$OFTR 
USETEXT CDCSCTX 
      PROC DB$OFTR; 
      BEGIN 
 #
* *   DB$OFTR - PROCESS AN OFT WITH NO USERS     PAGE  1
* *   A W ALLEN                                  DATE  01/30/81 
* 
* DC  PURPOSE 
* 
*     DO ALL THE PROCESSING REQUIRED WHEN AN OFT HAS NO MORE USERS. 
* 
* DC  ENTRY CONDITIONS
* 
*     P<OFT> IS SET TO AN OFT WITH OFUSERS = ZERO.
*     P<TQT> IS SET TO RUN-UNIT THAT JUST RELEASED THIS OFT.
*     P<RSARBLK> IS SET.
*     P<ASL> IS SET.
* 
* 
* DC  EXIT CONDITIONS 
* 
*     INTERNAL FILE TABLE (IFT), IF ANY, IS CLOSED AND CMM RELEASED.
*     IF FILE WAS *DOWNING*, *IDLING* OR DOWNING DUE TO AN ERROR, 
*       THEN COMPLETION MESSAGE IS ISSUED.
*     IF FILE ATTACHED AND NOT RETAINED, THEN FILE IS RETURNED AND CMM
*       FOR OFT IS RELEASED.
* 
* DC  CALLING ROUTINES
* 
*     DB$ADAX                      ATTACH DATABASE AND INDEX FILES
*     DB$ERR                       CDCS ERROR PROCESSOR 
*     DB$TQTD                      TQT DELETER
*     DB$VER$                      VERSION CHANGE SYMBIONT
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$FLOP;           # GENERATE A FLOW POINT             #
      XREF PROC DB$MSG;            # ISSUE DAYFILE MESSAGE             #
      XREF PROC DB$PUNT;           # ABORT CDCS                        #
      XREF PROC DB$RLSF;           # DATA FILE RELEASE PROCESSOR       #
# 
* 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
* 
* DC  DESCRIPTION 
* 
*     IF FILE IS IDLING 
*     THEN
*       PRINT *IDLE COMPLETE*.
*     IF FILE IS DOWNING
*     THEN
*       PRINT *DOWN COMPLETE*.
*     IF FILE IS ERROR DOWNED 
*     THEN
*       PRINT *INTERNAL DOWN COMPLETE*. 
*     IF SCHEMA IS NOT RETAINED 
*       AND SUBSCHEMA IS NOT RETAINED 
*       AND FILE IS NOT RETAINED BY ANY OTHER SUBSCHEMA 
*     THEN
*       RETURN FILE AND RELEASE CMM (DB$RLSF).
* 
 #
# 
* 
*     LOCAL VARIABLES AND DEFS
* 
# 
      ITEM MSG4 C(56) = 
        "THE AREA ID/NAME IS NNNN/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:"; 
  
      DEF DFCPMSG4ID # 20 #;       # BCP OF AREA ID IN MESSAGE 4       #
      DEF DFCPMSG4NM # 25 #;       # BCP OF AREA NAME IN MESSAGE 4     #
      CONTROL EJECT;
  
  
#     S T A R T   O F   D B $ O F T R   E X E C U T A B L E   C O D E  #
  
  
      BEGIN 
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("OFTR   ");        # GENERATE A FLOW POINT.            #
      CONTROL ENDIF;
  
      P<UFT> = LOC(OFUFT);
      IF UFNEXT[0] GR 0 
      THEN
        BEGIN 
        DB$PUNT("DB$OFTR"); 
        END 
      P<UFT> = DFNPTR;
  
      IF OFSTATUS[0] EQ S"IDLING" 
      THEN
        BEGIN 
        OFSTATUS[0] = S"IDLE";
        SETMSG4;
        DB$MSG(MSG4); 
        DB$MSG("  IDLE COMPLETE:"); 
        END 
      IF OFSTATUS[0] EQ S"DOWNING"
      THEN
        BEGIN 
        OFSTATUS[0] = S"DOWN";
        SETMSG4;
        DB$MSG(MSG4); 
        DB$MSG("  DOWN COMPLETE:"); 
        END 
      IF OFSTATUS[0] EQ S"ERRDOWN"
      THEN
        BEGIN 
        SETMSG4;
        DB$MSG(MSG4); 
        DB$MSG("  INTERNAL DOWN COMPLETE:");
        END 
      IF NOT SASCLTIF[SALX]        # IF SCHEMA IS NOT RETAINED         #
        AND NOT ASLTIF[0]          # AND SUBSCHEMA IS NOT RETAINED     #
        AND OFRETCT[0] EQ 0        # AND FILE IS NOT RETAINED FOR      #
      THEN                         # ANOTHER SUBSCHEMA...              #
        BEGIN 
        DB$RLSF;                   # RETURN FILES AND RELEASE OFT AS   #
        END                        # REQUIRED.                         #
      RETURN; 
      END 
  
  
  
  
      PROC SETMSG4; 
      BEGIN 
 #
* *   DB$OFTR                                    PAGE  1
* *   SETMSG4 - INSERT AREA NAME, ID INTO MESSAGE 4 
* *   LGWHITE                                    DATE  10/17/79 
* 
* DC  PURPOSE 
* 
*     INSERT AREA NAME AND ID INTO A MESSAGE ITEM USED BOTH IN THE UP,
*     DOWN, IDLE PROCESSOR, BUT ALSO WHEN THAT ACTION IS COMPLETE.  THIS
*     MESSAGE CAN BE ISSUED TO THE CONSOLE AS WELL AS THE DAYFILE.
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     TQT POINTER IS SET TO RUN UNIT USING THE AREA INVOLVED.  OFT
*     POINTER IS SET TO THE AREA INVOLVED.  THE RSB AND RSARBLK POINTERS
*     ARE SET FOR THE AREA. 
* 
* DC  EXIT CONDITIONS 
* 
*     MSG4 CONTAINS AREA NAME AND AREA ID 
* 
* DC  CALLING ROUTINES
* 
*     DB$OFTR - OFT RELEASE PROCESSOR 
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEB C(10);  # BINARY TO DECIMAL WITH BLANK FILL    #
# 
* DC  DESCRIPTION 
* 
*     FIND THE AREA NAME IN THIS USER*S CST.  INSERT AREA NAME AND ID 
*     INTO MESSAGE. 
 #
      CONTROL NOLIST;              # CALL OF CSTARDCLS FOLLOWS         #
*CALL     CSTARDCLS 
      CONTROL LIST; 
  
  
#     E X E C U T A B L E   C O D E   F O R   S E T M S G 4            #
  
  
      P<ASL> = TQASL[0];
      P<CSFIXED> = ASCSTLOC[0]; 
      P<CSAREBLK> = LOC(CSFIXED) + RSARCSTP[0]; 
      C<DFCPMSG4ID,4>MSG4 = DB$CDEB(RSARID[0], 4);
      C<DFCPMSG4NM,30>MSG4 = C<0,CSANAMLW[0] * 10>CSANAME[0]; 
  
      END                          # END OF SETMSG4                    #
      END                          # END OF DB$OFTR MODULE             #
      TERM; 
