*DECK DB$SR68 
USETEXT MDBCMTX 
USETEXT MD10CTX 
USETEXT SCANTXT 
USETEXT UTMPTTX 
      PROC DB$SR68; 
      BEGIN 
 #
* *   DB$SR68 - DELETE A VERSION                 PAGE  1
* *   J. G. SERPA                                DATE  07/15/80 
* *   R. M. PAPPE                                DATE  10/14/80 
* *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  05/30/84 
* 
* DC  PURPOSE 
* 
*     DELETE A VERSION FROM A SCHEMA. 
* 
* DC  ENTRY CONDITIONS
* 
*     AREACNT CONTAINS THE NUMBER OF ENTRIES IN THE ADT.
*     VERSNAM CONTAINS THE VERSION NAME.
*     VERSCNT CONTAINS THE NUMBER OF ENTRIES IN THE VDT.
* 
* DC  EXIT CONDITIONS 
* 
*     VERSION HAS BEEN DELETED FROM THE MASTER DIRECTORY. 
*     VERSCNT HAS BEEN DECREMENTED BY 1.
* 
* DC  CALLING ROUTINES
* 
*     DB$SNTX - SYNTAX CRACKER (SYNGEN) 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF
        BEGIN 
        PROC DB$MDDF;        # DELETE ENTRY FROM PFN TABLE             #
        PROC DB$NO;          # SYNTAX TABLE DRIVER -NO- RETURN         #
        PROC DB$UAOS;        # ADJUST TABLE OFFSET                     #
        PROC DB$UAWS;        # ADJUST WORKING STORAGE                  #
        PROC DB$USDS;        # SHRINK RESIDENT DISK SEGMENT            #
        PROC DB$YES;         # SYNTAX TABLE DRIVER -YES- RETURN        #
        END 
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     MDADNPFN     - NUMBER OF UNIQUE PFNS SPECIFIED FOR THE AREA 
*     MDPITACTENT  - NUMBER OF ACTIVE ENTRIES IN THE PIT
*     MDPITNOVER   - NUMBER OF VERSIONS USING PF INFORMATION
*     MDPITUSEF    - ENTRY IN USE FLAG
*     MDSCNOVER    - TOTAL NUMBER OF VERSIONS SPECIFIED FOR THE SCHEMA
*     VERSCNT      - TOTAL NUMBER OF ENTRIES IN VDT 
* 
* DC  DESCRIPTION 
* 
*     SEARCH THE VDT FOR THE VERSION WHOSE NAME IS IN VERSNAM. IF IT
*     IS NOT FOUND, RETURN DB$NO, OTHERWISE DELETE THE VERSION BY 
*     WRITING OVER IT WITH SUCCEEDING ENTRIES. WHEN FINISHED WITH THE 
*     VDT, GO OVER THE VIT, AND FOR EACH PIT ENTRY, DECREMENT THE 
*     NUMBER OF VERSIONS FIELD. IF THIS VALUE GOES TO ZERO, CLEAR THE 
*     ENTRY IN USE BIT IN THE PIT AND CALL DB$MDDF TO DELETE THE PF 
*     INFORMATION FROM THE PF TABLE. WHEN ALL THE PIT ENTRIES FOR THIS
*     VERSION HAVE BEEN PROCESSED, DELETE THE VERSION FROM THE VIT
*     BY WRITING OVER IT WITH SUCCEEDING VERSION ENTRIES. DECREMENT THE 
*     NUMBER OF UNIQUE PFNS FOR THE AREA IN THE AREA DIRECTORY TABLE AND
*     DECREMENT THE NUMBER OF VERSIONS IN THE SCHEMA DIRECTORY TABLE. 
*     RETURN TO DB$YES. 
* 
 #
  
                             # SUPRESS LISTING OF MDARDDCLS            #
                             #                    MDSCDDCLS            #
                             #                    MDVDTDCLS            #
      CONTROL NOLIST;        #                    MDVITDCLS            #
  
#     SCHEMA DIRECTORY ENTRY         - ORDINALS START AT 1 -           #
      BASED ARRAY MDSCENTRY [0:0] S;
        BEGIN 
*CALL MDSCDDCLS 
        END 
  
      BASED ARRAY ARDIR [0:0] S(DFMDADEN);
        BEGIN 
*CALL MDARDDCLS 
        END 
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);
        BEGIN 
*CALL MDVITDCLS 
        END 
  
      BASED ARRAY VERSDIR [0:0] S(DFMDVDEN);
        BEGIN 
*CALL MDVDTDCLS 
        END 
  
      CONTROL LIST;          # RESUME LISTING                          #
# 
*     L O C A L    I T E M S                                           *
# 
      ITEM I;                # INDEX FOR -FOR- LOOPS                   #
      ITEM CURNTRY;          # SUBSCRIPT FOR CURRENT ENTRY             #
      ITEM FOUND B;          # FLAG TRUE = ENTRY FOUND IN VDT          #
      ITEM NXTNTRY;          # SUBSCRIPT FOR NEXT ENTRY                #
      ITEM OFFSET;           # OFFSET INTO PIT                         #
      ITEM OFFSETV;          # OFFSET INTO VIT                         #
      ITEM VERSIZE;          # SIZE OF A VERSION ENTRY IN THE VIT      #
      ITEM VITCNT;           # TOTAL NUMBER OF ENTRIES IN VIT          #
  
  
  
# 
*     B E G I N    E X E C U T A B L E    C O D E                      *
# 
  
      P<VERSDIR> = VERDIRBP + 1;
      FOUND = FALSE;
      FOR I = 0 STEP 1
        UNTIL VERSCNT - 1 
      DO
        BEGIN 
        IF MDVDTNAME[I] EQ VERSNAM
        THEN
          BEGIN 
          VERSORD = I;
          FOUND = TRUE; 
          CURNTRY = I;
          NXTNTRY = I + 1;
          FOR CURNTRY = CURNTRY STEP 1
            UNTIL VERSCNT - 1 
          DO
            BEGIN 
            MDVDTWORD[CURNTRY] = MDVDTWORD[NXTNTRY];
            NXTNTRY = NXTNTRY + 1;
            END 
          END 
        END 
      IF NOT FOUND
      THEN
        BEGIN 
        DB$NO;
  
        END 
      VERSIZE = AREACNT * DFMDVIEN; 
      P<TLC> = B<42,18>VERINFBP;
      OFFSETV = VERSORD * VERSIZE;
      DB$UAOS(OFFSETV);            # ADJUST OFFSET FOR SWAPPED SEGMENTS#
      P<VERINFO> = LOC(TLC) + TLCHLEN[0] + OFFSETV; 
      FOR I = 0 STEP 1
        UNTIL AREACNT - 1 
      DO
        BEGIN 
  
        P<TLC> = B<42,18>PITBP;    # TLC HEADER FOR THE PIT            #
        OFFSET = MDVITFOFF[I] - 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]
          AND TLCHLEN[0] GR DFTLCHL 
        THEN
          BEGIN 
          TLCDSMF[0] = TRUE;       # SET DISK SEGMENT MODIFIED FLAG    #
          END 
  
        MDPITNOVER[0] = MDPITNOVER[0] - 1;
        IF MDPITNOVER[0] EQ 0 
        THEN
          BEGIN 
          MDPITUSEF[0] = FALSE; 
          P<PITPF> = LOC(MDPITPFINFO[0]); 
          DB$MDDF(MDPITNAME[0],MDPITUNID[0],MDPITSNPN[0]);
          P<TLC> = B<42,18>PITBP;  # TLC HEADER FOR THE PIT            #
          P<PFINFO> = B<42,18>PITBP + TLCHLEN[0]; 
          MDPITACTENT[0] = MDPITACTENT[0] - 1;
          P<ARDIR> = ARDIRBP + 1 + DFMDADCW + I * DFMDADEN; 
          MDADNPFN[0] = MDADNPFN[0] - 1;
          END 
        END 
      CURNTRY = 0;
      P<TLC> = B<42,18>VERINFBP;
      P<VERINFO> = LOC(TLC) + TLCHLEN[0] + OFFSETV; 
      IF TLCHLEN[0] GR DFTLCHL     # IF THERE ARE DISK SEGMENTS        #
        AND OFFSETV LS TLCBSBW[0]  # THE OFFSET IS IN THE DS PORTION   #
      THEN                         # REDUCE THE DISK SEGMENT SIZE      #
        BEGIN 
        VITCNT = ((TLCDSWL[0] - OFFSETV) / DFMDVIEN) - AREACNT -1;
        FOR NXTNTRY = AREACNT STEP 1 UNTIL VITCNT 
        DO
          BEGIN                    # SQUEEZE OUT THE DELETED ENTRIES   #
          MDVIT1WRD[CURNTRY] = MDVIT1WRD[NXTNTRY];
          MDVIT2WRD[CURNTRY] = MDVIT2WRD[NXTNTRY];
          CURNTRY = CURNTRY + 1;
          END 
        TLCDSMF[0] = TRUE;         # SET DISK SEGMENT MODIFIED FLAG    #
        TLCDSWL[0] = TLCDSWL[0] - VERSIZE;
        DB$USDS(VERINFBP,TLCDSOR[0]);  # SHRINK DISK SEGMENT           #
        END 
  
      ELSE                         # REDUCE THE USED TABLE SIZE        #
        BEGIN 
        VITCNT = ((VERSCNT - VERSORD) * AREACNT) -1;
        FOR NXTNTRY = AREACNT STEP 1 UNTIL VITCNT 
        DO
          BEGIN                    # SQUEEZE OUT THE DELETED ENTRIES   #
          MDVIT1WRD[CURNTRY] = MDVIT1WRD[NXTNTRY];
          MDVIT2WRD[CURNTRY] = MDVIT2WRD[NXTNTRY];
          CURNTRY = CURNTRY + 1;
          END 
        VERSIZE = -VERSIZE; 
        DB$UAWS(LOC(VERINFBP),VERSIZE); 
        END 
      P<MDSCENTRY> = SCDRBP + 1;
      MDSCNOVER[SCHDIRP] = MDSCNOVER[SCHDIRP] - 1;
      VERSCNT = VERSCNT - 1;
      DB$YES; 
  
      END 
      TERM
