CSAINDX sample code

IDENTIFICATION DIVISION.
PROGRAM-ID.  CSAINDX.
*****************************************************************
 * SAMPLE CSA PROGRAM TO ILLUSTRATE:
 * 1) Connect TO THE DIRECTConnect, JUST TO VERIFY IT'S UP
 * 2) Connect TO SQL SERVER, EXECUTING A STORED PROCEDURE
 *    THAT DELETES AN INDEX ON A SQL SERVER TABLE
 * 3) Connect TO THE DIRECTConnect, DO A TRANSFER TO THAT TABLE
 * 4) Connect TO SQL SERVER, EXECUTING A STORED PROCEDURE
 *    THAT RE-CREATES AN INDEX ON THAT SQL SERVER TABLE
 *
 * TRANSID IN PCT: PIDX     PROGRAM NAME IN PPT: CSAINDX
 *****************************************************************
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(3) VALUE ZEROES.
     05 SPSTATUS-CNT                PIC 9(3) VALUE ZEROES.
*****************************************************************
 * ATTACHMENT DEFINITION NAME.
 *****************************************************************
01 WS-ATTACH-NAMES.
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
 * ATTNAME-1 - AN ATTACHMENT RECORD WITH THE DIRECTConnect SERVICENAME *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
    05 ATTNAME-1                   PIC X(08) VALUE 'GWSERVNM'.
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
 * ATTNAME-2 - ATTACHMENT RECORD WITH THE SQL SERVER SERVICENAME *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
    05 ATTNAME-2                   PIC X(08) VALUE 'SQLSERVE'.
*****************************************************************
 * SWITCH FOR RESCHECK READS -
 *	THE IDEA IS TO KEEP CALLING RESCHECK UNTIL YOU'VE RECEIVED
 *	SPACES IN SPSTATUS TWICE IN A ROW - THEN YOU'RE DONE.
 *
 *	IMPORTANT FOR "BATCH" COMMANDS SENT THRU THE SQL BUFFER.
 *****************************************************************
01 WS-SWITCHES.
         03 WS-RESCHECK-DONE-SW         PIC X VALUE 'N'.
             88 RESCHECK-DONE           VALUE 'Y'.
             88 RESCHECK-NOT-DONE       VALUE 'N'.
             88 LAST-SPSTATUS-SPACES    VALUE ' '.
        03 WS-INIT-OKAY-SW             PIC X(01) VALUE 'Y'.
             88 SPAREA-INIT-OK          VALUE 'Y'.
             88 SPAREA-INIT-BAD         VALUE 'N'.
        03 WS-ATTACH-OK-SW             PIC X(01) VALUE 'Y'.
             88 ATTACH-OKAY             VALUE 'Y'.
             88 ATTACH-FAILED           VALUE 'N'.
*****************************************************************
 * SQL STATEMENT TO EXECUTE. - ALL STATEMENTS ARE 90 BYTES.
 * BEAR IN MIND COMMANDS SENT TO SYBASE SQL SERVER MAY BE CASE SENSITIVE.
 *****************************************************************
01 SQL-BUFFER-CMDS.
         03 DELETE-IDX-SP-STMT.
             05 FILLER      PIC X(16) VALUE
             'execute rickdinx'.
             05 FILLER      PIC X(74) VALUE SPACES.
         03 CREATE-IDX-SP-STMT.
             05 FILLER      PIC X(16) VALUE
             'execute rickcinx'.
             05 FILLER      PIC X(74) VALUE SPACES.
         03 TRANSFER-STMT.
             05 FILLER      PIC X(12) VALUE
             'TRANSFER TO '.
             05 FILLER      PIC X(01) VALUE QUOTE.
             05 FILLER      PIC X(15) VALUE
             'trex ssuid sspw'.
             05 FILLER      PIC X(01) VALUE QUOTE.
             05 FILLER      PIC X(02) VALUE '; '.
             05 FILLER      PIC X(26) VALUE
             'WITH REPLACE INTO samp04in'.
             05 FILLER      PIC X(02) VALUE '; '.
             05 FILLER      PIC X(30) VALUE
             'USE PROCEDURE SAMP04C 00200   '.
             05 FILLER      PIC X(01) VALUE SPACES.

*****************************************************************
 * ERROR MESSAGES.
 *****************************************************************
01 WS-ATTACH-ERR-MSG.
         03 FILLER               PIC X(15)
           VALUE 'ATTACHMENT TO: '.
         03 WS-ATTACH-ERR-NAME   PIC X(08) VALUE SPACES.
         03 FILLER               PIC X(20)
           VALUE ' - WITH ERROR CODE: '.
         03 WS-ATTACH-ERR-MSGCODE PIC X(03) VALUE '000'.
01 WS-RUN-COUNT-MSG.
         03 FILLER               PIC X(30)
           VALUE '* STARTING TRANSFER LOOP NUM: '.
         03 WS-RUN-COUNT         PIC 9(03) VALUE ZEROES.
01 WS-CSSETUP-ERROR-MSG.
         03 FILLER               PIC X(30)
           VALUE '! CSSETUP HAD A PROBLEM SPRC: '.
         03 WS-CSSETUP-SPRC      PIC X(03) VALUE SPACES.
01 WS-RESCHECK-LAST-MSG.
         03 FILLER               PIC X(30)
           VALUE '- FINAL RESCHECK READ COUNT : '.
         03 WS-RESCHECK-COUNT    PIC 9(03) VALUE ZEROES.
01 WS-DID-SYBASE-DELETE.
         03 FILLER               PIC X(30)
           VALUE '> DID SYBASE DELETE INDEXES SP'.
01 WS-DID-GW-TRANSFER.
         03 FILLER               PIC X(30)
           VALUE '> DID GW TRANSFER RSP TO SYBAS'.
01 WS-DID-SYBASE-CREATE.
         03 FILLER               PIC X(30)
           VALUE '> DID SYBASE CREATE INDEXES SP'.
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.

LINKAGE SECTION.

01 STORED-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(100).
*==============================================================*
 PROCEDURE DIVISION.
 *==============================================================*
0000-MAIN-PROCESSING.
    PERFORM 1000-SPAREA-INIT.
    IF ATTACH-OKAY
         PERFORM 5000-TRANSFER-PROCESS THRU 5000-EXIT
         PERFORM 9900-FINALCOUNT       THRU 9900-EXIT
     END-IF.
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.
    EXEC CICS
         GETMAIN SET(SPAREA-PTR)
         LENGTH(LENGTH OF SPAREA)
         NOSUSPEND
         RESP(CICSRC)
     END-EXEC.
    IF CICSRC = DFHRESP(NORMAL)
         SET ADDRESS OF STORED-PROC-AREA TO SPAREA-PTR
         PERFORM 1100-CALL-CSSETUP   THRU 1100-EXIT
     END-IF.
    EXEC CICS
         GETMAIN SET(SQL-REQ-PTR)
         LENGTH(LENGTH OF SQL-BUFFER)
         NOSUSPEND RESP(CICSRC)
     END-EXEC.
    IF CICSRC = DFHRESP(NORMAL)
         SET ADDRESS OF SQL-BUFFER TO SQL-REQ-PTR
         SET SPSQL TO SQL-REQ-PTR
     ELSE
         MOVE 'N'       TO WS-INIT-OKAY-SW
     END-IF.
1000-EXIT.
     EXIT.
*****************************************************************
 * CALL CSA TO INITIALIZE SPAREA
 *****************************************************************
1100-CALL-CSSETUP.
    CALL 'CSSETUP' USING SPAREA.
    IF SPRC = '000'
         MOVE 'Y'      TO WS-INIT-OKAY-SW
     ELSE
         MOVE SPRC     TO WS-CSSETUP-SPRC
     EXEC CICS
             WRITEQ TS QUEUE('CSEXQUE')
                 FROM(WS-CSSETUP-ERROR-MSG) NOSUSPEND
                 RESP(CICSRC)
         END-EXEC
         GO TO 0000-GET-OUT-NOW
     END-IF.
1100-EXIT.
     EXIT.
*****************************************************************
 * CONTROL THE PROCESS OF ATTACH, EXEC, DETATCH FOR TRANSFER.
 * 1) 1ST ATTACH TO DIRECTConnect CHECKS IF IT'S ALIVE AND WELL.
 * 2) 2ND ATTACH TO SQL SERVER - RUNS S.P. TO DELETE INDEXES.
 * 3) 3RD ATTACH TO DIRECTConnect RUNS TRANSFER FROM RSP TO SYBASE SQL SERVER.
 * 4) 4TH ATTACH TO SQL SERVER - RUNS S.P. TO RE-CREATE INDEXES.
 *****************************************************************
5000-TRANSFER-PROCESS.
    PERFORM 5100-WRITE-RUN-COUNT          THRU 5100-EXIT.
    PERFORM 5600-ATTACH-TO-DIRECTConnect THRU 5600-EXIT.
     PERFORM 5800-CALL-DETACH              THRU 5800-EXIT.
    PERFORM 5700-ATTACH-TO-SYBASE SQL SERVER THRU 5700-EXIT.
     PERFORM 5200-LOAD-DEL-INDEX-STMT      THRU 5200-EXIT.
     PERFORM 5500-CALL-REQEXEC             THRU 5500-EXIT.
     PERFORM 5800-CALL-DETACH              THRU 5800-EXIT.
    PERFORM 5600-ATTACH-TO-DIRECTConnect THRU 5600-EXIT.
     PERFORM 5300-LOAD-TRANSFER-STMT       THRU 5300-EXIT.
     PERFORM 5500-CALL-REQEXEC             THRU 5500-EXIT.
     PERFORM 5800-CALL-DETACH              THRU 5800-EXIT.
    PERFORM 5700-ATTACH-TO-SYBASE         THRU 5700-EXIT.
     PERFORM 5400-LOAD-CRE-INDEX-STMT      THRU 5400-EXIT.
     PERFORM 5500-CALL-REQEXEC             THRU 5500-EXIT.
     PERFORM 5800-CALL-DETACH              THRU 5800-EXIT.
5000-EXIT.
     EXIT.
*****************************************************************
 * SEND THE TRANSFER LOOP RUN COUNT TO TEMP STORAGE QUE
 *****************************************************************
5100-WRITE-RUN-COUNT.
    ADD 1               TO WS-RUN-COUNT.
    EXEC CICS
         WRITEQ TS QUEUE('CSEXQUE')
             FROM(WS-RUN-COUNT-MSG) NOSUSPEND
             RESP(CICSRC)
     END-EXEC.
5100-EXIT.
     EXIT.
*****************************************************************
 * LOAD THE DELETE INDEX STATEMENT INTO THE SQL BUFFER
 *****************************************************************
5200-LOAD-DEL-INDEX-STMT.
    MOVE DELETE-IDX-SP-STMT              TO SQL-REQUEST.
     MOVE LENGTH OF DELETE-IDX-SP-STMT    TO SQL-LENGTH.
     PERFORM 5500-CALL-REQEXEC            THRU 5500-EXIT.
5200-EXIT.
     EXIT.
*****************************************************************
 * LOAD THE TRANSFER STATEMENT INTO THE SQL BUFFER FOR THE DIRECTConnect
 *****************************************************************
5300-LOAD-TRANSFER-STMT.
    MOVE TRANSFER-STMT                   TO SQL-REQUEST.
     MOVE LENGTH OF TRANSFER-STMT         TO SQL-LENGTH.
     PERFORM 5500-CALL-REQEXEC            THRU 5500-EXIT.
5300-EXIT.
     EXIT.
*****************************************************************
 * LOAD THE CREATE INDEX STATEMENT INTO THE SQL BUFFER
 *****************************************************************
5400-LOAD-CRE-INDEX-STMT.
    MOVE CREATE-IDX-SP-STMT              TO SQL-REQUEST.
     MOVE LENGTH OF CREATE-IDX-SP-STMT    TO SQL-LENGTH.
     PERFORM 5500-CALL-REQEXEC            THRU 5500-EXIT.
5400-EXIT.
     EXIT.
*****************************************************************
 * EXECUTE THE SQL REQUEST AGAINST THE REMOTE SERVER.
 *****************************************************************
5500-CALL-REQEXEC.
    CALL 'REQEXEC' USING SPAREA.
    IF SPRC = '000'
         PERFORM 5900-RESCHECK-SEARCH     THRU 5900-EXIT
             UNTIL RESCHECK-DONE.
5500-EXIT.
     EXIT.
*****************************************************************
 * CALL CSA TO ATTACH TO DIRECTConnect.
 *****************************************************************
5600-ATTACH-TO-DIRECTConnect.
    MOVE ATTNAME-1         TO SPATTACH.
    CALL 'ATTACH' USING SPAREA.
    IF SPRC = '000'
         MOVE 'Y'           TO WS-ATTACH-OK-SW
     ELSE
         MOVE ATTNAME-1     TO WS-ATTACH-ERR-NAME
     MOVE SPRC              TO WS-ATTACH-ERR-MSGCODE
         EXEC CICS
             SEND FROM(WS-ATTACH-ERR-MSG) ERASE RESP(CICSRC)
         END-EXEC
         IF SPIND = 'M'
             PERFORM 9700-GET-MESSAGES
                 UNTIL SPIND NOT = 'M'
         END-IF
         GO TO 0000-GET-OUT-NOW
     END-IF.
5600-EXIT.
     EXIT.
*****************************************************************
 * CALL CSA TO ATTACH TO SYBASE SQL SERVER.
 *****************************************************************
5700-ATTACH-TO-SYBASE.
    MOVE ATTNAME-2         TO SPATTACH.
    CALL 'ATTACH' USING SPAREA.
    IF SPRC = '000'
     MOVE 'Y'               TO WS-ATTACH-OK-SW
     ELSE
         MOVE ATTNAME-2     TO WS-ATTACH-ERR-NAME
         MOVE SPRC          TO WS-ATTACH-ERR-MSGCODE
         EXEC CICS
             SEND FROM(WS-ATTACH-ERR-MSG) ERASE RESP(CICSRC)
         END-EXEC
         IF SPIND = 'M'
             PERFORM 9700-GET-MESSAGES
                 UNTIL SPIND NOT = 'M'
         END-IF
         GO TO 0000-GET-OUT-NOW
     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'
         PERFORM 5900-RESCHECK-SEARCH      THRU 5900-EXIT
             UNTIL RESCHECK-DONE.
5800-EXIT.
     EXIT.
*****************************************************************
 * CHECK RESCHECK TO LOCATE SQL STATEMENT IN ERROR.
 * ALWAYS LOG ANY NON-ZERO STATUS AFTER ANY CALL TO SYBASE ICD STUBS.
 *****************************************************************
5900-RESCHECK-SEARCH.
    ADD 1                                 TO RESCHECK-CNT.
    IF SPSTATUS NOT = '  '
         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 9700-GET-MESSAGES 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.

5900-EXIT.
     EXIT.
*****************************************************************
 * RETRIEVE ANY OUTSTANDING MESSAGES FOR A REQUEST.
 * LOG ALL MESSAGES TO TEMP STORAGE QUEUE FOR LATER EXAM - ALWAYS!
 *****************************************************************
9700-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.
9700-EXIT.
     EXIT.
*****************************************************************
 * SEND THE FINAL RESCHECK READ NUMBER TO TEMP STORAGE QUEUE
 *****************************************************************
9900-FINALCOUNT.
    MOVE RESCHECK-CNT                     TO WS-RESCHECK-COUNT.
    EXEC CICS
        WRITEQ TS QUEUE('CSEXQUE')
             FROM(WS-RESCHECK-LAST-MSG) NOSUSPEND
             RESP(CICSRC)
     END-EXEC.
9900-EXIT.
     EXIT.
*===============================================================*
 *    END OF PROGRAM.
 *===============================================================*