*DECK DB$MDDP 
USETEXT UTMPTTX 
USETEXT MDDEFTX 
USETEXT MDBCMTX 
      PROC DB$MDDP; 
      BEGIN 
 #
  *   DB$MDDP - DELETES ENTRIES FROM THE PFN TBL PAGE  1
  *   M. D. SAXE                                 DATE  03/31/76 
  *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/16/80 
  *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  05/30/84 
  
  DC  PURPOSE 
  
      DELETES ALL PFNS THAT ARE ASSOCIATED WITH A SCHEMA THAT IS BEING
      DELETED FROM THE MASTER DIRECTORY 
  
  DC  ENTRY CONDITIONS
  
      SCINPRG - ID OF THE SCHEMA IN PROGRESS (THE ONE BEING DELETED)
  
  DC  EXIT CONDITIONS 
  
      PFN ENTRIES OF THE DELETED SCHEMA ARE DELETED.
  
  DC  CALLING ROUTINES
  
      DB$SR12 - DELETE SCHEMA FROM DIRECTORY
  
  DC  CALLED ROUTINES 
  
# 
      XREF PROC DB$DIAG;     # DIAGNOSTIC PROCESSOR                    #
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER -NO- RETURN         #
      XREF PROC DB$MDPG;     # GET THE PFN DISK SEGMENT                #
      XREF PROC DB$UAWS;     # ADJUST WORKING STORAGE                  #
      XREF PROC DB$USDS;     # SHORTEN THE DISK SEGMENT                #
# 
  
   DC NON-LOCAL VARIABLES 
  
      PFUNCNT IS DECREMENTED BY ONE AS PFN TABLE ENTRIES ARE DELETED. 
  
 #
#     LOCAL ITEMS                                                      #
  
      ITEM FOUNDG B; # TRUE IF AN ENTRY WAS FOUND GLOBALLY             #
      ITEM LIMIT;    # LIMIT OF DATA SCAN                              #
      ITEM SOURCEP;  # POINTS TO THE PFN ENTRY THAT IS TO BE MOVED.    #
      ITEM TARGETP;  # USED TO REFERENCE THE PFN ENTRIES. ALSO POINTS  #
                     # TO WHERE AN ENTRY IS TO BE MOVED.               #
      ITEM UNUSED;   # PORTION OF USED MEMORY TO BE RELEASED           #
      ITEM XX;       # INDUCTION VARIABLE                              #
  
      BASED ARRAY PFNTBLE [0] S(1); 
        BEGIN 
*CALL MDPFNDCLS 
        END 
  
  
  
  
#     B E G I N   D B $ M D D P   E X E C U T A B L E   C O D E .      #
  
  
 #
  DC  DESCRIPTION 
  
  
      SET THE PFN BASED ARRAY TO POINT TO THE FIRST PFN ENTRY.
 #
      P<TLC> = B<42,18>PFUNCBBP;
      P<PFNTBLE> = LOC(TLC) + TLCHLEN[0] + DFMDPFNHD; 
 #
*     SEARCH THROUGH THE PFN TABLE LOOKING FOR MATCHING SCHEMA ID'S.
*     WHEN SOME ARE FOUND, DELETE THEM BY OVERWRITING THEM WITH THE 
*     FOLLOWING ENTRIES IN THE TABLE (OR THE DISK SEGMENT). 
 #
      FOUNDG = FALSE; 
      IF TLCHLEN[0] GR DFTLCHL     # IF THERE ARE DISK SEGMENTS        #
      THEN
        BEGIN 
        FOR XX = TLCHLEN[0] -1  STEP -1 UNTIL DFTLCHL 
        DO                         # STEP THROUGH THE DISK SEGMENTS    #
          BEGIN 
          DB$MDPG(XX);             # GET THE NEXT DISK SEGMENT         #
  
                                   # STEP THROUGH THE ENTRIES,         #
                                   # DELETING THOSE FOR THE SCHEMA     #
                                   # BEING DELETED.                    #
          LIMIT = TLCDSWL[0] - DFPFUNENT; 
          FOR TARGETP = 0 STEP DFPFUNENT UNTIL LIMIT
          DO
            BEGIN 
            IF MDPFNSCHID[TARGETP] EQ SCINPRG 
            THEN
              BEGIN 
              FOUNDG = TRUE;
              FOR SOURCEP = TARGETP STEP DFPFUNENT UNTIL LIMIT
              DO
                BEGIN 
                IF MDPFNSCHID[SOURCEP] EQ SCINPRG 
                THEN
                  BEGIN 
                  PFUNCNT = PFUNCNT - 1;
                  END 
                ELSE
                  BEGIN 
                  MDPFN1WRD[TARGETP] = MDPFN1WRD[SOURCEP];
                  MDPFN2WRD[TARGETP] = MDPFN2WRD[SOURCEP];
                  MDPFN3WRD[TARGETP] = MDPFN3WRD[SOURCEP];
                  TARGETP = TARGETP + DFPFUNENT;
                  END 
                END 
              TLCDSMF[0] = TRUE;
              TLCDSWL[0] = TARGETP; 
              TLCSLEN[XX] = TARGETP;
              TARGETP = LIMIT;
              DB$USDS(PFUNCBBP,XX);  # REDUCE THE SEGMENT LENGTH       #
              P<TLC> = B<42,18>PFUNCBBP;
              P<PFNTBLE> = LOC(TLC) + TLCHLEN[0] + DFMDPFNHD; 
              END 
            END 
                             # WHEN A SEGMENT LENGTH IS REDUCED TO     #
                             # ZERO, DB$USDS ELIMINATES THE SEGMENT.   #
                             # IF ALL SEGMENTS BUT ONE HAVE BEEN       #
                             # ELIMINATED, THE REMAINING SEGMENT IS    #
                             # CONVERTED TO A CENTRAL MEMORY TABLE.    #
  
          IF TLCHLEN[0] EQ DFTLCHL  # IF NO MORE DISK SEGMENTS         #
          THEN                      # TERMINATE THE LOOP               #
            BEGIN 
            XX = 0; 
            END 
          END 
        END 
  
      IF TLCHLEN[0] EQ DFTLCHL
      THEN                         # THERE ARE NO DISK SEGMENTS        #
                                   # THERE HAS TO BE A CM RESIDENT PFN #
        BEGIN 
        LIMIT = TLCUSED[0] - TLCDSBW[0] - DFPFUNENT;
        UNUSED = 0; 
        FOR TARGETP = 0 STEP DFPFUNENT WHILE TARGETP LQ  LIMIT
        DO
          BEGIN 
          IF MDPFNSCHID[TARGETP] EQ SCINPRG 
          THEN
            BEGIN 
            FOUNDG = TRUE;
            FOR SOURCEP = TARGETP STEP DFPFUNENT UNTIL LIMIT
            DO
              BEGIN 
              IF MDPFNSCHID[SOURCEP] EQ SCINPRG 
              THEN
                BEGIN 
                PFUNCNT = PFUNCNT - 1;
                UNUSED  = UNUSED - DFPFUNENT; 
                END 
              ELSE
                BEGIN 
                MDPFN1WRD[TARGETP] = MDPFN1WRD[SOURCEP];
                MDPFN2WRD[TARGETP] = MDPFN2WRD[SOURCEP];
                MDPFN3WRD[TARGETP] = MDPFN3WRD[SOURCEP];
                TARGETP = TARGETP + DFPFUNENT;
                END 
              END 
            TLCDSWL[0] = TARGETP; 
            TARGETP    = SOURCEP; 
            END 
          END 
        IF UNUSED NQ 0
        THEN                       # RELEASE UNUSED MEMORY             #
          BEGIN 
          DB$UAWS(LOC(PFUNCBBP),UNUSED);
          END 
        END 
      IF NOT FOUNDG                # IF NO ENTRIES WERE DELETED        #
      THEN
        BEGIN 
        DB$DIAG(144,SCINPRG); 
        DB$NO;
  
        END 
      END 
  
      TERM
