*DECK DB$CCON 
USETEXT UTMPTTX 
USETEXT UTCITTX 
USETEXT UTCDFTX 
      PROC DB$CCON; 
  
      BEGIN                  # DB$CCON #
  
 #
*     DB$CCON - BUILD CONSTRAINT WORK BLOCK      PAGE  1
*     INDRU J. BHATIA                            DATE  11/13/78 
* 
* DC  PURPOSE 
* 
*     BUILD A CONSTRAINT WORK BLOCK IN CORE,
*     WRITE CONSTRAINT WORK BLOCK TO MASTER DIRECTORY FILE. 
* 
* DC  ENTRY CONDITIONS
* 
*     THE FOLLOWING COMMON ITEMS SHOULD HAVE VALID VALUES:  
*     CITADDR  - ADDRESS OF NEW CONSTRAINT INTEGRITY TABLE (CIT). 
*     CURORDNL - CURRENT ORDINAL OF CONSTRAINT ENTRY IN THE NEW CIT.
*     WORKADDR - WORK BLOCK MAIN BLOCK ADDRESS OF WORD AFTER HEADER WD. 
*     WORPOINT - WORK BLOCK MAIN BLOCK MANAGED MEMORY POINTER WORD. 
*     ALSO, THE NEW CIT MUST HAVE BEEN BUILT (BY DB$CCPP).
* 
* DC  EXIT CONDITIONS 
* 
*     ON RETURN, THE MASTER DIRECTORY FILE WILL CONTAIN A NEW 
*     CONSTRAINT WORK BLOCK AT THE END OF THE PARTIALLY BUILT CST 
*     ALREADY THERE.
* 
* DC  CALLING ROUTINES
* 
*     DB$CBLD - CONDENSED SCHEMA/SUBSCHEMA TABLE BUILDER MAIN MODULE. 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$CPUT;     # PUTS WORDS FROM CORE TO THE MD FILE #
      XREF PROC DB$UAWS;     # ADJUSTS WORK SPACE IN MANAGED MEMORY # 
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     CURNAME - CONTAINS CURRENT CONSTRAINT NAME FOR ERROR PROCESSING.
*     WOCURENT - CONTAINS THE CONSTRAINT WORK BLOCK LENGTH. 
* 
* DC  DESCRIPTION 
* 
*     BUILD A CONSTRAINT WORK BLOCK (USED BY CDCS FOR CONSTRAINT ERROR
*     PROCESSING) USING DATA IN NEW CIT (SUPPLIED BY DB$CCPP).
* 
*     POINT BASED ARRAY AT NEXT NEW CIT ENTRY.
*     SET FIELDS IN CONSTRAINT WORK BLOCK FROM DATA NOW IN CORE.
*     PUT CONSTRAINT WORK BLOCK IN MASTER DIRECTORY FILE. 
*     RETURN. 
 #
  
# COMMON DECKS UTCDFDCLS,UTCITDCLS,UTMPTDCLS,UTCCSDCLS,CSTCNDCLS ARE   #
# INCLUDED IN CONTROL NOLIST.                                          #
  
      CONTROL NOLIST; 
      CONTROL EJECT;
      CONTROL EJECT;
      CONTROL EJECT;
      CONTROL EJECT;
*CALL UTCCSDCLS 
*CALL CSTCNDCLS 
      CONTROL LIST; 
      CONTROL EJECT;
  
# THE FOLLOWING ITEMS ARE LOCAL TO DB$CCON                             #
  
      ITEM CONNAML       U;    # CONSTRAINT NAME LENGTH IN CHARACTERS  #
      ITEM CURCONP       U;    # OFFSET POINTER FROM THE START OF THE  #
                               # NEW CIT TO THE CURRENT CONSTRAINT ENT.#
      CONTROL EJECT;
  
# POINT BASED ARRAY TO APPROPRIATE NEW CONSTRAINT INTEGRITY TABLE      #
  
      CURCONP = (CURORDNL - 1) * DFNCITLEN;   # OFFSET TO CURRENT      #
                                              # CONSTRAINT ENTRY IN CIT#
      P<SCCSLIST> = CITADDR + CURCONP;
  
# CALL DB$UAWS TO ALLOCATE WORK SPACE FOR CONSTRAINT WORK BLOCK        #
  
      WOCURENT = DFCONWRK + SCCSNAMLENW[0];  # WORK BLOCK LENGTH       #
      XCALL DB$UAWS(LOC(WORPOINT),WOCURENT); # ADJUST WORK SPACE       #
  
# CREATE CONSTRAINT WORK BLOCK USING INFO FROM CIT                     #
  
      P<SCCSLIST> = CITADDR + CURCONP;
      P<CSCONBLK> = WORKADDR;                # POINT WORK BLOCK TO     #
                                             # WORK SPACE.             #
      CSCNAMLW[0] = SCCSNAMLENW[0];          # STORE NAME LENGTH(WORDS)#
      CSCTYPE[0] = SCCSSUBTYP[0];            # STORE CONSTR SUB-TYPE   #
      CSCLENTH[0] = WOCURENT;                # STORE WORK BLOCK LENGTH #
      CSCSCORD[0] = SCCSCITORD[0];           # STORE SCHEMA CONSTR ORD.#
      CONNAML = SCCSNAMLENW[0] * DFCHARWD;   # SAVE CONSTR NAME LENGTH #
      P<SCCSLIST> = CITADDR + CURCONP + DFNCITNAM; # POINT TO CONSTR NM#
      C<0,CONNAML>CSCNAME[0] = C<0,CONNAML>SCCSTRNAM30[0]; # STORE NAME#
      CURNAME = SCCSTRNAM30[0];              # SAVE CURRENT CONSTR NAME#
                                             # FOR ERROR PROCESSING.   #
      P<SCCSLIST> = CITADDR + CURCONP + DFNCITMEM; # MEMBER AREA INFO  #
      CSCMEMID[0] = SCCSARID[0];             # STORE MD MEMBER AREA ID #
      P<SCCSLIST> = CITADDR + CURCONP + DFNCITOWN; # OWNER AREA INFO   #
      CSCOWNID[0] = SCCSARID[0];             # STORE MD OWNER AREA ID  #
  
# APPEND CONSTRAINT WORK BLOCK TO THE MD BUILT THUS FAR                #
  
      XCALL DB$CPUT(WORKADDR,WOCURENT); 
  
# CALL DB$UAWS TO ADJUST WORK SPACE                                    #
  
      XCALL DB$UAWS(LOC(WORPOINT),-WOCURENT); 
      WOCURENT = 0; 
  
# RESET ITEMS IN COMMON                                                #
  
      CURNAME = " ";
  
# RETURN TO DB$CBLD - CONSTRAINT WORK BLOCK APPENDED TO MD             #
  
      RETURN; 
  
      END                    # DB$CCON #
  
      TERM
