*DECK DB$SR52 
USETEXT MDBCMTX 
USETEXT UTMPTTX 
USETEXT MD10CTX 
      PROC DB$SR52; 
      BEGIN 
 #
* *   DB$SR52 - CHANGE AREA TO SAME AS MASTER    PAGE  1
* *   J. G. SERPA                                DATE  10/02/80 
* *   BOB MCALLESTER  - TABLE SEGMENTATION       DATE  03/30/84 
* 
* DC  PURPOSE 
* 
*     CHANGE AN AREA PERMANENT FILE, INDEX FILE, LOG OPTIONS AND
*     RECOVERY OPTIONS TO BE THE SAME AS THE ONES SPECIFIED FOR MASTER. 
* 
* DC  ENTRY CONDITIONS
* 
*     AREAORD - CONTAINS THE ORDINAL OF THE AREA IN THE AREA DIRECTORY
*     VERSORD - CONTAINS ORDINAL OF VERSION IN THE VERSION DIRECTORY
* 
* DC  EXIT CONDITIONS 
* 
*     THE AREA PERMANENT FILE, INDEX FILE, LOG OPTIONS AND RECOVERY 
*     OPTIONS HAVE BEEN CHANGED TO BE THE SAME AS THE ONES SPECIFIED
*     FOR THE MASTER VERSION. ALSO IF THE NUMBER OF VERSIONS FIELD
*     IN THE PIT ENTRY GOES TO ZERO, THE PERMANENT FILE ENTRY IS
*     DELETED FROM THE PFN TABLE. 
* 
* DC  CALLING ROUTINES
* 
*     MODSET - MODIFY SCHEMA (WITHIN DB$SNTX -SYNGEN-). 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$MDDF;           # DELETE AN ENTRY FORM THE PFN TABLE#
      XREF PROC DB$NO;             # SYNTAX TABLE DRIVER -NO- RETURN   #
      XREF PROC DB$UAOS;           # ADJUST OFFSET FOR SWAPPED SEGMENTS#
      XREF PROC DB$YES;            # SYNTAX TABLE DRIVER -YES- RETURN  #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     TLC HEADER
* 
* DC  DESCRIPTION 
* 
*     TAKE THE PERMANENT FILE INFORMATION TABLE ENTRY FOR THE CURRENT 
*     AREA AND DECREMENT ITS NUMBER OF VERSIONS (MDPITNOVER). IF THIS 
*     NUMBER GOES TO ZERO, CLEAR THE ENTRY IN USE FLAG (MDPITUSEF), 
*     DECREMENT THE NUMBER OF ACTIVE ENTRIES (PITACTENT), AND CALL
*     DB$MDDF TO DELETE THIS PFN ENTRY FROM THE PFN TABLE.
*     SET THE PIT OFFSET TO BE THE SAME AS THE ONE FOR MASTER.
* 
 #
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);  # VERSION INTO TABLE     #
        BEGIN 
*CALL MDVITDCLS              VERSION INFORMATION TABLE
        END 
  
      BASED ARRAY ARDIR [0:0] S(DFMDADEN);    # AREA DIRECTORY TABLE   #
        BEGIN 
*CALL MDARDDCLS              AREA DIRECTORY TABLE 
        END 
  
      ITEM OFFSET;           # OFFSET TO ENTRY WITHIN TABLE            #
      ITEM VITFOFF;          # PFN OFFSET FROM MASTER VERSION          #
      ITEM VITPTR;           # USED FOR ACCESSING THE VIT              #
      ITEM VIT1WRD;          # 1ST WORD OF VIT MASTER ENTRY            #
      ITEM VIT2WRD;          # 2ND WORD OF VIT MASTER ENTRY            #
  
  
  
  
#     B E G I N   D B $ S R 5 2   E X E C U T A B L E   C O D E .      #
  
  
      P<ARDIR> = ARDIRBP + 1 + DFMDADCW;  # AREA DIRECTORY             #
      P<TLC> = B<42,18>VERINFBP;
# 
*     DB$UAOS WILL READ THE SEGMENT CONTAINING THE MASTER VERSION AND 
*     ADJUST THE CORRESPONDING TABLE OFFSET.
# 
      OFFSET = (AREAORD -1) * DFMDVIEN; 
      DB$UAOS(OFFSET);
      VITPTR = OFFSET / DFMDVIEN;  # CONVERT AN OFFSET TO A SUBSCRIPT  #
      P<VERINFO> = LOC(TLC) + TLCHLEN[0]; 
      VIT1WRD = MDVIT1WRD[VITPTR];  # SAVE THE MASTER ENTRY            #
      VIT2WRD = MDVIT2WRD[VITPTR];
      VITFOFF = MDVITFOFF[VITPTR];
      VITPTR = (VERSORD - 1) * AREACNT + AREAORD - 1; 
      OFFSET = VITPTR * DFMDVIEN;  # CONVERT THE SUBSCRIPT TO OFFSET   #
# 
*     DB$UAOS WILL READ THE SEGMENT CONTAINING THE REFERENCED VERSION 
*     AND ADJUST THE CORRESPONDING TABLE OFFSET.
# 
      DB$UAOS(OFFSET);
      VITPTR = OFFSET / DFMDVIEN;  # THEN BACK TO A SUBSCRIPT          #
  
      IF MDVITFOFF[VITPTR] NQ VITFOFF  # IF NOT ALREADY SAME AS MASTER #
      THEN
        BEGIN 
  
        IF OFFSET + DFVITHDR LS TLCBSBW[0]
          AND TLCHLEN[0] GR DFTLCHL 
        THEN                       # A DISK SEGMENT WILL BE MODIFIED   #
  
          BEGIN                    # WHILE TLC IS POINTING TO THE VIT  #
          TLCDSMF[0] = TRUE;       # SET DISK SEGMENT MODIFIED FLAG    #
          END 
  
        P<TLC> = B<42,18>PITBP;    # TLC HEADER FOR THE PIT            #
        OFFSET = MDVITFOFF[VITPTR] - DFPITHDR;
  
        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 
  
        MDPITNOVER[0] = MDPITNOVER[0] - 1;  # DECREMENT NBR OF VERSIONS#
        IF MDPITNOVER[0] EQ 0      # IF NUMBER OF VERSIONS GOES TO ZERO#
        THEN
          BEGIN 
          MDPITUSEF[0] = FALSE;    # CLEAR ENTRY IN USE FLAG           #
          P<PITPF> = LOC(MDPITPFINFO[0]); 
          DB$MDDF(MDPITNAME[0],MDPITUNID[0],MDPITSNPN[0]); # DELETE    #
          P<ARDIR> = ARDIRBP + 1 + DFMDADCW;  # RESET AREA DIRECTORY   #
          P<VERINFO> = VERINFBP + 1;          # RESET VERSION DIRECTORY#
          P<TLC> = B<42,18>PITBP; 
          P<PFINFO> = LOC(TLC) + TLCHLEN[0];
          MDPITACTENT[0] = MDPITACTENT[0] - 1;  # DECREMENT NUMBER OF  #
                                                # ACTIVE ENTRIES       #
          END 
        MDADNPFN[AREAORD-1] = MDADNPFN[AREAORD-1] - 1;
        MDVIT1WRD[VITPTR] = VIT1WRD;  # SET TO SAME AS MASTER          #
        MDVIT2WRD[VITPTR] = VIT2WRD;
        MDVITARCHF[VITPTR] = TRUE;   # SET AREA CHANGED FLAG           #
        END 
      DB$NO;                       # EXIT TO DB$STD                    #
  
      END 
      TERM
