*DECK DB$BRJB 
USETEXT CDCSCTX 
USETEXT JLPCMTX 
      PROC DB$BRJB(SPOTOPT,FILETYP,MDJOBP,CSTMTP);
      BEGIN 
 #
* *   DB$BRJB - CREATE DBREC CONTROL STATEMENTS  PAGE  1
* *   W P CEAGLIO                                DATE  05/20/81 
* *   KIM H. NGUYEN - CCLPROC CLAUSE                   11/14/84 
* 
* DC  PURPOSE 
* 
*     TO CREATE CONTROL STATEMENTS FOR A DBREC JOB (NOS/BE).
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM SPOTOPT I;              # TYPE OF OPERATION FOR DBREC       #
                                   # (VALUES IN COMDECK DBRDFDCLS)     #
      ITEM FILETYP I;              # TYPE OF FILE FOR SPOT             #
                                   # (VALUES IN COMDECK DBRDFDCLS)     #
      ITEM MDJOBP  I;              # POINTER TO MD JOB CONTROL INFO    #
      ITEM CSTMTP  I;              # POINTER TO CONTROL CARD BUFFER    #
# 
*     NOTE - CURRENTLY, ONLY DUMP OF JOURNAL LOG SUPPORTED. 
* 
* D   ASSUMPTIONS 
* 
*     SAL EXISTS. 
*     SALX IS SET.
*     IF JOURNAL LOG DUMP, SAJLFPTR POINTS TO JOURNAL LOG QUEUE.  THE 
*     JOURNAL LOG HEADER RECORD EXISTS IN THE QUEUE AND CONTAINS THE
*     PERMANENT FILE NAME OF THE LOG FILE TO BE DUMPED. 
*     FOR AREA-TYPE FUNCTION, P<OFT> IS ALSO SET. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE DBREC CONTROL STATMENTS HAVE BEEN CREATED IN THE SPECIFIED
*     BUFFER. 
* 
* DC  CALLING ROUTINES
* 
*     DB$BRIF      BASIC RECOVERY INTERFACE 
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEC C(10);     # CONVERT INTEGER TO DISPLAY DECIMAL#
# 
* DC  INTERNAL PROCS
* 
*     INSERT       INSERT TEXT IN CONTROL STATEMENT LINE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     BUFFER POINTED TO BY PARAMETER *CSTMTP* 
* 
* DC  DESCRIPTION 
* 
*     THE CONTROL STATEMENTS COMPRISING THE DBREC JOB ARE STRUCTURED
*     IN A BUFFER A LINE AT A TIME IN THE FOLLOWING MANNER: 
* 
*     CASE 1: TAPE CLAUSE IS SPECIFIED
* 
*     LINE    TYPE           CONTENT
*     ----    ----           -------
* 
*       1     JOB CARD       DBREC,T37777,MT/NT.  ACCTG-DATA
*       2     ACCOUNT CARD   ACCOUNT.ACCOUNTING-DATA
*       3     MOUNT CARD     MOUNT,SN=SET,VSN=VSN.
*       4     ATTACH CARD    ATTACH,MSTRDIR,MDPFN,ID=ID,MR=1,...
*       5     DBREC CARD     DBREC,CD.
*       6     EOR            *EOR 
*       7     DIRECTIVE      SCHEMA NAME IS NAME
*       8     DIRECTIVE      DUMP JOURNAL LOG NAME IS PFN . 
*       9     EOF            *EOF 
* 
*     NOTE--LINE 2 AND 3 ARE OPTIONAL.
* 
*     CASE 2: CCLPROC CLAUSE IS SPECIFIED 
* 
*     LINE    TYPE           CONTENT
*     ----    ----           -------
* 
*       1     JOB CARD       DBREC,T37777,MT/NT.  ACCTG-DATA
*       2     ACCOUNT CARD   ACCOUNT.ACCOUNTING-DATA
*       3     ATTACH CARD    ATTACH,CCLPROCPFN,ID=ID,...,MR=1.
*       4     CCLPROC CARD   CCLPROCPFN.  (EXECUTION CARD)
*       5     EOR            *EOR 
*       6     DIRECTIVE      SCHEMA NAME IS NAME
*       7     DIRECTIVE      DUMP JOURNAL LOG NAME IS PFN . 
*       8     EOF            *EOF 
* 
*     NOTE--LINES 2 IS OPTIONAL.
* 
*     PROCEDURE *INSERT* IS CALLED TO INSERT INDIVIDUAL ENTRIES IN
*     EACH CONTROL STATEMENT FROM THE FOLLOWING SOURCES:  
* 
*       1.  SAL (SCHEMA NAME) 
*       2.  JFQUEUE (JOURNAL LOG PFN) 
*       3.  MD ATTACH INFO IN CDCSCOMMN 
*       4.  OFT (AREA ID/VERSION) 
* 
 #
      CONTROL EJECT;
  
  
#     LOCAL DEFS                                                       #
  
*CALL DBRDFDCLS 
  
#     LOCAL VARIABLES                                                  #
  
      ITEM AREAMSG C(40) = "FFFF AREA XXXX VERSION YYYYYYY .";
      ITEM CTX     I;              # INDEX OF CONTROL STATEMENT BUFFER #
      ITEM INDEX   I;              # SCRATCH - FOR LOOPS, ETC          #
      ITEM TOINDEX I;              # CURRENT CHAR POSITION IN LINE     #
  
  
      BASED ARRAY CTLSTMT S(DFCTLSIZE);  # BUFFER FOR CTL STATEMENTS   #
        BEGIN 
        ITEM CTLINE  C(00,00,80);  # LINE BUFFER                       #
        END 
  
      BASED ARRAY MDJOB;           # FOR ACCESSING MD JOB CONTROL INFO #
        BEGIN 
*CALL MDJOBDCLS 
        END 
      CONTROL EJECT;
      PROC INSERT(INTXT,MAXTXTLG,TERMCH); 
      BEGIN 
 #
* *   DB$BRJB                                    PAGE  1
* *   INSERT - INSERT TEXT IN CONTROL CARD IMAGE
* *   W P CEAGLIO                                DATE 05/21/81
* 
* DC  PURPOSE 
* 
*     TO INSERT THE SPECIFIED TEXT INTO A BUFFER CONTAINING A CONTROL 
*     CARD IMAGE STARTING AT THE CURRENT CHARACTER POSITION.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM INTXT   C(30);          # TEXT TO BE INSERTED               #
      ITEM MAXTXTLG  I;            # MAX LENGTH (CHARS) OF INSERT TEXT #
      ITEM TERMCH  C(01);          # CHARACTER TO APPEND AFTER TEXT    #
# 
* D   ASSUMPTIONS 
* 
*     *TOINDEX* CONTAINS THE STARTING CHARACTER POSITION FOR THE
*     INSERTION.  *CTX* CONTAINS INDEX OF ARRAY *CTLSTMT* WHERE THE 
*     CONTROL CARD IMAGE IS BEING BUILT.
* 
* DC  EXIT CONDITIONS 
* 
*     THE TEXT IS INSERTED IN THE CONTROL CARD IMAGE AND *TOINDEX* IS 
*     UPDATED TO POINT TO THE END OF THE TEXT, PLUS ONE.
* 
* DC  CALLING ROUTINES
* 
*     DB$BRJB      MAIN ROUTINE 
* 
* DC  CALLED ROUTINES 
* 
*     NONE. 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     ARRAY CTLSTMT     BUFFER CONTAINING CONTROL CARD IMAGES 
*     TOINDEX           CHARACTER POSITION POINTER
* 
* DC  DESCRIPTION 
* 
*     DETERMINE THE LENGTH OF THE INSERTION TEXT BY SCANNING FOR A
*     BINARY ZERO OR BLANK.  IF THE LENGTH IS GREATER THAN ZERO, INSERT 
*     THE TEXT IN THE CURRENT CONTROL STATEMENT AT THE POSITION GIVEN 
*     BY *TOINDEX* AND UPDATE *TOINDEX* ACCORDINGLY.  THEN APPEND THE 
*     TERMINATOR CHARACTER AND UPDATE *TOINDEX*.  OTHERWISE, IF THE 
*     TERMINATOR CHARACTER IS A PERIOD, APPEND TO CURRENT LINE. 
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM IDX     I;              # FOR LOOPS                         #
      ITEM CHAR    C(01);          # SINGLE CHARACTER BUFFER           #
      ITEM INSERTLG  I;            # LENGTH (CHARS) OF INSERTION TEXT  #
      ITEM ZBCHAR  B;              # TRUE IF COLON OR BLANK FOUND      #
  
  
#     S T A R T   O F   I N S E R T   E X E C U T A B L E   C O D E    #
  
#     DETERMINE LENGTH OF INSERTION TEXT BY SCANNING FOR COLON OR      #
#     BLANK TERMINATOR.                                                #
  
      INSERTLG = 0; 
      ZBCHAR = FALSE; 
      FOR IDX=0 STEP 1
        WHILE NOT ZBCHAR
      DO
        BEGIN 
        CHAR = C<IDX,1>INTXT; 
        IF B<0,6>CHAR EQ 0
          OR CHAR EQ " "
          OR IDX EQ MAXTXTLG
        THEN
          BEGIN 
          ZBCHAR = TRUE;
          INSERTLG = IDX; 
          END 
        END 
  
#     IF INSERTION TEXT LENGTH GREATER THAN ZERO, INSERT THE TEXT IN   #
#     THE CURRENT POSITION OF THE CURRENT CONTROL STATEMENT AND THEN   #
#     APPEND THE TERMINATOR CHARACTER.  OTHERWISE, IF THE TERMINATOR   #
#     CHARACTER IS A PERIOD, THEN APPEND IT TO THE CURRENT LINE.       #
  
      IF INSERTLG GR 0
      THEN
        BEGIN 
        C<TOINDEX,INSERTLG>CTLINE[CTX] = C<0,INSERTLG>INTXT;
        TOINDEX = TOINDEX + INSERTLG; 
        C<TOINDEX,1>CTLINE[CTX] = TERMCH; 
        TOINDEX = TOINDEX + 1;
        END 
      ELSE
        BEGIN 
        IF TERMCH EQ "."
        THEN
          BEGIN 
          C<TOINDEX,1>CTLINE[CTX] = ".";
          TOINDEX = TOINDEX + 1;
          END 
        END 
  
      RETURN; 
  
      END 
      CONTROL EJECT;
  
  
#     S T A R T   O F   D B $ B R J B   E X E C U T A B L E  C O D E   #
  
  
#**********************************************************************#
#                                                                      #
#     PREPARE ALL CONTROL STATEMENTS FOR THE DBREC JOB IN THE ALLOCATED#
#     BUFFER.  THE ORDER OF THE CONTROL STATEMENTS IS AS FOLLOWS:      #
#                                                                      #
#     CASE 1:  TAPE CLAUSE IS SPECIFIED                                #
#                                                                      #
#       *  JOB CARD (WITH ACCOUNTING CHARGE IF SPECIFIED)              #
#       *  ACCOUNT CARD WITH ACCOUNTING CHARGE (IF SPECIFIED)          #
#       *  MOUNT CARD (IF SET NAME SPECIFIED)                          #
#       *  ATTACH CARD FOR MD                                          #
#       *  DBREC CARD                                                  #
#       *  *EOR CARD                                                   #
#       *  DIRECTIVE CARD FOR SCHEMA NAME                              #
#       *  DIRECTIVE CARD FOR JOURNAL LOG NAME                         #
#       *  *EOF CARD                                                   #
#                                                                      #
#     CASE 2:  CCLPROC CLAUSE IS SPECIFIED                             #
#                                                                      #
#       *  JOB CARD (WITH ACCOUNTING CHARGE IF SPECIFIED)              #
#       *  ACCOUNT CARD WITH ACCOUNTING CHARGE (IF SPECIFIED)          #
#       *  ATTACH CARD FOR CCLPROC                                     #
#       *  CCLPROC EXECUTION CARD                                      #
#       *  *EOR CARD                                                   #
#       *  DIRECTIVE CARD FOR SCHEMA NAME                              #
#       *  DIRECTIVE CARD FOR JOURNAL LOG NAME                         #
#       *  *EOF CARD                                                   #
#**********************************************************************#
  
      P<MDJOB> = MDJOBP;           # SET POINTER TO JOB CONTROL INFO   #
      P<CTLSTMT> = CSTMTP;         # SET POINTER TO CTL STMT BUFFER    #
      IF MDJOBTTYP[0]              # CREATE JOB STATEMENT WITH MT/NT   #
      THEN                         # TAPE PARAMETER                    #
        BEGIN 
        CTLINE[0] = DFCTLJOB; 
        END 
      ELSE
        BEGIN 
        CTLINE[0] = DFCTLJOBNT; 
        END 
      CTX = 0;
      IF MDJOBCHGLEN[0] NQ 0       # IF ACCTG DATA PRESENT, INSERT IN  #
      THEN                         # JOB AND ACCOUNT STATEMENTS        #
        BEGIN 
        IF MDJOBCHGLEN[0] LQ DFCTLMXACL 
        THEN                       # MAX. OF 80 CHARS PER LINE -- ADD  #
                                   # ACCOUNTING DATA TO JOB STATEMENT  #
          BEGIN 
          TOINDEX = DFCTLJBL; 
          INSERT(MDJOBCHARGE[0],DFMAXACLG," "); 
          END 
        CTLINE[1] = DFCTLACT; 
        CTX = 1;
        TOINDEX = DFCTLACL; 
        INSERT(MDJOBCHARGE[0],DFMAXACLG," "); 
        END 
  
      CTX = CTX + 1;
      IF NOT MDJOBCCLFLAG[0]
      THEN
        BEGIN 
        IF MDPFSNPN[0] NQ 0          # CREATE MOUNT STMT IF SN PRESENT #
        THEN
          BEGIN 
          CTLINE[CTX] = DFCTLMNT; 
          TOINDEX = DFCTLMNL; 
          INSERT(MDPFSN[0],DFMAXSNLG,",");
          C<TOINDEX,DFCTLVSL>CTLINE[CTX] = DFCTLVSN;
          TOINDEX = TOINDEX + DFCTLVSL; 
          INSERT(MDPFVSN[0],DFMAXVSLG,"."); 
          CTX = CTX + 1;
          END 
  
        CTLINE[CTX] = DFCTLATH;      # CREATE MD ATTACH STATEMENT      #
        TOINDEX = DFCTLATL; 
        INSERT(MDPFINAME[0],DFMAXPFLG,",");   # PFN                    #
        END 
  
      IF MDJOBCCLFLAG[0]          # CREAT ATTACH STATEMENT FOR CCLPROC #
      THEN
        BEGIN 
        CTLINE[0] = DFCTLATTCCL;
        TOINDEX = DFCTLATTLG; 
        INSERT(MDJOBCCLNAME[0],DFMAXPFLG,",");
        END 
      C<TOINDEX,DFCTLIDL>CTLINE[CTX] = DFCTLID;  # ID                  #
      TOINDEX = TOINDEX + DFCTLIDL; 
      INSERT(MDPFUNID[0],DFMAXUNLG,",");
      IF B<0,6>MDPFPW1[0] NQ 0             # PASSWORDS IF PRESENT      #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLPWL>CTLINE[CTX] = DFCTLPW; 
        TOINDEX = TOINDEX + DFCTLPWL; 
        FOR INDEX=0 STEP 1
          UNTIL 4 
        DO
          BEGIN 
          IF B<0,6>MDPFPW1[INDEX] NQ 0
          THEN
            BEGIN 
            INSERT(MDPFPW1[INDEX],DFMAXPWLG,","); 
            END 
          END 
        END 
      IF MDPFSNPN[0] NQ 0          # SN PARAMETER IF PRESENT           #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLSNL>CTLINE[CTX] = DFCTLSN; 
        TOINDEX = TOINDEX + DFCTLSNL; 
        INSERT(MDPFSN[0],DFMAXSNLG,",");
        END 
      C<TOINDEX,DFCTLMRL>CTLINE[CTX] = DFCTLMR;  # MR=1 PARAMETER      #
      CTX = CTX + 1;
      IF MDJOBCCLFLAG[0]
      THEN
        BEGIN 
        TOINDEX = 0;
        CTLINE[CTX] = " ";
        INSERT(MDJOBCCLNAME[0],DFMAXPFLG,","); # CCLPROC EXECUTION STMT#
        C<TOINDEX,DFCTLJOBTL>CTLINE[CTX] = DFCTLJOBT; 
        END 
      ELSE
        BEGIN 
        CTLINE[CTX] = DFCTLDBR;      # DBREC EXECUTION STATEMENT       #
        END 
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLEOR;      # *EOR STATEMENT                    #
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLDBS;      # SCHEMA NAME DIRECTIVE             #
      TOINDEX = DFCTLDSL; 
      INSERT(SASCNAME[SALX],DFMAXSCLG," "); 
      CTX = CTX + 1;
  
      IF FILETYP EQ DFDBRJLOG      # DUMP/LOAD DIRECTIVE               #
      THEN
        BEGIN 
        CTLINE[CTX] = DFCTLDDD; 
        TOINDEX = DFCTLDDL; 
        INSERT(JLFRPFN[0],DFMAXJLLG,"."); 
        END 
      ELSE
        BEGIN 
        C<10,4>AREAMSG = DB$CDEC(OFARID[0],4);
        C<23,7>AREAMSG = OFVENAME[0]; 
        IF SPOTOPT EQ DFDBRDUMP 
        THEN
          BEGIN 
          C<0,4>AREAMSG = "DUMP"; 
          END 
        ELSE
          BEGIN 
          C<0,4>AREAMSG = "LOAD"; 
          END 
        CTLINE[CTX] = AREAMSG;
        END 
  
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLEOF;      # *EOF STATEMENT                    #
  
      END 
      TERM; 
