*DECK DB$SR07                                                            SR07 
USETEXT UTMPTTX 
USETEXT MD10CTX 
USETEXT MDBCMTX 
USETEXT CUGBATX 
      PROC DB$SR07;                                                      SR07 
 #                                                                       SR07 
  *   DB$SR07 - BUILD AND VERIFY A SCHEMA ENTRY  PAGE  1                 SR07 
  *   J. JAN JANIK                               DATE  11/25/75          SR07 
  *   A. W. LO
  *   J. G. SERPA - MDU 2.3 ENHANCEMENTS         DATE  07/22/80 
  *   KIM H. NGUYEN                              DATE  11/09/84 
  
  DC  PURPOSE                                                            SR07 
                                                                         SR07 
      TO BUILD A SCHEMA ENTRY IN CORE AND SET UP CONDITIONS WHICH WILL   SR07 
      ALLOW ALL INFORMATION FOR THE SCHEMA TO BE CREATED.                SR07 
                                                                         SR07 
  DC  ENTRY CONDITIONS                                                   SR07 
                                                                         SR07 
      FILENAM  - SCHEMA LOGICAL FILE NAME 
      MDLSTSID - MASTER DIRECTORY LAST SCHEMA IDENTIFIER ASSIGNED 
      MDPFINFO - CONTAINS PERMANENT FILE INFORMATION PERTAINING TO
        PROCEDURE LIBRARY, RESTART IDENTIFIER, TRANSACTION RECOVERY,
        JOURNAL LOG, QUICK RECOVERY AND BASIC RECOVERY FILES. 
      SCHDRSZ  - THE SIZE IN WORDS OF ALL THE SCHEMA DIRECTORY ENTRIES
      SCHNAME  - THIRTY-CHARACTER SCHEMA NAME 
                                                                         SR07 
  DC  EXIT CONDITIONS                                                    SR07 
                                                                         SR07 
      SCHEMA LFN IS OPEN.  SCHEMA INFO ENTRY HAS BEEN BUILT.  THE DATA   SR07 
      BASE PROCEDURE TABLE IS BUILT FROM INFORMATION FROM THE SCHEMA LFN SR07 
      IF NECESSARY MDLSTSID WILL HAVE BEEN BUMPED.  RETURN IS TO DB$NO.  SR07 
                                                                         SR07 
  DC  CALLING ROUTINES                                                   SR07 
                                                                         SR07 
      DB$STD - SYNTAX TABLE DRIVER                                       SR07 
 #                                                                       SR07 
      BEGIN                                                              SR07 
  
  
*CALL MDABTDCLS                                                          JJJ1230
*CALL MDBSADCLS                                                          JJJ1212
 #                                                                       SR07 
                                                                         SR07 
  DC  CALLED ROUTINES                                                    SR07 
                                                                         SR07 
 #
      XREF                                                               SR07 
        BEGIN                                                            SR07 
 #                                                                     #
        PROC DB$ERSC;        # CRM ERROR ON SCHEMA #
        PROC DE$OPSC;        # OPEN SCHEMA                             #
        PROC DB$DIAG;        # ISSUE DIAGNOSTIC                        # SR07 
        PROC DB$NO;          # RETURN TO STD, NO SIDE                  # SR07 
        PROC DB$UAWS;        # ADJUST WORK SPACE                       # SR07 
        PROC DB$WGET;        # GET FROM WA FILE                        # SR07 
                                                                         SR07 
        FUNC DB$CFIL C(30);  # BLANK OR BINARY ZERO CHARACTER FILL #
        FUNC DB$MDPF B;      # STORES THE PFN NAME AND ID INTO THE PFN #
                             # TABLE IF THE PFN/ID IS UNIQUE.          #
        FUNC DB$TBSR I;      # SEARCH TABLE AND RETURN ORDINAL OF MATCH# SR07 
        PROC DB$UALC;        # ALLOCATE SPACE IN MANAGED MEMORY        #
        FUNC DB$STAT ;       # TEST IF LFN IS AT CONTROL POINT         #
#                                                                        SR07 
  DC  NON-LOCAL VARIABLES                                                SR07 
#                                                                        SR07 
        ARRAY DE$FTSC; ;     # FIT FOR SCHEMA                          #
          END                                                            SR07 
  
#     ITEMS FROM COMMONS DB$M10C, DB$MDBC AND DB$MCPT ARE ALSO USED      SR07 
 #                                                                       SR07 
                                                                         SR07 
#     LOCAL ITEMS  #                                                     SR07 
  
      BASED ARRAY MDJOBINFO [0:0] S(1); 
        BEGIN 
*CALL MDJOBDCLS                JOB CONTROL INFORMATION
        END 
  
      ITEM I;                # SCRATCH ITEM                            #
      ITEM J;                #SCRATCH ITEM                             #
      ITEM MTID I;           # EMPTY ID, USED TO HOLD NEW SCHEMA ID    # SR07 
      ITEM NAMESCHE C(30);   # BLANK-FILLED SCHEMA NAME FROM SCHEMA # 
      ITEM SITNDX;           # INDEX INTO THE SCHEMA INFORMATION TABLE #
      ITEM TESTLFN U;        # USED TO STORE SCHEMA LFN FOR CALL TO    # SR07 
                             # DB$UTFS AND DE$OPSC                     #
      ITEM INDEX I;          # FOR LOOP INDUCTION VARIABLE             # SR07 
      CONTROL EJECT;
      PROC DBMOVE(SOURCE,TARGET,NUMBER);
#                                                                      #
#     MOVE NUMBER OF WORDS FROM SOURCE TO TARGET                       #
#                                                                      #
      BEGIN 
      ARRAY SOURCE [0:0] S(1);
        ITEM SW U(0,00,60);        # SOURCE WORD                       #
  
      ARRAY TARGET [0:0] S(1);
        ITEM TW U(0,00,60);        # TARGET WORD                       #
  
      ITEM NUMBER I;
  
      ITEM I; 
  
      FOR I = 0 STEP 1
        UNTIL NUMBER - 1
      DO
        BEGIN 
        TW[I] = SW[I];
        END 
      RETURN; 
      END  # DBMOVE # 
      CONTROL EJECT;                                                     SR07 
 #                                                                       SR07 
  
  DC  DESCRIPTION 
                                                                         SR07 
      INITIALIZE THE SCHEMA DIRECTORY INFORMATION TABLE (DIT) TO ZERO.
      THIS IS NEEDED BEFORE DE$OPSC IS CALLED (BELOW) AND WILL
      INDICATE AN ERROR TO DE$NMSC IF DE$OPSC IS NOT CALLED FIRST.
      CHECK IF THE SCHEMA NAME IS ALREADY IN THE SCHEMA DIRECTORY.
      IF IT IS THERE, ISSUE DIAGNOSTIC MESSAGE 132, AND EXIT TO DB$NO.
      DB$TBSR WILL ALSO RETURN IN MTID THE ORDINAL OF AN EMPTY SLOT IN
      THE SCHEMA DIRECTORY IF ONE WAS FOUND.  IF NO EMPTY SLOTS ARE 
      FOUND MTID WILL BE ZERO.
 #
  
      P<PUTENTRY> = LOC(DITARRAY) - 1;           # LOC OF SCHEMA DIT #
      FOR INDEX = 1 STEP 1 UNTIL DFDITLEN DO PUTUNSIG[INDEX] = 0; 
      IF DB$TBSR (SCHNAME,30,SCDRBP+1,SCDRCNT,DFMDSCDESIZE,0,0,MTID)     SR07 
                   NQ 0                                                  SR07 
        THEN                 # SCHEMA ALREADY EXISTS, ERROR            # SR07 
        BEGIN                                                            SR07 
        DB$DIAG(132,SCHNAME); 
        DB$NO;               # *** ABNORMAL EXIT ***                   # SR07 
                                                                         SR07 
        END                                                              SR07 
                                                                         SR07 
 #                                                                       SR07 
      BUILD SCHEMA INFO ENTRY IN COMMON CELLS                            SR07 
 #                                                                       SR07 
      P<MDSCENTRY> = SCDRBP + 1;
  
 #
      IF NO EMPTY SLOT WAS FOUND (MTID IS ZERO), THEN EXPAND THE
      DIRECTORY.  ELSE SET SCHDIRP (INDEX INTO THE DIRECTORY) 
      BASED ON THE VALUE OF MTID. 
 #
      IF MTID EQ 0                               # NO EMPTY SLOT FOUND #
      THEN
        BEGIN 
          DB$UAWS(LOC(SCDRBP),DFMDSCDESIZE);     # ADJUST WORK SPACE #
          SCHDIRP = SCHDRSZ;                     # SCHEMA DIRECT PNTR#
          SCHDRSZ = SCHDRSZ + DFMDSCDESIZE;      # SCHEMA DIRECT SIZE#
          SCDRCNT = SCDRCNT + 1;                 # SCHEMA DIREC COUNT#
          MTID = SCDRCNT;                        # SCHEM DIR EMPTY ID#
        END 
      ELSE                                       # EMPTY SLOT FOUND    #
        BEGIN 
        SCHDIRP = (MTID - 1) * DFMDSCDESIZE;
        END 
      SCINPRG = MTID; 
 #                                                                       SR07 
      VERIFY THAT SCHEMA LFN IS AT CP.  IF NOT ISSUE DIAG AND EXIT TO    SR07 
      DB$NO.  OPEN SCHEMA FILE VIA DE$OPSC.  AN ERROR ON OPENING WILL 
      CAUSE A DIAGNOSTIC TO BE ISSUED AND AN EXIT TO DB$NO TO BE TAKEN.  SR07 
      VERIFY THAT THE SCHEMA NAMES IN THE SCHEMA AND IN THE MD INPUT
      ARE THE SAME.  IF NOT, ISSUE A DIAGNOSTIC AND EXIT TO DB$NO.
 #                                                                       SR07 
      TESTLFN = 0;                                                       SR07 
      B<0,42>TESTLFN = B<0,42>FILENAM;                                   SR07 
      IF DB$STAT (TESTLFN) EQ 0 
        THEN                                                             SR07 
        BEGIN                                                            SR07 
        DB$DIAG (136,FILENAM);                                           SR07 
        DB$NO;               # *** ABNORMAL EXIT ***                   # SR07 
                                                                         SR07 
        END                                                              SR07 
      DE$OPSC (TESTLFN,DITARRAY,SCBUFF,DFSCBUFSZ);
                                                                         SR07 
      IF DASTATE [0] NQ 0                                                SR07 
        THEN                                                             SR07 
        BEGIN                                                            SR07 
        DB$DIAG (135,DASTATE [0]);                                       SR07 
        DB$NO;               # *** ABNORMAL EXIT ***                   # SR07 
                                                                         SR07 
        END                                                              SR07 
      NAMESCHE = SCCWSCHNAM30[0];                # AVOID SYMPL ERROR #
      NAMESCHE = DB$CFIL(NAMESCHE,30," ");       # BLANK FILL NAME #
      IF NAMESCHE NQ SCHNAME                     # IF NAMES DIFFER #
        THEN                                     # THERE"S AN ERROR # 
          BEGIN 
            DB$DIAG(131,NAMESCHE);               # ISSUE DIAGNOSTIC # 
            DB$NO;                               # EXIT TO DB$NO #
          END 
      MDSITIME[0] = SCCWSCHTIME[0]; 
      MDSIDATE[0] = SCCWSCHDATE[0]; 
                                                                         SR07 
 #
      DETERMINE AMOUNT OF SPACE NEEDED FOR CKSM LIST AND ADJUST BLOCK.
 #
      I = (SCCWNUMRELTN[0] + SCCWNUMAREAS[0]) * DFCKSMSZ + 1; 
      DB$UAWS (LOC(MDCHKSMBP),I); 
 #
      POINT THE B.ARRAY AND COPY CKSM LIST FROM SCHEMA TO MEMORY. 
 #
      P<MDSCCKSUM> = B<42,18> MDCHKSMBP + 1;
      DB$WGET (DE$FTSC,MDSCCKSUM,I,SCCWCKSUMWA[0],DB$ERSC); 
                                                                         SR07 
 #
      MOVE THE PERMANENT FILE INFORMATION FOR PROCEDURE LIBRARY, RESTART
      IDENTIFIER, TRANSACTION RECOVERY, JOURNAL LOG, QUICK RECOVERY 
      AND BASIC RECOVERY FILES FROM MDPFINFO TO THE SCHEMA INFORMATION
      TABLE. AS EACH ENTRY IS MOVED, SET APPROPRIATE OFFSET POINTERS
      FROM THE SIT FWA TO THE ENTRY. THEN SET THE NUMBER OF JOURNAL 
      LOGS, NUMBER OF TRANSACTION RECOVERY FILES, UPDATE LIMIT AND
      UNIT LIMIT. 
 #
      P<MDSCENTRY> = SCDRBP + 1;
      MDSISCLF[0] = FILENAM;       # STORE SCHEMA LFN FOR CST BUILDER  #
      SITNDX = DFMDSIHDR;          # INDEX INTO SCHEMA INFO TABLE      #
      IF MDPFINAME[FILETYPE"BRF"] NQ 0  # IF BRF SPECIFIED             #
      THEN
        BEGIN 
        MDSCBRFG[SCHDIRP] = TRUE;  # SET BRF FLAG                      #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"BRF"],MDPFUNID[FILETYPE"BRF"],
                 MDPFSNPN[FILETYPE"BRF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"BRF"]);  # ISSUE DIAGNOSTIC   #
          END 
        P<MDSCENTRY> = SCDRBP + 1; # POSITION SCHEMA DIRECTORY TABLE   #
        P<PUTENTRY> = LOC(MDSCINFO[SITNDX]);
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"BRF"]); 
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE BRF INFO     #
        MDSIBRFP[0] = SITNDX;      # SET OFFSET POINTER TO BRF PF INFO #
        SITNDX = SITNDX + DFPFENTLEN; 
        END 
      IF MDPFINAME[FILETYPE"JLF"] NQ 0  # IF JLF SPECIFIED             #
      THEN
        BEGIN 
        MDSCJLFG[SCHDIRP] = TRUE;  # SET JLF FLAG                      #
        MDSIJLFN[0] = DFMDNJLF;    # NUMBER OF JOURNAL LOG FILES       #
        C<6,1>MDPFINAME[FILETYPE"JLF"] = "1";  # APPEND 1 TO FILE NAME #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"JLF"],MDPFUNID[FILETYPE"JLF"],
                 MDPFSNPN[FILETYPE"JLF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"JLF"]);  # ISSUE DIAGNOSTIC   #
          END 
        C<6,1>MDPFINAME[FILETYPE"JLF"] = "2";  # APPEND 2 TO FILE NAME #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"JLF"],MDPFUNID[FILETYPE"JLF"],
                 MDPFSNPN[FILETYPE"JLF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"JLF"]);  # ISSUE DIAGNOSTIC   #
          END 
        C<6,1>MDPFINAME[FILETYPE"JLF"] = " ";  # CLEAR NUMBER FROM NAME#
        P<MDSCENTRY> = SCDRBP + 1; # POSITION SCHEMA DIRECTORY TABLE   #
        IF MDSCMAXLOG[SCHDIRP] EQ 0  # NO AREAS USED BEF/AFT IMAGES    #
        THEN
          BEGIN 
          MDSCMAXLOG[SCHDIRP] = DFMINMRL;   # MINIMUM LOG RECORD SIZE  #
          END 
        P<PUTENTRY> = LOC(MDSCINFO[SITNDX]);
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"JLF"]); 
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE JLF INFO     #
        MDSIJLFP[0] = SITNDX;      # SET OFFSET POINTER TO JLF PF INFO #
        SITNDX = SITNDX + DFPFENTLEN; 
        END 
      IF MDPFINAME[FILETYPE"QRF"] NQ 0  # IF QRF SPECIFIED             #
      THEN
        BEGIN 
        MDSCQRFG[SCHDIRP] = TRUE;  # SET QRF FLAG                      #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"QRF"],MDPFUNID[FILETYPE"QRF"],
                 MDPFSNPN[FILETYPE"QRF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"QRF"]);  # ISSUE DIAGNOSTIC   #
          END 
        P<MDSCENTRY> = SCDRBP + 1; # POSITION SCHEMA DIRECTORY TABLE   #
        P<PUTENTRY> = LOC(MDSCINFO[SITNDX]);
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"QRF"]); 
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE QRF INFO     #
        MDSIQRFP[0] = SITNDX;      # SET OFFSET POINTER TO QRF PF INFO #
        SITNDX = SITNDX + DFPFENTLEN; 
        END 
      IF MDPFINAME[FILETYPE"RIF"] NQ 0  # IF RIF SPECIFIED             #
      THEN
        BEGIN 
        MDSCRIFG[SCHDIRP] = TRUE;  # SET RIF FLAG                      #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"RIF"],MDPFUNID[FILETYPE"RIF"],
                 MDPFSNPN[FILETYPE"RIF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"RIF"]);  # ISSUE DIAGNOSTIC   #
          END 
        P<MDSCENTRY> = SCDRBP + 1; # POSITION SCHEMA DIRECTORY TABLE   #
        P<PUTENTRY> = LOC(MDSCINFO[SITNDX]);
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"RIF"]); 
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE RIF INFO     #
        MDSIRIFP[0] = SITNDX;      # SET OFFSET POINTER TO RIF PF INFO #
        SITNDX = SITNDX + DFPFENTLEN; 
        END 
      IF MDPFINAME[FILETYPE"TRF"] NQ 0  # IF TRF SPECIFIED             #
      THEN
        BEGIN 
        MDSCTRFG[SCHDIRP] = TRUE;  # SET TRF FLAG                      #
        MDSITRFN[0] = DFMDNTRF;    # NUMBER OF TRANS RECOVERY FILES    #
        IF UNITLIM EQ 0            # IF UNIT LIMIT NOT SPECIFIED       #
        THEN
          BEGIN 
          MDSIUNIL[0] = DFUNITLIM; # SET DEFAULT UNIT LIMIT            #
          END 
        ELSE
          BEGIN 
          MDSIUNIL[0] = UNITLIM;   # SET UNIT LIMIT TO SPECIFIED VALUE #
          END 
        IF UPDLIM EQ 0             # IF UPDATE LIMIT NOT SPECIFIED     #
        THEN
          BEGIN 
          MDSIUPDL[0] = DFUPDTLIM; # SET DEFAULT UPDATE VALUE          #
          END 
        ELSE
          BEGIN 
          MDSIUPDL[0] = UPDLIM;    #SET UPDATE LIMIT TO SPECIFIED VALUE#
          END 
        C<6,1>MDPFINAME[FILETYPE"TRF"] = "1";  # APPEND 1 TO FILE NAME #
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"TRF"],MDPFUNID[FILETYPE"TRF"],
                 MDPFSNPN[FILETYPE"TRF"])      # IF PF IS NOT UNIQUE   #
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"TRF"]);  # ISSUE DIAGNOSTIC   #
          END 
        C<6,1>MDPFINAME[FILETYPE"TRF"] = " ";  # CLEAR NUMBER FROM NAME#
        P<MDSCENTRY> = SCDRBP + 1; # POSITION SCHEMA DIRECTORY TABLE   #
        P<PUTENTRY> = LOC(MDSCINFO[SITNDX]);
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"TRF"]); 
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE TRF INFO     #
        MDSITRFP[0] = SITNDX;      # SET OFFSET POINTER TO TRF PF INFO #
        SITNDX = SITNDX + DFPFENTLEN; 
        END 
 #
      CHECK IF JOB CONTROL INFORMATION WAS SPECIFIED
 #
      IF JOBUN NQ " "        # IF USER NAME                            #
        OR CHARGELEN NQ 0    # OR CHARGE                               #
        OR TYPEFLAG[0]       # OR TAPE TYPE                            #
        OR DENSFLAG[0]       # OR TAPE DENSITY SPECIFIED               #
        OR PROCFLAG[0]       # OR CCLPROC FLAG IS SET                  #
      THEN
        BEGIN 
        P<MDJOBINFO> = LOC(MDSCINFO[SITNDX]);  # POSITION ARRAY        #
        MDJOBUN[0] = JOBUN;  # SET USER NAME                           #
        MDJOBPW[0] = JOBPW;  # SET PASSWORD                            #
        MDJOBFAM[0] = JOBFAM;  # SET FAMILY NAME                       #
        MDJOBCHGLEN[0] = CHARGELEN;  # SET LENGTH OF CHARGE            #
        MDJOBCHARGE[0] = CHARGE;  # SET CHARGE                         #
        IF TAPEFLAG[0]
        THEN
          BEGIN 
          MDJOBTTYP[0] = TRACKTYPE;     # SET TAPE TYPE                #
          MDJOBTDEN[0] = DENSITY;       # SET TAPE DENSITY             #
          MDJOBCCLFLAG[0] = FALSE;
          END 
  
        IF PROCFLAG[0]
        THEN
          BEGIN 
          MDJOBCCLNAME[0] = CCLPROCNAME;# SET CCLPROC FILE NAME        #
          MDJOBCCLFLAG[0] = TRUE;       # SET CCLPROC FLAG             #
          IF INDFLAG[0] 
          THEN
            MDJOBACCESS[0] = 0;         # SET INDIRECT ACCESS FLAG     #
          ELSE
            MDJOBACCESS[0] = 1;         # SET DIRECT ACCESS FLAG       #
          END 
        MDSIJOBP[0] = SITNDX;  # SET POINTER TO JOB CONTROL INFO TABLE #
        SITNDX = SITNDX + DFCHRGOFFSET + (CHARGELEN + 9) /10; 
        END 
      P<MDSCENTRY> = SCDRBP + 1;
      MDSCSISZ[SCHDIRP] = SITNDX;  # SIZE OF THE SCHEMA INFO TABLE     #
                                                                         SR07 
 #                                                                       SR07 
      ADJUST DBP BLOCK TO ACCOMODATE TABLE WHOSE SIZE IS SPECIFIED IN    SR07 
      DITARRAY.  READ TABLE INTO THE BLOCK.  IF AN ERROR OCCURS, ISSUE   SR07 
      DIAGNOSTIC, CLOSE SCHEMA LFN, AND EXIT TO DB$NO.                   SR07 
 #                                                                       SR07 
      IF SCCWDBPLENG[0] GR 0 THEN 
        BEGIN 
        I= SCCWDBPLENG[0] - 1;
        DB$UAWS(LOC(DBPROCBP),I); 
        END 
      ELSE
      I = 0;
 #
      INITIALIZE DATA BASE PROCEDURE TABLE CONTROL WORD 
 #
      P<DBPROC> = DBPROCBP + 1; 
      MDDPNBEN[0] = 0;
                                                                         SR07 
 #
      CHECK TO SEE IF A PROCEDURE LIBRARY PFN WAS SPECIFIED IN THE MD 
      SOURCE. IF SO, CHECK TO SEE IF THERE ARE ANY PROCEDURES 
      SPECIFIED IN THE SCHEMA.
      ALSO, MAKE SURE THAT THERE IS A PROCEDURE LIBRARY 
      SPECIFIED IF THERE ARE PROCEDURES SPECIFIED IN THE SCHEMA.
 #
      IF MDPFINAME[FILETYPE"PROC"] EQ 0   # IF PROCEDURE NOT SPECIFIED #
        AND SCCWDBPLENG[0] GR 0         # AND DBPS SPECIFIED IN SCHEMA #
      THEN
        BEGIN 
        DB$DIAG(146); 
        DB$NO;
        END 
      IF MDPFINAME[FILETYPE"PROC"] NQ 0  # IF PROC LIB SPECIFIED       #
      THEN
        BEGIN 
        IF NOT DB$MDPF(MDPFINAME[FILETYPE"PROC"], 
                 MDPFUNID[FILETYPE"PROC"],MDPFSNPN[FILETYPE"PROC"]) 
        THEN
          BEGIN 
          DB$DIAG(137,MDPFINAME[FILETYPE"PROC"]);  # ISSUE DIAGNOSTIC  #
          END 
        IF SCCWDBPLENG[0] EQ 0          # IF DBPS NOT IN SCHEMA        #
        THEN
          BEGIN 
          DB$DIAG(145);                 # ISSUE DIAGNOSTIC             #
          DB$NO;                        # ABNORMAL EXIT                #
  
          END 
  
 #
      STORE THE NUMBER OF PROCEDURES IN THE PROCEDURE LIST  (SCHEMA), 
      EXCLUDING THE HEADER WORD.
 #
        P<DBPROC> = DBPROCBP + 1;  # POSITION DBP LIST                 #
        MDDPNBEN[0] = I;
        P<PUTENTRY> = LOC(MDDPPF[0]); 
        P<GETENTRY> = LOC(MDPFINFO[FILETYPE"PROC"]);
        DBMOVE(GETENTRY,PUTENTRY,DFPFENTLEN);      # MOVE PROC INFO    #
        P<DBPROC> = DBPROCBP + 1 + DFMDDPCW;
  
 # FETCH THE PROCEDURE LIST FROM THE SCHEMA AND PLACE IT INTO THE      #
 # DB PROCEDURE DIRECTORY. DONOT COPY THE CONTROL WORD.                #
  
        DB$WGET(DE$FTSC,DBPROC,I,SCCWDBPWRDAR[0]+1,DB$ERSC);
                                                                         SR07 
        END 
# 
      IF CONSTRAINTS HAVE BEEN SPECIFIED IN THE SCHEMA, ALLOCATE THE
      PRE-CONSTRAINT USE TABLE. 
# 
      IF SCCWCITLEN[0] NQ 0        # IF CONSTRAINTS SPECIFIED          #
      THEN
        BEGIN 
        DB$UALC(LOC(PCUTBP),SCCWNUMAREAS[0],0);  # ALLOCATE PCUT       #
        END 
 #                                                                       SR07 
      CONSTRUCT THE SCHEMA DIRECTORY ENTRY NOW THAT MOST OF THE ERRORS   SR07 
      HAVE BEEN DETECTED. 
 #
      P<MDSCENTRY> = SCDRBP + 1;
      IF MTID GR MDLSTSID[0] THEN 
        MDLSTSID[0] = MTID; 
      MDSCNAME[SCHDIRP] = SCHNAME;
      MDSCIDNT[SCHDIRP] = MTID; 
      IF SCCWDBPLENG[0] NQ 0 THEN 
          MDSCDPSZ[SCHDIRP] = I+DFMDDPCW; 
          ELSE MDSCDPSZ[SCHDIRP] = 0; 
      DB$NO;                                                             SR07 
                                                                         SR07 
      END                                                                SR07 
      TERM                                                               SR07 
