*DECK DB$BRIF 
USETEXT CDCSCTX 
USETEXT JLPCMTX 
      PROC DB$BRIF(SPOTOPT,FILETYP);
      BEGIN 
 #
* *   DB$BRIF - DBREC INTERFACE                  PAGE  1
* *   W P CEAGLIO                                DATE  05/20/81 
* 
* DC  PURPOSE 
* 
*     TO CREATE AND SUBMIT A BATCH JOB (SPOT--SPUN OFF TASK) FROM CDCS
*     FOR DBREC PROCESSING. 
* 
* 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)     #
# 
*     NOTE - CURRENTLY, ONLY DUMP OF JOURNAL LOG SUPPORTED. 
* 
* D   ASSUMPTIONS 
* 
*     SAL EXISTS. 
*     SALX IS SET.
*     MD IS OPEN FOR READ ACCESS. 
*     MD ATTACH DATA IS IN CDCSCOMMN. 
*     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 
* 
*     NORMAL   - A BATCH JOB (SPOT) HAS BEEN CREATED AND PLACED IN THE
*     INPUT QUEUE VIA THE ROUTE FACILITY.  INFORMATIONAL MESSAGES ARE 
*     WRITTEN TO THE DAYFILE, INCLUDING THE NAME OF THE ASSIGNED JOB. 
* 
*     ABNORMAL - AN I/O OR ROUTE ERROR OCCURRED.  THE DBREC JOB REQUEST 
*     IS ABORTED--THE SPECIFIC ERROR APPEARS IN A DAYFILE MESSAGE.
* 
* DC  CALLING ROUTINES
* 
*     DB$JRPT      JOURNAL LOG RECOVERY POINT PROCESSOR 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$BRJB;           # BUILD CONTROL STATEMENTS          #
      XREF FUNC DB$CDEC C(10);     # CONVERT INTEGER TO DISPLAY DECIMAL#
      XREF FUNC DB$COCT C(10);     # CONVERT INTEGER TO DISPLAY OCTAL  #
      XREF PROC DB$IORW;           # ISSUE CIO REWIND FUNCTION         #
      XREF PROC DB$MDER;           # PROCESS I/O ERROR READING MD      #
      XREF PROC DB$MFA;            # ALLOCATE CMM BLOCK                #
      XREF PROC DB$MFF;            # RELEASE CMM BLOCK                 #
      XREF PROC DB$MSG;            # ISSUE DAYFILE MESSAGE             #
      XREF PROC DB$RCLL;           # ISSUE CIO RECALL FUNCTION         #
      XREF FUNC DB$RORM U;         # ISSUE ROUTE MACRO                 #
      XREF FUNC DB$RORQ U;         # ISSUE REQUEST FUNCTION            #
      XREF PROC DB$WGET;           # WORD ADDRESSABLE GET              #
      XREF PROC DB$WRRM;           # CIO WRITER PROCEDURE              #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE. 
* 
* DC  DESCRIPTION 
* 
*     ISSUE DAYFILE MESSAGES IDENTIFYING THE SCHEMA NAME, THE FUNCTION
*     REQUESTED, AND THE FILE TYPE (JOURNAL LOG OR AREA/VERSION). 
* 
*     ALLOCATE A BUFFER FOR THE MD SCHEMA INFORMATION ENTRY AND READ
*     IT INTO MEMORY.  IF EITHER THE JOB CONTROL INFO (IN THE SCHEMA
*     INFORMATION ENTRY) OR THE MD ATTACH DATA (IN THE CDCS DIRECTIVE 
*     FILE) IS ABSENT, REJECT THE REQUEST.
* 
*     OTHERWISE, PREPARE A DBREC JOB BY DOING THE FOLLOWING:  
* 
*       -  ALLOCATE A BUFFER FOR CONSTRUCTION OF THE DBREC CONTROL
*          STATEMENTS.
* 
*       -  CALL DB$BRJB TO CONSTRUCT THE DBREC JOB. 
* 
*       -  DETERMINE THE LOCATIONS OF THE *EOR AND *EOF STATEMENTS BY 
*          FINDING THE INDEXES IN THE CONTROL STATEMENT BUFFER.  ALSO,
*          STORE BINARY ZEROES AT THE END OF EACH CONTROL STATEMENT.
* 
*       -  ALLOCATE A BUFFER FOR THE FET FOR I/O AND INITIALIZE THE FET 
*          FROM A MODEL (DB$ZFET) FET.
* 
*       -  REQUEST A QUEUE DEVICE FOR THE ROUTE FILE.  IF AN ERROR
*          OCCURRED ON THE REQUEST, ISSUE A DAYFILE MESSAGE AND REJECT
*          THE REQUEST. 
* 
*       -  REWIND THE ROUTE FILE. 
* 
*       -  WRITE THE CONTROL STATEMENTS FOR THE DBREC JOB TO THE ROUTE
*          FILE.  THE WRITE SEQUENCE IS AS FOLLOWS: 
* 
*             *  WRITE ALL STATEMENTS UP TO THE *EOR STATEMENT (AN EOR
*                WILL BE WRITTEN WHEN THE WRITE IS COMPLETE). 
*             *  WRITE THE STATEMENTS FOR THE DIRECTIVES (AN EOR WILL 
*                BE WRITTEN WHEN THE WRITE IS COMPLETE).
* 
*          IF AN I/O ERROR OCCURRED, ISSUE A DAYFILE MESSAGE AND
*          REJECT THE SPOT. 
* 
*       -  ISSUE A ROUTE REQUEST FOR THE DBREC JOB.  IF AN ERROR
*          OCCURRED, ISSUE A DAYFILE MESSAGE AND REJECT THE SPOT. 
* 
*       -  RELEASE THE BUFFERS FOR THE FET AND CONTROL STATEMENTS.
* 
*     PRIOR TO EXIT, RELEASE THE BUFFER FOR THE MD SCHEMA INFO ENTRY. 
* 
 #
      CONTROL EJECT;
  
#     NON-LOCAL VARIABLES REFERENCED                                   #
  
      XREF ARRAY DB$FTMD;;         # FIT FOR MD ACCESS                 #
  
      XREF ARRAY DB$ZFET;          # MODEL FET FOR ROUTE FILE          #
        BEGIN 
        ITEM ZFETWD  U(00,00,60); 
        END 
  
      XREF ITEM DB$ZSPT C(07);     # CONTAINS NAME OF ROUTE JOB        #
  
  
#     LOCAL DEFS                                                       #
  
*CALL DBRDFDCLS 
  
#     LOCAL VARIABLES                                                  #
  
      ITEM EOFLINE I;              # LINE NUMBER FOR *EOF LINE         #
      ITEM EORLINE I;              # LINE NUMBER FOR *EOR LINE         #
      ITEM INDEX   I;              # SCRATCH - FOR LOOPS, ETC          #
      ITEM ROUTACMSG C(50) = "  UNABLE TO CREATE DBREC JOB - NO JOB/ATTA
CH DATA:";
      ITEM ROUTARMSG C(40) = "  FFFF AREA XXXX VERSION VVVVVVV:"; 
      ITEM ROUTDBMSG C(20) = "  DBREC JOB REQUEST:";
      ITEM ROUTIOMSG C(50) = "  UNABLE TO SUBMIT DBREC JOB - I/O ERROR X
XX:"; 
      ITEM ROUTJBMSG C(40) = "  DBREC JOB SUBMITTED JOBNAME = XXXXXXX:";
      ITEM ROUTJLMSG C(40) = "  DUMP CDCS JOURNAL LOG NAME = XXXXXXX:"; 
      ITEM ROUTSCMSG C(40) = "  SCHEMA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:";
  
  
      BASED ARRAY CTLSTMT S(DFCTLSIZE);  # BUFFER FOR CTL STATEMENTS   #
        BEGIN 
        ITEM CTLINE  C(00,00,80);  # LINE BUFFER                       #
        ITEM CTLEOL  U(08,00,60);  # END-OF LINE (FOR BINARY ZEROES)   #
        END 
  
      BASED ARRAY FET;             # FET FOR I/O ON ROUTE FILE         #
*CALL FETDCLS 
  
  
      BASED ARRAY MDJOB;;          # FOR ACCESSING MD JOB CONTROL INFO #
  
      BASED ARRAY MDSCINFO;        # FOR READING MD SCHEMA INFO ENTRY  #
        BEGIN 
*CALL MDSCIDCLS 
        END 
      CONTROL EJECT;
  
# S T A R T   O F   D B $ B R I F   E X E C U T A B L E   C O D E      #
  
  
#     ISSUE DAYFILE MESSAGES IDENTIFYING THE SCHEMA NAME, THE FUNCTION #
#     REQUESTED, AND FILE OR AREA NAME/VERSION INVOLVED.               #
  
      C<9,30>ROUTSCMSG = SASCNAME[SALX];
      DB$MSG(ROUTSCMSG);
      DB$MSG(ROUTDBMSG);
      IF FILETYP EQ DFDBRJLOG 
      THEN
        BEGIN 
        C<31,7>ROUTJLMSG = JLFRPFN[0];
        DB$MSG(ROUTJLMSG);
        END 
      ELSE
        BEGIN 
        C<12,4>ROUTARMSG = DB$CDEC(OFARID[0],4);
        C<25,7>ROUTARMSG = OFVENAME[0]; 
        IF SPOTOPT EQ DFDBRLOAD 
        THEN
          BEGIN 
          C<2,4>ROUTARMSG = "LOAD"; 
          END 
        ELSE
          BEGIN 
          C<2,4>ROUTARMSG = "DUMP"; 
          END 
        DB$MSG(ROUTARMSG);
        END 
  
#     ALLOCATE A BUFFER FOR THE MD SCHEMA INFORMATION ENTRY AND READ   #
#     IT.  IF THE MD JOB CONTROL INFO WAS NOT SPECIFIED, OR IF THE     #
#     ATTACH DATA FOR THE MD WAS NOT SPECIFIED IN THE CDCS DIRECTIVE   #
#     FILE, ISSUE DAYFILE MESSAGE AND REJECT THE REQUEST.              #
  
      DB$MFA(SASCSISZ[SALX],P<MDSCINFO>); 
      DB$WGET(DB$FTMD,MDSCINFO,SASCSISZ[SALX],SASCWASC[SALX],DB$MDER);
      IF MDSIJOBP[0] EQ 0 
        OR MDPFINAME[0] EQ 0
      THEN
        BEGIN 
        DB$MSG(ROUTACMSG);
        END 
  
#**********************************************************************#
#                                                                      #
#     OTHERWISE, PREPARE A DBREC JOB BY DOING THE FOLLOWING:           #
#                                                                      #
#       *  ALLOCATE A BUFFER FOR THE CONTROL STATEMENTS.               #
#       *  CALL DB$BRJB TO CONSTRUCT THE DBREC JOB.                    #
#       *  DETERMINE THE LOCATIONS OF THE *EOR AND *EOF STATEMENTS BY  #
#          FINDING THE INDEXES IN THE CONTROL STATEMENT BUFFER.  ALSO, #
#          STORE BINARY ZEROES AT THE END OF EACH CONTROL STATEMENT.   #
#       *  ALLOCATE A BUFFER FOR THE FET FOR I/O AND INITIALIZE IT FROM#
#          A MODEL FET.                                                #
#       *  REQUEST A QUEUE DEVICE FOR THE ROUTE FILE.  IF UNSUCCESSFUL,#
#          ISSUE A DAYFILE MESSAGE AND REJECT THE REQUEST.             #
#       *  REWIND THE ROUTE FILE.                                      #
#       *  WRITE THE CONTROL STATEMENTS FOR THE DBREC JOB TO THE ROUTE #
#          FILE IN THE FOLLOWING SEQUENCE:                             #
#             1)  WRITE ALL STATEMENTS UP TO THE *EOR STATEMENT (AN EOR#
#                 WILL BE WRITTEN WHEN THE WRITE IS COMPLETE).         #
#             2)  WRITE THE STATEMENTS FOR THE DIRECTIVES (AN EOR WILL #
#                 WRITTEN WHEN THE WRITE IS COMPLETE).                 #
#          IF AN I/O ERROR OCCURRED, ISSUE A DAYFILE MESSAGE AND REJECT#
#          THE REQUEST.                                                #
#       *  ISSUE A ROUTE REQUEST FOR THE DBREC JOB.  IF UNSUCCESSFUL,  #
#          ISSUE A DAYFILE MESSAGE AND REJECT THE REQUEST.             #
#       *  RELEASE THE BUFFERS FOR THE FET AND CONTROL STATEMENTS.     #
#                                                                      #
#**********************************************************************#
  
      ELSE
        BEGIN 
        DB$MFA(DFCTLINES*DFCTLSIZE,P<CTLSTMT>); 
        P<MDJOB> = LOC(MDSCINFO) + MDSIJOBP[0]; 
        DB$BRJB(SPOTOPT,FILETYP,P<MDJOB>,P<CTLSTMT>); # BUILD DBREC JOB#
  
        EORLINE = 0;               # DETERMINE *EOR, *EOF LINES        #
        EOFLINE = 0;
  
        FOR INDEX=0 STEP 1
          WHILE INDEX LQ DFCTLINES-1
            AND EOFLINE EQ 0
        DO
          BEGIN 
          IF CTLINE[INDEX] EQ DFCTLEOR
          THEN
            BEGIN 
            EORLINE = INDEX;
            END 
          ELSE
            BEGIN 
            IF CTLINE[INDEX] EQ DFCTLEOF
            THEN
              BEGIN 
              EOFLINE = INDEX;
              END 
            END 
          CTLEOL[INDEX] = 0;       # STORE ZEROES AT END OF LINE       #
          END 
  
        DB$MFA(DFFETLEN,P<FET>);   # ALLOCATE/INITIALIZE FET FOR ROUTE #
        FOR INDEX=DFFETLEN-1 STEP -1
          UNTIL 0 
        DO
          BEGIN 
          FETLFNWD[INDEX] = ZFETWD[INDEX];
          END 
        FETLFNWD[0] = DFSPOTFIL;
  
        INDEX = DB$RORQ(FETLFNWD[0]);  # REQUEST QUEUE DEVICE (NOS/BE) #
        IF INDEX NQ 0 
        THEN
          BEGIN 
          C<41,3>ROUTIOMSG = DB$COCT(INDEX,3);
          DB$MSG(ROUTIOMSG);
          END 
  
        ELSE
          BEGIN 
          DB$IORW(LOC(FET));       # REWIND ROUTE FILE                 #
          DB$RCLL(LOC(FET));
  
          FETFIRST[0] = LOC(CTLSTMT);  # PRIME FET FOR I/O             #
          FETIN[0] = FETFIRST[0] + (EORLINE*DFCTLSIZE); 
          FETOUT[0] = FETFIRST[0];
          FETLIMIT[0] = FETFIRST[0] + ((EOFLINE+1)*DFCTLSIZE);
          DB$WRRM(LOC(FET));       # WRITE STATEMENTS UP TO *EOR       #
          DB$RCLL(LOC(FET));
          IF FETNOSAT[0] EQ 0 
          THEN
            BEGIN 
            FETIN[0] = FETFIRST[0] + (EOFLINE*DFCTLSIZE); 
            FETOUT[0] = FETFIRST[0] + ((EORLINE+1)*DFCTLSIZE);
            DB$WRRM(LOC(FET));     # WRITE DIRECTIVES                  #
            DB$RCLL(LOC(FET));
            END 
  
          INDEX = FETNOSAT[0];
          IF INDEX EQ 0 
          THEN
            BEGIN 
            DB$IORW(LOC(FET));     # REWIND ROUTE FILE                 #
            DB$RCLL(LOC(FET));
            INDEX = DB$RORM(FETLFNWD[0]);  # ISSUE ROUTE REQUEST       #
            IF INDEX EQ 0          # IF NO ERROR ON ROUTE REQUEST...   #
            THEN
              BEGIN 
              C<32,7>ROUTJBMSG = DB$ZSPT; 
              DB$MSG(ROUTJBMSG);
              END 
            END 
  
          IF INDEX NQ 0 
          THEN
            BEGIN 
            C<41,3>ROUTIOMSG = DB$COCT(INDEX,3);
            DB$MSG(ROUTIOMSG);
            END 
          END 
  
        DB$MFF(P<CTLSTMT>);        # RELEASE CTL STMT AND FET BUFFERS  #
        DB$MFF(P<FET>); 
        END 
  
#     PRIOR TO EXIT, RELEASE THE BUFFER FOR THE MD SCHEMA INFO ENTRY.  #
  
      DB$MFF(P<MDSCINFO>);
  
      END 
      TERM; 
