CLIENTC2 sample code

IDENTIFICATION DIVISION.
 PROGRAM-ID.  CLIENTC2.
 *****************************************************************
 * SAMPLE CSA PROGRAM TO ILLUSTRATE ESTABLISHING A
 * ConnectION TO A REMOTE SERVER, EXECUTING SQL REQUEST,
 * RETRIEVING THE RESULTS AND ANY MESSAGES (WRITING THEM TO A TEMP
 * STORAGE QUEUE STRICTLY FOR EXAMPLE), AND THEN DETACHING
 * FROM THE REMOTE SERVER.
 *
 *****************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*****************************************************************
 * POINTERS.
 *****************************************************************
01 WS-POINTERS.
     05 SPAREA-PTR               POINTER.
     05 SQLDA-PTR                POINTER.
     05 SQL-REQ-PTR              POINTER.
*****************************************************************
 * COUNTERS AND VARIOUS INTEGERS.
 *****************************************************************
01 WS-VARIABLES.
     05  CICSRC                  PIC S9(8) COMP VALUE +0.
     05  RESCHECK-CNT            PIC 9(03) VALUE ZEROES.
     05  SPSTATUS-CNT            PIC 9(03) VALUE ZEROES.
*****************************************************************
 * ATTACHMENT DEFINITION NAME.  FOR SIMPLICITY OF EXAMPLE,
 * THIS PROGRAM ASSUMES THAT THE ATTACHMENT RECORD CONTAINS THE
 * USERID AND PASSWORD (OR ELSE THAT NONE ARE NEEDED).  IN AN
 * ACTUAL PRODUCTION ENVIRONMENT, USERID, PASSWORD, OR BOTH COULD
 * BE SPECIFIED AT RUNTIME.
 *****************************************************************
01 ATTACH-NAME                  PIC X(32) VALUE 'SQLSERVE'.
*****************************************************************
 * SQL STATEMENT TO EXECUTE.  WILL SELECT ALL ROWS FROM THE SQL
 * SERVER SAMPLE PUBS DATABASE TABLE "SALES."  MULTIPLE SQL
 * REQUESTS CAN BE SENT IN ONE REQUEST BUFFER, AS LONG AS THEY ARE
 * SEPARATED BY SEMICOLONS.
 *****************************************************************
01 WS-SELECT-STMT.
     05 SELECT-STMT              PIC X(80)
               VALUE 'SELECT * FROM pubs2.sales'.
*****************************************************************
 * FLAGS.
 *****************************************************************
01 WS-RESCHECK-DONE-SW          PIC X(01) VALUE 'N'.
     88 RESCHECK-DONE            VALUE 'Y'.
     88 RESCHECK-NOT-DONE        VALUE 'N'.
     88 LAST-SPSTATUS-SPACES     VALUE ' '.
01 WS-SPAREA-INIT-SW            PIC X(01) VALUE 'N'.
     88 SPAREA-INIT-OK           VALUE 'Y'.
     88 SPAREA-INIT-BAD          VALUE 'N'.
01 WS-ATTACH-TO-SERVER-SW       PIC X(01) VALUE 'N'.
     88 ATTACH-OK                VALUE 'Y'.
     88 ATTACH-FAILED            VALUE 'N'.
*****************************************************************
 * ERROR MESSAGES.
 *****************************************************************
01 WS-STUB-ERROR-MSG.
     03 FILLER                   PIC X(09)
             VALUE 'CALL TO: '
     03 WS-STUB-NAME             PIC X(08) VALUE SPACES.
     03 FILLER                   PIC X(18)
             VALUE ' - RECEIVED SPRC: '
     03 WS-STUB-SPRC             PIC X(03) VALUE '000'.
     03 FILLER                   PIC X(03) VALUE ' - '.
     03 WS-STUB-SPMSG            PIC X(100) VALUE SPACES.
01 WS-RESCHECK-MSG.
     03 FILLER                   PIC X(33)
             VALUE 'RESCHECK NON-BLANK STATUS - REC: '.
     03 WS-RESCHECK-NUMBER       PIC 9(03) VALUE ZEROES.
     03 FILLER                   PIC X(16)
             VALUE ' - SPSTATUS IS: '.
     03 WS-SPSTATUS-OUT          PIC X(02) VALUE SPACES.
     03 FILLER                   PIC X(11)
             VALUE ' - SPCODE: '.
     03 WS-SPCODE-OUT            PIC X(03) VALUE SPACES.
     03 FILLER                   PIC X(10)
             VALUE ' - SPIND: '.
     03 WS-SPIND-OUT             PIC X(01) VALUE SPACE.
*****************************************************************
 * FORMATTED SALES DATA RECORD TO BE WRITTEN TO TEMP STORAGE.
 *****************************************************************
01 SALES-ROW.
     03 SALES-STOR-ID            PIC X(04) VALUE SPACES.
     03 FILLER                   PIC X(01) VALUE SPACE.
     03 SALES-ORD-NUM            PIC X(20) VALUE SPACES.
     03 FILLER                   PIC X(01) VALUE SPACE.
     03 SALES-DATE               PIC X(10) VALUE SPACES.
     03 FILLER                   PIC X(01) VALUE SPACE.
     03 SALES-QTY                PIC 9(04) VALUE 0.
     03 FILLER                   PIC X(01) VALUE SPACE.
     03 SALES-PAY-TERMS          PIC X(12) VALUE SPACES.
     03 FILLER                   PIC X(01) VALUE SPACE.
     03 SALES-TITLE-ID           PIC X(06) VALUE SPACES.
LINKAGE SECTION.
*****************************************************************
 * UNLIKE A NORMAL RSP, WHERE THE SPAREA IS SUPPLIED VIA THE COMM
 * AREA BY MAINFRAMEConnect BEFORE LINKING TO THE RSP, IN A CSA,
 * THIS PROGRAM SUPPLIES THE SPAREA, WHICH IS
 * THEN INITIALIZED BY THE CALL TO CSSETUP.
 *****************************************************************
01 STORE-PROC-AREA.
     COPY SPAREAC.
*****************************************************************
 * SQL REQUEST BUFFER THAT WILL BE PASSED TO THE REMOTE SERVER VIA
 * REQEXEC CALL.  IT CONSISTS OF A HALFWORD LENGTH FIELD, AND THE
 * ACTUAL REQUEST STATEMENT.
 *****************************************************************
01 SQL-BUFFER.
     03 SQL-LENGTH               PIC S9(4) COMP.
     03 SQL-REQUEST              PIC X(80).
*****************************************************************
 * SQLDA FOR DB2-FORMAT INPUT PIPE THAT WILL RETURN THE RESULT
 * ROWS FROM THE SALES TABLE.  HARDCODED FOR SIX OCCURENCES OF
 * SQLVAR SINCE WE KNOW AHEAD OF TIME THAT IS THE NUMBER OF
 * COLUMNS THE SALES TABLE HAS.  THE ACTUAL SQLDA WILL BE BUILT
 * AND A POINTER SUPPLIED TO IT WHEN WE OPEN THE DB2-FORMAT INPUT
 * PIPE TO READ RESULTS.
 *****************************************************************
01 SALES-SQLDA.
     03 SALES-SQLDAID            PIC X(08).
     03 SALES-SQLDABC            PIC S9(8) COMP.
     03 SALES-SQLN               PIC S9(4) COMP.
     03 SALES-SQLD               PIC S9(4) COMP.
     03 SALES-SQLVAR             OCCURS 6 TIMES.
         05 SALES-SQLTYPE        PIC S9(4) COMP.
         05 SALES-SQLLEN         PIC S9(4) COMP.
         05 SALES-SQLDATA        POINTER.
         05 SALES-SQLIND         POINTER.
         05 SALES-SQLNAME        PIC X(32).
*****************************************************************
 * DATA FIELDS POINTED TO BY THE SQLDATA POINTERS.
 * NOTE THAT VARCHAR FIELDS ARE PRECEEDED BY A LENGTH FIELD.
 * OTHER DATATYPES HAVE THEIR OWN REQUIREMENTS. CHECK THE IBM
 * DXT REFERENCE MANUAL OR MODELRSP IN THE RSP PROGRAMMER'S REF.
 *****************************************************************
01 STORE-ID                     PIC X(04).
01 ORDER-NUMBER.
     03 ORD-NUM-LENGTH           PIC S9(4) COMP.
     03 ORD-NUM.
         05 ORD-NUMCHAR          PIC X(01)
            OCCURS 20 TIMES DEPENDING ON ORD-NUM-LENGTH.
01 ORDER-DATE                   PIC X(10).
01 QUANTITY                     PIC S9(4) COMP.
01  PAY-TERMS.
     03 PAY-TERM-LEN             PIC S9(4) COMP.
     03 PAY-TERM.
        05 PAY-TERM-CHAR        PIC X(01)
             OCCURS 12 TIMES DEPENDING ON PAY-TERM-LEN.
01  TITLE-ID-ENT.
     03 TITLE-ID-LEN             PIC S9(4) COMP.
     03 TITLE-ID.
         05 TITLE-ID-CHAR        PIC X(01)
             OCCURS 6 TIMES DEPENDING ON TITLE-ID-LEN.
***************************************************************
 PROCEDURE DIVISION.
 ***************************************************************
0000-MAIN-PROCESSING.
    PERFORM 1000-SPAREA-INIT        THRU 1000-EXIT.
    PERFORM 5000-PROCESS-REQUEST    THRU 5000-EXIT.
0000-GET-OUT-NOW.
    EXEC CICS
         RETURN
     END-EXEC.
0000-EXIT.
     EXIT.
*****************************************************************
 * GET AN SPAREA, AND CALL CSA TO INITIALIZE IT.
 *****************************************************************
1000-SPAREA-INIT.
    EXEC CICS
         DELETEQ TS QUEUE('CSEXQUE')
         RESP(CICSRC)
     END-EXEC.
*****************************************************************
 * THIS GETMAIN MAKES THE SPAREA AVAILABLE TO OPEN CLIENTConnect.
 *****************************************************************
    EXEC CICS
         GETMAIN SET(SPAREA-PTR)
         LENGTH(LENGTH OF SPAREA) NOSUSPEND
         RESP(CICSRC)
     END-EXEC.
    IF CICSRC = DFHRESP(NORMAL)
         SET ADDRESS OF STORE-PROC-AREA TO SPAREA-PTR
         PERFORM 1100-CALL-CSSETUP      THRU 1100-EXIT
     END-IF.
1000-EXIT.
     EXIT.
*****************************************************************
 * CALL CSA TO INITIALIZE SPAREA
 ****************************************************************
1100-CALL-CSSETUP.
    MOVE 'Y' TO SPTRCOPT.
    CALL 'CSSETUP' USING SPAREA.
    IF SPRC = '000'
         MOVE 'Y'                       TO WS-SPAREA-INIT-SW
     ELSE
         MOVE 'CSSETUP'                 TO WS-STUB-NAME
         PERFORM 6900-STUB-CALL-ERROR   THRU 6900-EXIT
         GO TO 0000-GET-OUT-NOW
     END-IF.

1100-EXIT.
     EXIT.
*****************************************************************
 * CONTROL THE PROCESS OF ATTACHING TO SQL SERVER, EXECUTING THE
 * SELECT REQUEST, AND RETRIEVING THE RESULTS.
 *****************************************************************
5000-PROCESS-REQUEST.
    PERFORM 5100-ATTACH-TO-SQL-SERVER  THRU 5100-EXIT.
    IF ATTACH-OK
         PERFORM 5500-SEND-REQUEST      THRU 5500-EXIT
         PERFORM 5700-READ-RESULTS      THRU 5700-EXIT
         PERFORM 5800-CALL-DETACH       THRU 5800-EXIT.
5000-EXIT.
     EXIT.
*****************************************************************
 * CALL CLIENT SERVICES TO ATTACH TO THE SQL SERVER.
 *****************************************************************
5100-ATTACH-TO-SQL-SERVER.
MOVE ATTACH-NAME                   TO SPSERVER.
     CALL 'ATTACH' USING SPAREA.
    IF SPRC = '000'
         MOVE 'Y'                       TO WS-ATTACH-TO-SERVER-SW
     ELSE
         MOVE 'ATTACH'                  TO WS-STUB-NAME
         PERFORM 6900-STUB-CALL-ERROR   THRU 6900-EXIT
         GO TO 0000-GET-OUT-NOW
     END-IF
5100-EXIT.
     EXIT.
*****************************************************************
 * EXECUTE THE SQL REQUEST AGAINST THE REMOTE SERVER.
 *****************************************************************
5500-SEND-REQUEST.
    EXEC CICS
         GETMAIN SET(SQL-REQ-PTR)
         LENGTH(LENGTH OF SQL-BUFFER)
         NOSUSPEND RESP(CICSRC)
     END-EXEC.
    SET ADDRESS OF SQL-BUFFER         TO SQL-REQ-PTR.
     SET SPSQL                         TO SQL-REQ-PTR.
    IF CICSRC = DFHRESP(NORMAL)
         MOVE SELECT-STMT              TO SQL-REQUEST
         MOVE LENGTH OF SELECT-STMT    TO SQL-LENGTH
         CALL 'REQEXEC' USING SPAREA
         IF SPRC = '000'
             PERFORM 6000-RESCHECK-SEARCH THRU 6000-EXIT
                 UNTIL RESCHECK-DONE
         END-IF
     END-IF.
5500-EXIT.
     EXIT.
*****************************************************************
 * RETRIEVE ANY RESULT ROWS BY OPENING DB2 INPUT PIPE.
 *****************************************************************
5700-READ-RESULTS.
    PERFORM 5710-OPEN-GETPIPE         THRU 5710-EXIT.
     PERFORM 5720-GETPIPE-LOOP         THRU 5720-EXIT
         UNTIL SPRC NOT = '000'.
5700-EXIT.
     EXIT.
*****************************************************************
 * OPEN THE DB2 INPUT PIPE.
 *****************************************************************
5710-OPEN-GETPIPE.
    MOVE 'INPUT '                     TO SPMODE.
     MOVE 'DB2'                        TO SPFORMAT.
     CALL 'OPENPIPE' USING SPAREA.
    IF SPRC = '000'
         SET ADDRESS OF SALES-SQLDA    TO SPSQLDA
        SET ADDRESS OF STORE-ID       TO SALES-SQLDATA(1)
         SET ADDRESS OF ORDER-NUMBER   TO SALES-SQLDATA(2)
         SET ADDRESS OF ORDER-DATE     TO SALES-SQLDATA(3)
         SET ADDRESS OF QUANTITY       TO SALES-SQLDATA(4)
         SET ADDRESS OF PAY-TERMS      TO SALES-SQLDATA(5)
         SET ADDRESS OF TITLE-ID-ENT   TO SALES-SQLDATA(6)
     ELSE
         MOVE 'OPENPIPE'               TO WS-STUB-NAME
         PERFORM 6900-STUB-CALL-ERROR  THRU 6900-EXIT
         GO TO 0000-GET-OUT-NOW
     END-IF.
5710-EXIT.
     EXIT.
*****************************************************************
 USE GETPIPE TO RETRIEVE ANY RESULT ROWS.
 *****************************************************************	5720-GETPIPE-LOOP.
    CALL 'GETPIPE' USING SPAREA.
    IF SPRC = '000'
         MOVE SPACES             TO SALES-ROW
         MOVE STORE-ID                 TO SALES-STOR-ID
         MOVE ORD-NUM                  TO SALES-ORD-NUM
         MOVE ORDER-DATE               TO SALES-DATE
         MOVE QUANTITY                 TO SALES-QTY
         MOVE PAY-TERM                 TO SALES-PAY-TERMS
         MOVE TITLE-ID                 TO SALES-TITLE-ID
         EXEC CICS
             WRITEQ TS QUEUE('CSEXQUE')
                 FROM(SALES-ROW) NOSUSPEND
             RESP(CICSRC)
         END-EXEC
    ELSE
         IF SPRC NOT = 'EOF'
             MOVE 'GETPIPE'            TO WS-STUB-NAME
             PERFORM 6900-STUB-CALL-ERROR THRU 6900-EXIT
             GO TO 0000-GET-OUT-NOW
         END-IF
     END-IF.
    IF SPIND = 'M'
         PERFORM 6100-GET-MESSAGES     THRU 6100-EXIT
             UNTIL SPIND NOT = 'M'
     END-IF.
5700-EXIT.
     EXIT.
*****************************************************************
 * CALL THE DETACH STUB TO DETACH FROM A REMOTE SERVER.
 *****************************************************************
5800-CALL-DETACH.
    CALL 'DETACH' USING SPAREA.
    IF SPRC NOT = '000'
         MOVE 'DETACH'                 TO WS-STUB-NAME
         PERFORM 6900-STUB-CALL-ERROR  THRU 6900-EXIT
         GO TO 0000-GET-OUT-NOW.
5800-EXIT.
     EXIT.
*****************************************************************
 * CHECK RESCHECK TO LOCATE ANY ERROR MESSAGES RETURNED FROM LAN.
 * ALWAYS LOG ANY NON-ZERO STATUS AFTER A CALL TO REQEXEC.
 *****************************************************************
6000-RESCHECK-SEARCH.
    ADD 1                             TO RESCHECK-CNT.
    IF SPSTATUS NOT = ‘ ‘(space)
 		MOVE ‘N’ 									TO WS-RESCHECK-DONE-SW
         ADD 1                         TO SPSTATUS-CNT
         MOVE SPSTATUS-CNT             TO WS-RESCHECK-NUMBER
         MOVE SPSTATUS                 TO WS-SPSTATUS-OUT
         MOVE SPCODE                   TO WS-SPCODE-OUT
         MOVE SPIND                    TO WS-SPIND-OUT
         EXEC CICS
             WRITEQ TS QUEUE('CSEXQUE')
                 FROM(WS-RESCHECK-MSG) NOSUSPEND
                 RESP(CICSRC)
         END-EXEC
         IF SPIND NOT = SPACES
             PERFORM 6100-GET-MESSAGES THRU 6100-EXIT
                 UNTIL SPIND NOT = 'M'
         END-IF
    ELSE
         IF LAST-SPSTATUS-SPACES
             MOVE 'Y'                  TO WS-RESCHECK-DONE-SW
         ELSE
             MOVE ' '                  TO WS-RESCHECK-DONE-SW
         END-IF
     END-IF.
    IF NOT RESCHECK-DONE
         CALL 'RESCHECK' USING SPAREA.
6000-EXIT.
     EXIT.
*****************************************************************
 * RETRIEVE ANY OUTSTANDING MESSAGES FOR A REQUEST.
 *****************************************************************
6100-GET-MESSAGES.
        CALL 'GETMSG' USING SPAREA
    IF SPMSG NOT = SPACES
         EXEC CICS
             WRITEQ TS QUEUE('CSEXQUE')
                 FROM(SPMSG) NOSUSPEND
             RESP(CICSRC)
         END-EXEC
     END-IF.
6100-EXIT.
     EXIT.
*****************************************************************
 * FORMAT AND WRITE STUB-CALL ERROR INFO TO TS QUEUE.
 *****************************************************************
6900-STUB-CALL-ERROR.
    MOVE SPRC                         TO WS-STUB-SPRC.
     MOVE SPMSG                        TO WS-STUB-SPMSG.
    EXEC CICS
         WRITEQ TS QUEUE('CSEXQUE')
             FROM(WS-STUB-ERROR-MSG) NOSUSPEND
         RESP(CICSRC)
     END-EXEC.
6900-EXIT.
     EXIT.