*DECK DB$SR67 
USETEXT MDBCMTX 
USETEXT MD10CTX 
USETEXT UTMPTTX 
      PROC DB$SR67; 
      BEGIN 
 #
* *   DB$SR67 - CHECK CONSTRAINT USE TABLE       PAGE  1
* *   R. M. PAPPE                                DATE  08/25/80 
* *   R. L. MCALLESTER - TABLE SEGMENTATION      DATE  05/30/84 
* 
* DC  PURPOSE 
* 
*     CHECK THE CONSTRAINT USE TABLE (CUT) TO AVOID 
*     CONSTRAINT VIOLATIONS ACROSS VERSIONS.
* 
* DC  ENTRY CONDITIONS
* 
*     THE CONSTRAINT USE TABLE (CUT) RESIDES IN CORE. 
*     THE VERSION INFORMATION TABLE (VIT) IS A SEGMENTED TABLE. 
*     THE VIT IS ALLOCATED IN SUCH A WAY THAT ALL OF THE ENTRIES
*     FOR EACH VERSION ORDINAL RESIDE IN THE SAME SEGMENT.
*     AREACNT CONTAINS THE NUMBER OF ENTRIES IN THE ADT.
*     VERSORD CONTAINS THE CURRENT VERSION ORDINAL IN THE VDT.
* 
* DC  EXIT CONDITIONS 
* 
*     IF CONSTRAINT INCONSISTENCIES ARE DETECTED, DIAGNOSTIC 127 IS 
*     ISSUED. 
*     EXIT IS TO DB$NO. 
* 
* DC  CALLING ROUTINES
* 
*     MODSET  - PROCESS MODIFY SCHEMA 
*     VRSNTRY - ANALYZE VERSION SUBENTRY (WITHIN DB$SNTX) 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DIAG;     # ISSUE DIAGNOSTICS                       #
      XREF PROC DB$NO;       # SYNTAX TABLE DRIVER -NO- RETURN         #
      XREF PROC DB$UAOS;     # ADJUST OFFSET FOR SWAPPED SEGMENTS      #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     A PASS IS MADE THROUGH THE CUT. FOR EACH ENTRY IN THE CUT, WE TAKE
*     THE AREA IDS AND USE THEM AS INDICES INTO THE VIT FOR THE CURRENT 
*     VERSION. IF THE PRIMARY VERSION NAMES FOR BOTH AREAS (PARENT AND
*     CHILD) DO NOT MATCH, A CONSTRAINT VIOLATION HAS BEEN DETECTED,
*     DIAGNOSTIC 127 IS ISSUED, AND EXIT TO DB$NO IS TAKEN. 
*     IF THE PRIMARY VERSION NAMES FOR ALL AREA ID PAIRS IN THE CUT 
*     MATCH, NO CONSTRAINT VIOLATIONS ARE DETECTED, RETURN IS TO DB$YES.
* 
 #
  
  
                             # SUPRESS LISTING OF MDCUTDCLS            #
                             #                    MDSCDDCLS            #
      CONTROL NOLIST;        #                    MDVITDCLS            #
  
      BASED ARRAY CUT [0:0] S(1); 
      BEGIN 
*CALL MDCUTDCLS 
      END 
  
      BASED ARRAY MDSCENTRY [0:0] S(1);  # SCHEMA DIRECTORY TABLE      #
      BEGIN 
*CALL MDSCDDCLS 
      END 
  
      BASED ARRAY VERINFO [0:0] S(DFMDVIEN);
      BEGIN 
*CALL MDVITDCLS 
      END 
  
      CONTROL LIST;          # RESUME LISTING                          #
# 
*     L O C A L    I T E M S
# 
      ITEM I;                # USED FOR -FOR- LOOPS                    #
      ITEM OFFSET;           # OFFSET INT A SEGMENTED TABLE            #
  
  
  
#     B E G I N   D B $ S R 6 7   E X E C U T A B L E   C O D E .      #
  
  
  
      P<MDSCENTRY> = SCDRBP + 1;  # POSITION SCHEMA DIRECTORY          #
      IF MDSCCUTSZ[SCHDIRP] EQ 0      # WAS CUT BUILT FOR THIS SCHEMA  #
        THEN
        BEGIN 
        DB$NO;                     # RETURN TO DB$STD                  #
  
        END 
  
      P<CUT> = CUTBP + 1;    # POSITION TO BEGINNING OF CUT            #
      P<TLC> = B<42,18>VERINFBP;
      OFFSET = (VERSORD - 1) * AREACNT * DFMDVIEN;
# 
*     DB$UAOS WILL READ THE SEGMENT CONTAINING THE REFERENCED VERSION 
*     AND ADJUST THE CORRESPONDING TABLE OFFSET.
# 
      DB$UAOS(OFFSET);
      P<VERINFO> = LOC(TLC) + TLCHLEN[0] + OFFSET;
  
      FOR I=0 STEP 1
        UNTIL MDSCCUTSZ[SCHDIRP] - 1
      DO
        BEGIN 
        IF MDVITNAME[MDCUTAIP[I]-1] NQ MDVITNAME[MDCUTAIC[I]-1] 
        THEN
          BEGIN 
          DB$DIAG(127,VERSNAM);    # ISSUE DIAGNOSTIC                  #
          DB$NO;
  
          END 
        END 
      DB$NO;                       # RETURN TO DB$STD                  #
  
      END 
      TERM
