*DECK DB$SR72 
USETEXT MDBCMTX 
USETEXT MD10CTX 
USETEXT UTMPTTX 
USETEXT CUGBATX 
      PROC DB$SR72; 
 #
* *   DB$SR72 - REPLACE INDEX PF INFO            PAGE  1
* *   G. F. KENDALL                              DATE  08/05/79 
* *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/15/80 
* *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  03/30/84 
* 
* DC  PURPOSE 
* 
*     REPLACE INDEX PERMANENT FILE INFORMATION IN THE AREA INFORMATION
*     TABLE, PERMANENT FILE INFO TABLE (PIT) AND IN THE PFN TABLE.
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     AREACNT   - TOTAL NUMBER OF AREAS IN THE AREA DIRECTORY 
*     AREANAM   - NAME OF AREA TO BE CHANGED
*     AREAORD   - ORDINAL OF CURRENT AREA IN THE AREA DIRECTORY 
*     ARINFOBP  - ADDRESS OF BLOCK FOR AREA INFORMATION TABLE 
*     CURFILTYP - INDICATES THAT THE CURRENT FILE IS INDEX
*     VERSORD   - ORDINAL OF VERSION IN VERSION DIRECTORY TABLE 
*     MDPFINFO  - CONTAINS PERMANENT FILE INFORMATION FOR AREA
*     PITBP     - ADDRESS OF BLOCK FOR PERMANENT FILE INFORMATION TABLE 
*     VERINFBP  - ADDRESS OF BLOCK FOR VERSION INFORMATION TABLE
* 
* DC  EXIT CONDITIONS 
* 
*     IF THIS AREA HAS AN INDEX FILE SPECIFIED
*     THEN REPLACE INDEX PF DATA AND RETURN TO DB$YES,
*     ELSE ISSUE DIAGNOSTIC 153 AND RETURN TO DB$NO.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DIAG;     # ISSUE DIAGNOSTIC MESSAGE                #
      XREF PROC DB$MDPR;     # REPLACE PFN/ID/PACK IN PFN TABLE        #
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER NO RETURN           #
      XREF PROC DB$UAOS;     # ADJUST TABLE OFFSET                     #
      XREF PROC DB$YES;      # SYNTAX TABLE DRIVER YES RETURN          #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
# 
      BASED ARRAY MDARINFO S;  # AREA INFORMATION TABLE                #
        BEGIN 
*CALL MDARIDCLS 
      END 
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);  # VERSION INFO TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
 #
*     LOCAL VARIABLES 
# 
      ITEM I;                # INDUCTION VARIABLE                      #
      ITEM OFFSET;           # TABLE OFFSET IN PIT                     #
      ITEM OFFSETV;          # TABLE OFFSET IN VIT                     #
  
 #
* 
* DC  DESCRIPTION 
* 
*     CHECK IF AN INDEX FILE HAS BEEN SPECIFIED FOR THIS AREA. IF NOT,
*     ISSUE DIAGNOSTIC 153 AND EXIT TO DB$NO. 
*     REPLACE INDEX PERM FILE INFO IN THE PFN TABLE. IF THIS PF IS NOT
*     UNIQUE, DB$MDPF DOES NOT RETURN. IT EXITS TO DB$NO DIRECTLY. IF 
*     THE PF IS UNIQUE, THEN REPLACE THE INDEX PF INFO IN THE PIT. THEN 
*     CHECK IF THE VERSION IS MASTER (VERSORD = 1). IF IT IS, WE MUST 
*     ALSO REPLACE THE PF IN THE AREA INFORMATION TABLE.
* 
 #
  
  
  
#     B E G I N   D B $ S R 7 2   E X E C U T A B L E   C O D E .      #
  
  
      BEGIN                  # DB$SR72 EXECUTABLE CODE                 #
      P<MDARINFO> = ARINFOBP + 1 + (AREAORD - 1) * DFMDAIEN;
  
      IF NOT MDAIINDX[0]
      THEN                   # NO INDEX WAS SPECIFIED                  #
        BEGIN 
        DB$DIAG(153,AREANAM); 
        DB$NO;
        END 
  
#     CHANGE INDEX PF INFO IN PFN TABLE                                #
  
      OFFSETV = (VERSORD -1) * AREACNT * DFMDVIEN;
      P<TLC> = B<42,18>VERINFBP;   # TLC HEADER FOR THE VIT            #
  
      DB$UAOS(OFFSETV);            # ADJUST OFFSET FOR SWAPPED SEGMENTS#
  
      P<VERINFO> = LOC(TLC) + TLCHLEN[0] + OFFSETV; 
  
      OFFSET = MDVITFOFF[AREAORD -1] - DFPITHDR;
      P<TLC> = B<42,18>PITBP;      # TLC HEADER FOR THE PIT            #
  
      DB$UAOS(OFFSET);             # ADJUST OFFSET FOR SWAPPED SEGMENTS#
  
                                   # SET PERM FILE INFO POINTER        #
      P<PFINFO> = LOC(TLC) + TLCHLEN[0] + DFPITHDR + OFFSET;
      IF OFFSET + DFPITHDR LS TLCBSBW[0]
      THEN
        BEGIN 
        TLCDSMF[0] = TRUE;         # SET DISK SEGMENT MODIFIED FLAG    #
        END 
  
  
#     SET THE ENTRY CHANGED FLAG IN THE PIT.                           #
  
      MDPITCHGF[0] = TRUE;
      P<PITPF> = LOC(MDPITXNINFO[0]);  # POSITION PIT PF ENTRY         #
      DB$MDPR(MDPITNAME[0],MDPITUNID[0],MDPITSNPN[0], 
         MDPFINAME[CURFILTYP],MDPFUNID[CURFILTYP],MDPFSNPN[CURFILTYP]); 
#                                                                      #
#     CHANGE INDEX PF INFO IN THE PERMANENT FILE INFO TABLE (PIT)      #
#                                                                      #
      P<PUTENTRY> = LOC(PITPF); 
      P<GETENTRY> = LOC(MDPFWORD[CURFILTYP]); 
      FOR I = 0 STEP 1
        UNTIL DFPFENTLEN - 1
      DO
        BEGIN 
        PUTINT[I] = GETINT[I];
        END 
#                                                                      #
#     CHECK IF THE VERSION NAME IS MASTER (VERSORD = 1). IF IT IS WE   #
#     MUST ALSO MAKE THE CHANGE IN THE AREA INFORMATION TABLE          #
#     CHANGE INDEX PF INFO IN AREA INFORMATION TABLE                   #
  
      IF VERSORD EQ 1 
      THEN
        BEGIN 
        P<PUTENTRY> = LOC(MDAIIXPF[0]); 
        FOR I = 0 STEP 1
          UNTIL DFPFENTLEN - 1
        DO
          BEGIN 
          PUTINT[I] = GETINT[I];
          END 
        END 
      DB$YES;                # RETURN TO CALLER                        #
  
      END   # DB$SR72 # 
      TERM; 
