Sample program SYCTSAX5
*******************************************************************
*
* Confidential property of Sybase, Inc.
* (c) Copyright Sybase, Inc. 1985 TO ???.
* All rights reserved.
********************************************************************
****** SYCTSAX5 - Open Server Open Client - COBOL -CICS ************ * *
* *
* TRANID: SYX5 *
* *
* PROGRAM: SYCTSAX5 *
* *
* *
* TABLE: SYBASE.SAMPLETB *
* *
* PURPOSE: Demonstrates Open Server/Open Client CALLs. *
* *
* FUNCTION: Illustrates the ability to act as a server and a *
* client within one program. *
* *
* This program is invoked via an RPC request and will *
* in turn execute a language request against a server *
* and return the results back to the client. *
* *
* It will issue the following SQL statement: *
* "SELECT FIRSTNME FROM SYBASE.SAMPLETB" *
* *
* *
* PREREQS: Before running SYCTSAX5, make sure that the server *
* you wish to access has an entry in the Connection *
* Router Table for that Server and the MCC(s) that *
* you wish to use. *
* *
* INPUT: On the input, make sure to enter the Server name, *
* user id, and password for the target server that *
* executes the RPC - SYX5. *
* *
* Open Server Library calls: *
* *
* TDACCEPT accept request from client *
* TDESCRIB describe a column in the result row *
* TDFREE free TDPROC structure *
* TDINFPRM get information about one rpc parameter *
* TDINIT establish environment *
* TDNUMPRM get total nr of rpc parameters *
* TDRCVPRM retrieve rpc parameter from client *
* TDSNDDON send results-completion to client *
* TDSNDMSG send error messages back to the client *
* TDSNDROW send a row of data back to the client *
* *
* Open Client calls: *
* *
* CTBBIND bind a column variable *
* CTBCLOSE close a server connection *
* CTBCMDALLOC allocate a command *
* CTBCMDDROP drop a command *
* CTBCOMMAND initiate remote procedure call *
* CTBCONALLOC allocate a connection *
* CTBCONDROP drop a connection *
* CTBCONPROPS alter properties of a connection *
* CTBCONNECT open a server connection *
* CTBDIAG retrieve SQLCODE messages *
* CTBEXIT exit client library *
* CTBFETCH fetch result data *
* CTBINIT init client library *
* CTBRESULTS sets up result data *
* CTBSEND send a request to the server *
* *
* History: *
* *
* Date BTS# Descrition *
* ======= ====== =============================================== *
* Feb1795 Create *
* Nov1595 99999 Rewrite and add front end to the program *
* *
********************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. SYCTSAX5.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*-----------------------------------------------------------------
* Client Library Cobol Copy Book
*-----------------------------------------------------------------
COPY CTPUBLIC.
*-----------------------------------------------------------------
* Server Library Cobol Copy Book
*-----------------------------------------------------------------
COPY SYGWCOB.
*-----------------------------------------------------------------
* Standard CICS Attribute and Print Control Chararcter List
*-----------------------------------------------------------------
COPY DFHBMSCA.
*-----------------------------------------------------------------
* CICS Standard Attention Identifiers Cobol Copy Book
*-----------------------------------------------------------------
COPY DFHAID.
*-----------------------------------------------------------------
* Work Area
*-----------------------------------------------------------------
01 GW-LIB-MISC-FIELDS.
05 GWL-TDPROC POINTER.
05 GWL-RC PIC S9(9) COMP SYNC VALUE 0.
01 INTERNAL-FIELDS.
05 CF-FOUR PIC S9(9) COMP VALUE 4.
01 SWITCHES.
05 SW-RESULTS PIC X(01) value 'Y'.
88 NO-MORE-RESULTS VALUE 'N'.
05 SW-FETCH PIC X(01) value 'Y'.
88 NO-MORE-ROWS VALUE 'N'.
05 SW-DIAG PIC X(01) VALUE 'N'.
88 DIAG-MSGS-INITIALIZED VALUE 'Y'.
01 PARM-FIELDS.
05 PF-PARM-ID PIC S9(9) COMP SYNC.
05 PF-DATATYPE PIC S9(9) COMP SYNC.
05 PF-ACTUAL-DATA-LENGTH PIC S9(9) COMP SYNC.
05 PF-MAX-DATA-LENGTH PIC S9(9) COMP SYNC.
05 PF-PARM-STATUS PIC S9(9) COMP SYNC.
05 PF-PARM-NAME PIC X(30).
05 PF-PARM-NAME-LENGTH PIC S9(9) COMP SYNC.
05 PF-USER-DATATYPE PIC S9(9) COMP SYNC.
05 PF-NUM-OF-PARMS PIC S9(9) COMP SYNC.
05 PF-MSGLIMIT PIC S9(9) COMP.
01 SNA-FIELDS.
05 SNA-SUBC PIC S9(9) COMP SYNC.
05 SNA-CONNECTION-NAME PIC X(8) VALUE IS SPACES.
01 WORK-FIELDS.
05 WRK-DONE-STATUS PIC S9(9) COMP SYNC.
01 DESCRIBE-FIELDS.
05 DF-COLUMN-NUMBER PIC S9(9) COMP SYNC VALUE 0.
05 DF-HOST-VARIABLE-TYPE PIC S9(9) COMP SYNC VALUE 0.
05 DF-HOST-VARIABLE-MAXLEN PIC S9(9) COMP SYNC VALUE 0.
05 DF-HOST-VARIABLE-NAME POINTER.
05 DF-NULL-INDICATOR-VAR PIC S9(9) COMP SYNC VALUE 0.
05 DF-NULLS-ALLOWED PIC S9(9) COMP SYNC VALUE 0.
05 DF-COLUMN-TYPE PIC S9(9) COMP SYNC VALUE 0.
05 DF-COLUMN-MAXLEN PIC S9(9) COMP SYNC VALUE 0.
05 DF-COLUMN-NAME PIC X(30).
05 DF-COLUMN-NAME-LEN PIC S9(9) COMP SYNC VALUE 0.
01 SNDMSG-FIELDS.
05 SF-MESSAGE-TYPE PIC S9(9) COMP SYNC.
05 SF-MESSAGE-NUMBER PIC S9(9) COMP SYNC.
05 SF-SEVERITY PIC S9(9) COMP SYNC.
05 SF-ERROR-STATE PIC S9(9) COMP SYNC.
05 SF-LINE-ID PIC S9(9) COMP SYNC.
05 SF-TRANSACTION-ID PIC X(4) VALUE 'SYX5'.
05 SF-TRANSACTION-ID-LEN PIC S9(9) COMP SYNC.
05 SF-MESSAGE-TEXT PIC X(80).
05 SF-MESSAGE-LENGTH PIC S9(9) COMP SYNC.
01 CTX PIC S9(9) COMP SYNC.
01 ROW-DATA PIC X(80) VALUE IS SPACES.
*-----------------------------------------------------------------
* Work Areas Open Client
*-----------------------------------------------------------------
01 CS-LIB-MISC-FIELDS.
05 CSL-CMD-HANDLE PIC S9(9) COMP SYNC VALUE 0.
05 CSL-CON-HANDLE PIC S9(9) COMP SYNC VALUE 0.
05 CSL-CTX-HANDLE PIC S9(9) COMP SYNC VALUE 0.
05 CSL-RC PIC S9(9) COMP SYNC.
01 PROPS-FIELDS.
05 PF-SERVER PIC X(30).
05 PF-SERVER-SIZE PIC S9(9) COMP.
05 PF-USER PIC X(30).
05 PF-USER-SIZE PIC S9(9) COMP.
05 PF-PWD PIC X(30).
05 PF-PWD-SIZE PIC S9(9) COMP.
05 PF-OUTLEN PIC S9(9) COMP SYNC.
05 PF-STRLEN PIC S9(9) COMP SYNC.
01 QUERY-FIELDS.
05 QF-LEN PIC S9(9) VALUE 1.
05 QF-MAXLEN PIC S9(9) VALUE 1.
05 QF-ANSWER PIC X(01) VALUE ' '.
01 FETCH-FIELDS.
05 FF-ROWS-READ PIC S9(9) COMP SYNC VALUE 0.
05 FF-ROW-NUM PIC S9(9) COMP SYNC VALUE 0.
01 COLUMN-FIELDS.
05 CF-COL-FIRSTNME PIC X(12) VALUE SPACES.
05 CF-COL-NUMBER PIC S9(9) COMP SYNC VALUE 0.
05 CF-COL-INDICATOR PIC S9(9) COMP SYNC VALUE 0.
05 CF-COL-OUTLEN PIC S9(9) COMP SYNC VALUE 0.
01 LANG-FIELDS.
05 LF-LANG PIC X(36)
VALUE 'SELECT FIRSTNME FROM SYBASE.SAMPLETB'.
01 ERROR-MSG.
05 ERROR-TEXT PIC X(50) VALUE ' '.
05 ERROR-LITERAL PIC X(06) VALUE ' RC = '.
05 ERROR-RC PIC -ZZZ9.
01 ERROR-MSG-STR REDEFINES ERROR-MSG PIC X(61).
01 INFO-MSG-STR PIC X(80) VALUE ' '.
01 RESULTS-FIELDS.
05 RF-TYPE PIC S9(9) COMP SYNC VALUE 0.
01 DATAFMT.
05 DF-NAME PIC X(132).
05 DF-NAMELEN PIC S9(9) COMP SYNC.
05 DF-DATATYPE PIC S9(9) COMP SYNC.
05 DF-FORMAT PIC S9(9) COMP SYNC.
05 DF-MAXLENGTH PIC S9(9) COMP SYNC.
05 DF-SCALE PIC S9(9) COMP SYNC.
05 DF-PRECISION PIC S9(9) COMP SYNC.
05 DF-STATUS PIC S9(9) COMP SYNC.
05 DF-COUNT PIC S9(9) COMP SYNC.
05 DF-USERTYPE PIC S9(9) COMP SYNC.
05 DF-LOCALE PIC X(68).
*-----------------------------------------------------------------
* Common Work Areas
*-----------------------------------------------------------------
01 MSG-FIELDS.
05 MSG-END-MSG PIC X(25)
VALUE 'All done processing rows.'.
05 MSG-NOT-RPC PIC X(35)
VALUE 'SYX5 must be begun via rpc request.'.
05 MSG-WRONG-NR-PARMS PIC X(40)
VALUE 'Number of parameters must be 2 or 3.'.
05 MSG-NOT-INT4-PARM PIC X(33)
VALUE 'Parameter must be a INTEGER type.'.
05 MSG-CANCELED PIC X(17)
VALUE 'Cancel requested.'.
05 MSG-TDRCVPRM-FAIL PIC X(16)
VALUE 'TDRCVPRM failed.'.
01 CICS-FIELDS.
05 CICS-RESPONSE PIC S9(9) COMP SYNC.
01 MISC-FIELDS.
05 I PIC S9(9) COMP.
05 LCV PIC S9(9) COMP SYNC.
05 TMP-DATE PIC X(08).
05 TMP-TIME PIC X(08).
05 UTIME PIC S9(15) COMP-3.
01 X5-HEADER.
05 X5-DATE-HDR PIC X(06) VALUE ' DATE '.
05 X5-DATE-DATA PIC X(08).
05 X5-HDR PIC X(56).
01 X5-HEADER-STR REDEFINES X5-HEADER PIC X(70).
01 X5-HEADER2.
05 X5-TIME-HDR PIC X(06) VALUE ' TIME '.
05 X5-TIME-DATA PIC X(08).
01 X5-HEADER2-STR REDEFINES X5-HEADER2 PIC X(14).
01 DISP-MSG.
05 TEST-CASE PIC X(08) VALUE IS 'SYCTSAA5'.
05 FILLER PIC X(01) VALUE IS SPACES.
05 MSG.
10 SAMP-LIT PIC X(05) VALUE IS 'rc = '.
10 SAMP-RC PIC -Z9.
10 FILLER PIC X(02) VALUE IS ', '.
10 REST-LIT PIC X(12) VALUE IS
'Result Type:'.
10 REST-TYPE PIC Z(3)9.
10 FILLER PIC X(03) VALUE IS SPACES.
10 MSGSTR PIC X(40) VALUE IS SPACES.
01 DIAG-FIELDS.
05 DG-MSGNO PIC S9(9) COMP VALUE +1.
05 DG-NUM-OF-MSGS PIC S9(9) COMP VALUE +0.
01 DISP-SERVER.
05 SERVER-HDR PIC X(09) VALUE IS
' SERVER: '.
05 SERVER-DATA PIC X(20).
05 USER-HDR PIC X(10) VALUE IS
' USER-ID: '.
05 USER-DATA PIC X(30).
*-----------------------------------------------------------------
* Client Message Structure
*-----------------------------------------------------------------
01 CLIENT-MSG.
05 CM-SEVERITY PIC S9(9) COMP SYNC.
05 CM-MSGNO PIC S9(9) COMP SYNC.
05 CM-TEXT PIC X(256).
05 CM-TEXT-LEN PIC S9(9) COMP SYNC.
05 CM-OS-MSGNO PIC S9(9) COMP SYNC.
05 CM-OS-MSGTXT PIC X(256).
05 CM-OS-MSGTEXT-LEN PIC S9(9) COMP SYNC.
05 CM-STATUS PIC S9(9) COMP.
01 DISP-CLIENT-MSG-HDR.
05 CLIENT-MSG-HDR PIC X(15) VALUE IS
'Client Message:'.
01 DISP-CLIENT-MSG-1.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-SEVERITY-HDR PIC X(09) VALUE IS 'Severity:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-SEVERITY-DATA PIC Z(8)9.
05 CM-STATUS-HDR PIC X(12) VALUE IS
', Status: '.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-STATUS-DATA PIC Z(8)9.
01 DISP-CLIENT-MSG-2.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OC-MSGNO-HDR PIC X(09) VALUE IS 'OC MsgNo:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OC-MSGNO-DATA PIC Z(8)9.
01 DISP-CLIENT-MSG-3.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OC-MSG-HDR PIC X(09) VALUE IS 'OC MsgTx:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OC-MSG-DATA PIC X(66).
01 DISP-CLIENT-MSG-3A.
05 CM-OC-MSG-DATA-1 PIC X(66).
05 CM-OC-MSG-DATA-2 PIC X(66).
05 CM-OC-MSG-DATA-3 PIC X(66).
05 CM-OC-MSG-DATA-4 PIC X(58).
01 DISP-CLIENT-MSG-3B.
05 FILLER PIC X(13) VALUE IS SPACES.
05 CM-OC-MSG-DATA-X PIC X(66).
01 DISP-EMPTY-CLIENT-MSG-3.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OC-MSG-HDR PIC X(09) VALUE IS 'OC MsgTx:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 NO-DATA PIC X(11) VALUE IS 'No Message!'.
01 DISP-CLIENT-MSG-4.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OS-MSG-HDR PIC X(09) VALUE IS 'OS MsgNo:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OS-MSGNO-DATA PIC Z(8)9.
01 DISP-CLIENT-MSG-5.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OS-MSG-HDR PIC X(09) VALUE IS 'OS MsgTx:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OS-MSG-DATA PIC X(66).
01 DISP-CLIENT-MSG-5A.
05 CM-OS-MSG-DATA-1 PIC X(66).
05 CM-OS-MSG-DATA-2 PIC X(66).
05 CM-OS-MSG-DATA-3 PIC X(66).
05 CM-OS-MSG-DATA-4 PIC X(58).
01 DISP-EMPTY-CLIENT-MSG-5.
05 FILLER PIC X(02) VALUE IS SPACES.
05 CM-OS-MSG-HDR PIC X(09) VALUE IS 'OS MsgTx:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 NO-DATA PIC X(11) VALUE IS 'No Message!'.
*-----------------------------------------------------------------
* Server Message Structure
*-----------------------------------------------------------------
01 SERVER-MSG.
05 SM-MSGNO PIC S9(9) COMP.
05 SM-STATE PIC S9(9) COMP.
05 SM-SEV PIC S9(9) COMP.
05 SM-TEXT PIC X(256).
05 SM-TEXT-LEN PIC S9(9) COMP.
05 SM-SVRNAME PIC X(256).
05 SM-SVRNAME-LEN PIC S9(9) COMP.
05 SM-PROC PIC X(256).
05 SM-PROC-LEN PIC S9(9) COMP.
05 SM-LINE PIC S9(9) COMP.
05 SM-STATUS PIC S9(9) COMP.
01 DISP-SERVER-MSG-HDR.
05 SERVER-MSG-HDR PIC X(15) VALUE IS
'Server Message:'.
01 DISP-SERVER-MSG-1.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-MSG-NO-HDR PIC X(09) VALUE IS
'Message#:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-MSG-NO-DATA PIC Z(8)9.
05 SM-SEVERITY-HDR PIC X(12) VALUE IS
', Severity:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-SEVERITY-DATA PIC Z(8)9.
05 SM-STATE-HDR PIC X(12) VALUE IS
', State No:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-STATE-DATA PIC Z(8)9.
01 DISP-SERVER-MSG-2.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-LINE-NO-HDR PIC X(09) VALUE IS
'Line No:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-LINE-NO-DATA PIC Z(8)9.
05 SM-STATUS-HDR PIC X(12) VALUE IS
', Status :'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-STATUS-DATA PIC Z(8)9.
01 DISP-SERVER-MSG-3.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-SVRNAME-HDR PIC X(09) VALUE IS 'Serv Nam:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-SVRNAME-DATA PIC X(66).
05 FILLER PIC X(03) VALUE IS '...'.
01 DISP-SERVER-MSG-4.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-PROC-ID-HDR PIC X(09) VALUE IS 'Proc ID:'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-PROC-ID-DATA PIC X(66).
01 DISP-SERVER-MSG-5.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-MSG-HDR PIC X(09) VALUE IS 'Message :'.
05 FILLER PIC X(02) VALUE IS SPACES.
05 SM-MSG-DATA PIC X(66).
01 DISP-SERVER-MSG-5A.
05 SM-MSG-DATA-1 PIC X(66).
05 SM-MSG-DATA-2 PIC X(66).
05 SM-MSG-DATA-3 PIC X(66).
05 SM-MSG-DATA-4 PIC X(58).
01 DISP-SERVER-MSG-5X.
05 FILLER PIC X(13) VALUE IS SPACES.
05 SM-MSG-DATA-X PIC X(66).
PROCEDURE DIVISION.
*-----------------------------------------------------------------
* Begin program here
*-----------------------------------------------------------------
MOVE LOW-VALUES TO PARM-FIELDS DATAFMT.
MOVE 'Y' TO SW-DIAG.
EXEC CICS ASKTIME
ABSTIME(UTIME)
END-EXEC.
EXEC CICS FORMATTIME
ABSTIME(UTIME)
DATESEP('/')
MMDDYY(TMP-DATE)
TIME(TMP-TIME)
TIMESEP
END-EXEC.
MOVE
' SYBASE COBOL SAMPLE PROGRAM SYCTSAX5 SQL RESULT OUTPUT '
TO X5-HDR.
MOVE TMP-DATE TO X5-DATE-DATA.
MOVE TMP-TIME TO X5-TIME-DATA.
*-----------------------------------------------------------------
* intialize the TDS environment for a client
*-----------------------------------------------------------------
CALL 'TDINIT' USING DFHEIBLK,
GWL-RC,
CSL-CTX-HANDLE.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDINIT failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* accept request from a remote client
*-----------------------------------------------------------------
CALL 'TDACCEPT' USING GWL-TDPROC,
GWL-RC,
CSL-CTX-HANDLE,
SNA-CONNECTION-NAME,
SNA-SUBC.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDACCEPT failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* display date and time
*-----------------------------------------------------------------
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE X5-HEADER-STR TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE X5-HEADER2-STR TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
*-----------------------------------------------------------------
* determine how many parameters were sent with the current RPC
* by the remote client or server
*-----------------------------------------------------------------
CALL 'TDNUMPRM' USING GWL-TDPROC,
PF-NUM-OF-PARMS.
IF PF-NUM-OF-PARMS = 2 OR PF-NUM-OF-PARMS = 3
THEN
MOVE SPACES TO INFO-MSG-STR
ELSE
MOVE MSG-WRONG-NR-PARMS TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE SPACES TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE
'syntax is: SYX5 server-nm, user-id OR'
TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE
' SYX5 server-nm, user-id, password'
TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* retrieves parameter type, datatype, and length information
* about the 1st RPC parameter( server-name parameter )
*-----------------------------------------------------------------
MOVE 1 TO PF-PARM-ID.
CALL 'TDINFPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-DATATYPE,
PF-ACTUAL-DATA-LENGTH,
PF-MAX-DATA-LENGTH,
PF-PARM-STATUS,
PF-PARM-NAME,
PF-PARM-NAME-LENGTH,
TDS-NULL.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDINFPRM for server-name parameter failed'
TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
IF PF-DATATYPE NOT = TDSCHAR AND
PF-DATATYPE NOT = TDSVARYCHAR
THEN
MOVE 'server-name datatype must be TDSCHAR'
TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* retrieves the data from an RPC parameter sent by a remote
* client
*-----------------------------------------------------------------
MOVE LENGTH OF PF-SERVER TO PF-STRLEN.
CALL 'TDRCVPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-SERVER,
TDSCHAR,
PF-STRLEN,
PF-ACTUAL-DATA-LENGTH.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDRCVPRM for server-name parameter failed'
TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
MOVE PF-ACTUAL-DATA-LENGTH TO PF-SERVER-SIZE.
*-----------------------------------------------------------------
* retrieves parameter type, datatype, and length information
* about the 2nd RPC parameter( user-id parameter )
*-----------------------------------------------------------------
MOVE 2 TO PF-PARM-ID.
CALL 'TDINFPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-DATATYPE,
PF-ACTUAL-DATA-LENGTH,
PF-MAX-DATA-LENGTH,
PF-PARM-STATUS,
PF-PARM-NAME,
PF-PARM-NAME-LENGTH,
TDS-NULL.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDINFPGM for user-id parameter failed'
TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
IF PF-DATATYPE NOT = TDSCHAR AND
PF-DATATYPE NOT = TDSVARYCHAR
THEN
MOVE 'user-id datatype must be TDSCHAR'
TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* retrieves the data from an RPC parameter sent by a remote
* client
*-----------------------------------------------------------------
MOVE LENGTH OF PF-USER TO PF-STRLEN.
CALL 'TDRCVPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-USER,
TDSCHAR,
PF-STRLEN,
PF-ACTUAL-DATA-LENGTH.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDRCVPRM for user-id failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
MOVE PF-ACTUAL-DATA-LENGTH TO PF-USER-SIZE.
IF PF-NUM-OF-PARMS = 3
THEN
*-----------------------------------------------------------------
* retrieves parameter type, datatype, and length information
* about the 3rd RPC parameter( password parameter )
*-----------------------------------------------------------------
MOVE 3 TO PF-PARM-ID
CALL 'TDINFPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-DATATYPE,
PF-ACTUAL-DATA-LENGTH,
PF-MAX-DATA-LENGTH,
PF-PARM-STATUS,
PF-PARM-NAME,
PF-PARM-NAME-LENGTH,
TDS-NULL
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDINFPRM for server-name parameter failed'
TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF
IF PF-DATATYPE NOT = TDSCHAR AND
PF-DATATYPE NOT = TDSVARYCHAR
THEN
MOVE 'server-name datatype must be TDSCHAR'
TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
PERFORM ALL-DONE
END-IF
*-----------------------------------------------------------------
* retrieves the data from an RPC parameter sent by a remote
* client
*-----------------------------------------------------------------
MOVE LENGTH OF PF-PWD TO PF-STRLEN
CALL 'TDRCVPRM' USING GWL-TDPROC,
GWL-RC,
PF-PARM-ID,
PF-PWD,
TDSCHAR,
PF-STRLEN,
PF-ACTUAL-DATA-LENGTH
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDRCVPRM for password parameter failed'
TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF
MOVE PF-ACTUAL-DATA-LENGTH TO PF-PWD-SIZE
ELSE
MOVE SPACES TO PF-PWD
MOVE 0 TO PF-PWD-SIZE
END-IF.
*-----------------------------------------------------------------
* display server and user-id heading
*-----------------------------------------------------------------
MOVE PF-SERVER TO SERVER-DATA.
MOVE PF-USER TO USER-DATA.
MOVE DISP-SERVER TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
*-----------------------------------------------------------------
* describe the 1st column in a result row and the mainframe
* server program variable where it is stored
*-----------------------------------------------------------------
MOVE 1 TO DF-COLUMN-NUMBER.
MOVE TDSVARYCHAR TO DF-HOST-VARIABLE-TYPE.
MOVE LENGTH OF CF-COL-FIRSTNME TO DF-HOST-VARIABLE-MAXLEN.
MOVE TDS-ZERO TO DF-NULL-INDICATOR-VAR.
MOVE TDS-FALSE TO DF-NULLS-ALLOWED.
MOVE TDSVARYCHAR TO DF-COLUMN-TYPE.
MOVE LENGTH OF CF-COL-FIRSTNME TO DF-COLUMN-MAXLEN.
MOVE 'FIRST NAME' TO DF-COLUMN-NAME.
MOVE 10 TO DF-COLUMN-NAME-LEN.
CALL 'TDESCRIB' USING GWL-TDPROC,
GWL-RC,
DF-COLUMN-NUMBER,
DF-HOST-VARIABLE-TYPE,
DF-HOST-VARIABLE-MAXLEN,
CF-COL-FIRSTNME,
DF-NULL-INDICATOR-VAR,
DF-NULLS-ALLOWED,
DF-COLUMN-TYPE,
DF-COLUMN-MAXLEN,
DF-COLUMN-NAME,
DF-COLUMN-NAME-LEN.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDESCRIB failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
PERFORM OC-INIT.
PERFORM OC-CONNECT.
PERFORM OC-SEND-LANG.
PERFORM OC-PROCESS-RESULTS.
PERFORM OC-ALL-DONE.
*========================================================
*== ==
*== Subroutine to send a results completion indication ==
*== to the client, free up a previously allocated ==
*== GWL_TDPROC structure, and return back to CICS ==
*== ==
*========================================================
ALL-DONE.
*-----------------------------------------------------------------
* send a results completion indication to the client
*-----------------------------------------------------------------
CALL 'TDSNDDON' USING GWL-TDPROC,
GWL-RC,
TDS-DONE-FINAL,
TDS-NULL,
TDS-ZERO,
TDS-ENDRPC.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDSNDDON failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
END-IF.
*-----------------------------------------------------------------
* free up a previously allocated GWL_TDPROC structure after
* returning results to a client
*-----------------------------------------------------------------
CALL 'TDFREE' USING GWL-TDPROC,
GWL-RC.
IF GWL-RC NOT = TDS-OK
THEN
MOVE 'TDFREE failed' TO ERROR-TEXT
MOVE GWL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
END-IF.
*-----------------------------------------------------------------
* return back to CICS
*-----------------------------------------------------------------
EXEC CICS RETURN END-EXEC.
*========================================================
*== ==
*== Subroutine to initialize the Client-Library ==
*== ==
*========================================================
OC-INIT.
*-----------------------------------------------------------
* initialize the Client-Library
*-----------------------------------------------------------
CALL 'CTBINIT' USING CSL-CTX-HANDLE,
CSL-RC,
CS-VERSION-46.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBINIT failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*========================================================
*== ==
*== Subroutine to allocate connect handler, alter ==
*== properties for user-id and password, set up ==
*== retrieval of all Open Client messages, and open ==
*== connection to the server ==
*== ==
*========================================================
OC-CONNECT.
*-----------------------------------------------------------
* allocate a connection to the server
*----------------------------------------------------------
CALL 'CTBCONAL' USING CSL-CTX-HANDLE,
CSL-RC,
CSL-CON-HANDLE.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCONAL failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------
*alter properties of the connection
* ----------------------------------------------------------
CALL 'CTBCONPR' USING CSL-CON-HANDLE,
CSL-RC,
CS-SET,
CS-USERNAME,
PF-USER,
PF-USER-SIZE,
CS-FALSE,
CS-UNUSED.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCONPR for user-id failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
CALL 'CTBCONPR' USING CSL-CON-HANDLE,
CSL-RC,
CS-SET,
CS-PASSWORD,
PF-PWD,
PF-PWD-SIZE,
CS-FALSE,
CS-UNUSED.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCONPR for password failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*------------------------------------------------------------*
* setup retrieval of All Messages
*------------------------------------------------------------*
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-INIT,
CS-ALLMSG-TYPE,
CS-UNUSED,
CS-UNUSED.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBDIAG CS-INIT failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*------------------------------------------------------------*
* set the upper limit of number of messages
*------------------------------------------------------------*
MOVE 5 TO PF-MSGLIMIT.
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-MSGLIMIT,
CS-ALLMSG-TYPE,
CS-UNUSED,
PF-MSGLIMIT.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBDIAG CS-MSGLIMIT failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*------------------------------------------------------------*
* open connection to the server
*------------------------------------------------------------*
CALL 'CTBCONNE' USING CSL-CON-HANDLE,
CSL-RC,
PF-SERVER,
PF-SERVER-SIZE,
CS-FALSE.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCONNE failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*========================================================
*== ==
*== Subroutine to allocate command handler, prepare ==
*== and send the language request ==
*== ==
*========================================================
OC-SEND-LANG.
*-----------------------------------------------------------
* allocate a command handle
*----------------------------------------------------------
CALL 'CTBCMDAL' USING CSL-CON-HANDLE,
CSL-RC,
CSL-CMD-HANDLE.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCMDAL failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------
* prepare the language request
*-----------------------------------------------------------
MOVE LENGTH OF LF-LANG TO PF-STRLEN.
CALL 'CTBCOMMA' USING CSL-CMD-HANDLE,
CSL-RC,
CS-LANG-CMD,
LF-LANG,
PF-STRLEN,
CS-UNUSED.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCOMMA failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------
* send the language request
*----------------------------------------------------------
CALL 'CTBSEND' USING CSL-CMD-HANDLE,
CSL-RC.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBSEND failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*========================================================
*== ==
*== Subroutine to process the result ==
*== ==
*========================================================
OC-PROCESS-RESULTS.
PERFORM RESULTS-PROCESSING UNTIL NO-MORE-RESULTS.
*========================================================
*== ==
*== Subroutine to set up the results data ==
*== ==
*========================================================
RESULTS-PROCESSING.
CALL 'CTBRESUL' USING CSL-CMD-HANDLE
CSL-RC
RF-TYPE.
EVALUATE CSL-RC
WHEN CS-SUCCEED
EVALUATE RF-TYPE
WHEN CS-ROW-RESULT
PERFORM ROW-RESULT-PROCESSING
MOVE 'Y' TO SW-FETCH
PERFORM FETCH-PROCESSING UNTIL NO-MORE-ROWS
WHEN CS-STATUS-RESULT
PERFORM STATUS-PROCESSING
WHEN CS-CMD-FAIL
MOVE 'RESULTS-PROCESSING CMD-FAIL' TO MSGSTR
PERFORM ERROR-OUT
MOVE 'bad user-id or password' TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE SPACES TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
WHEN CS-CMD-DONE
MOVE 'RESULTS-PROCESSING CMD-DONE' TO INFO-MSG-STR
MOVE RF-TYPE TO ERROR-RC
WHEN OTHER
MOVE 'RESULTS-PROCESSING unknown return code'
TO MSGSTR
PERFORM ERROR-OUT
END-EVALUATE
WHEN CS-FAIL
MOVE 'N' TO SW-RESULTS
MOVE 'CTBRESULTS failed' TO MSGSTR
PERFORM ERROR-OUT
WHEN CS-END-RESULTS
MOVE 'N' TO SW-RESULTS
WHEN OTHER
MOVE 'N' TO SW-RESULTS
MOVE 'CTBRESULTS failed' TO MSGSTR
PERFORM ERROR-OUT
END-EVALUATE.
*========================================================
*== ==
*== Subroutine to process row result and bind ==
*== ==
*========================================================
ROW-RESULT-PROCESSING.
CALL 'CTBRESUL' USING CSL-CMD-HANDLE
CSL-RC
RF-TYPE.
MOVE CS-VARCHAR-TYPE TO DF-DATATYPE.
MOVE CS-FMT-UNUSED TO DF-FORMAT.
MOVE LENGTH OF CF-COL-FIRSTNME TO DF-MAXLENGTH.
MOVE 1 TO DF-COUNT.
*----------------------------------------------------------
* bind the first column
*----------------------------------------------------------
MOVE 1 TO CF-COL-NUMBER.
CALL 'CTBBIND' USING CSL-CMD-HANDLE,
CSL-RC,
CF-COL-NUMBER,
DATAFMT,
CF-COL-FIRSTNME,
CF-COL-OUTLEN,
CS-PARAM-NOTNULL,
CF-COL-INDICATOR,
CS-PARAM-NULL.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBBIND first name failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*========================================================
*== ==
*== Subroutine to fetch the result ==
*== ==
*========================================================
FETCH-PROCESSING.
CALL 'CTBFETCH' USING CSL-CMD-HANDLE,
CSL-RC,
CS-UNUSED,
CS-UNUSED,
CS-UNUSED,
FF-ROWS-READ.
EVALUATE CSL-RC
WHEN CS-SUCCEED
MOVE 'Y' TO SW-FETCH
COMPUTE FF-ROW-NUM = FF-ROW-NUM + 1
*----------------------------------------------------------
* send a row of data back to the requesting client
*----------------------------------------------------------
CALL 'TDSNDROW' USING GWL-TDPROC,
GWL-RC
MOVE SPACES TO CF-COL-FIRSTNME
IF GWL-RC NOT = TDS-OK
THEN
MOVE MSG-CANCELED TO INFO-MSG-STR
MOVE CSL-RC TO ERROR-RC
PERFORM SEND-INFO-MESSAGE
END-IF
WHEN CS-END-DATA
MOVE 'N' TO SW-FETCH
MOVE SPACES TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE MSG-END-MSG TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
MOVE SPACES TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
WHEN CS-FAIL
MOVE 'N' TO SW-FETCH
MOVE 'FETCH-PROCESSING return CS-FAIL ' TO MSGSTR
PERFORM ERROR-OUT
WHEN CS-ROW-FAIL
MOVE 'N' TO SW-FETCH
MOVE 'FETCH-PROCESSING retuen CS-ROW-FAIL'
TO MSGSTR
PERFORM ERROR-OUT
WHEN CS-CANCELLED
MOVE 'N' TO SW-FETCH
MOVE MSG-CANCELED TO MSGSTR
PERFORM ERROR-OUT
WHEN OTHER
MOVE 'N' TO SW-FETCH
MOVE 'CTBFETCH UNEXPECTED RETURN CODE'
TO MSGSTR
PERFORM ERROR-OUT
END-EVALUATE.
*========================================================
*== ==
*== dummy routine ==
*== ==
*========================================================
STATUS-PROCESSING.
*STATUS-PROCESSING-EXIT.
EXIT.
*========================================================
*== ==
*== Subroutine to drop the command handler, to close ==
*== the server connection, to drop the connection ==
*== handler and exit ==
*== ==
*========================================================
OC-ALL-DONE.
CALL 'CTBCMDDR' USING CSL-CMD-HANDLE,
CSL-RC.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCMDDR failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
CALL 'CTBCLOSE' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCLOSE failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
CALL 'CTBCONDR' USING CSL-CON-HANDLE,
CSL-RC.
IF CSL-RC NOT = CS-SUCCEED
THEN
MOVE 'CTBCCONDR failed' TO MSGSTR
PERFORM ERROR-OUT
PERFORM ALL-DONE
END-IF.
*========================================================
*== ==
*== Subroutine to send an error message to the client ==
*== ==
*========================================================
SEND-ERROR-MESSAGE.
MOVE TDS-ERROR-MSG TO SF-MESSAGE-TYPE.
MOVE 0 TO SF-MESSAGE-NUMBER.
MOVE 10 TO SF-SEVERITY.
MOVE 0 TO SF-ERROR-STATE.
MOVE 0 TO SF-LINE-ID.
MOVE LENGTH OF SF-TRANSACTION-ID TO SF-TRANSACTION-ID-LEN.
MOVE ERROR-MSG-STR TO SF-MESSAGE-TEXT.
MOVE LENGTH OF SF-MESSAGE-TEXT TO SF-MESSAGE-LENGTH.
CALL 'TDSNDMSG' USING GWL-TDPROC,
GWL-RC,
SF-MESSAGE-TYPE,
SF-MESSAGE-NUMBER,
SF-SEVERITY,
SF-ERROR-STATE,
SF-LINE-ID,
SF-TRANSACTION-ID,
SF-TRANSACTION-ID-LEN,
SF-MESSAGE-TEXT,
SF-MESSAGE-LENGTH.
*========================================================
*== ==
*== Subroutine to send an informational message to the ==
*== client ==
*== ==
*========================================================
SEND-INFO-MESSAGE.
MOVE TDS-INFO-MSG TO SF-MESSAGE-TYPE.
MOVE 0 TO SF-MESSAGE-NUMBER.
MOVE 0 TO SF-SEVERITY.
MOVE 0 TO SF-ERROR-STATE.
MOVE 0 TO SF-LINE-ID.
MOVE LENGTH OF SF-TRANSACTION-ID TO SF-TRANSACTION-ID-LEN.
MOVE INFO-MSG-STR TO SF-MESSAGE-TEXT.
MOVE LENGTH OF SF-MESSAGE-TEXT TO SF-MESSAGE-LENGTH.
CALL 'TDSNDMSG' USING GWL-TDPROC,
GWL-RC,
SF-MESSAGE-TYPE,
SF-MESSAGE-NUMBER,
SF-SEVERITY,
SF-ERROR-STATE,
SF-LINE-ID,
SF-TRANSACTION-ID,
SF-TRANSACTION-ID-LEN,
SF-MESSAGE-TEXT,
SF-MESSAGE-LENGTH.
*========================================================
*== ==
*== Subroutine to print output messages. ==
*== ==
*========================================================
ERROR-OUT.
IF DIAG-MSGS-INITIALIZED
THEN
PERFORM GET-DIAG-MESSAGES
END-IF.
*-----------------------------------------------------------------
* Display The Message
*-----------------------------------------------------------------
MOVE CSL-RC TO SAMP-RC.
MOVE RF-TYPE TO REST-TYPE.
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-MSG TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE SPACES TO MSGSTR.
MOVE ZERO TO SAMP-RC.
MOVE ZERO TO REST-TYPE.
PRINT-MSG-EXIT.
EXIT.
*====================================================
*== ==
*== Subroutine to retrieve any diagnostic messages ==
*== ==
*====================================================
GET-DIAG-MESSAGES.
************************************
* Disable calls to this subroutine *
************************************
MOVE 'N' TO SW-DIAG.
******************************
* First, get client messages *
******************************
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-STATUS,
CS-CLIENTMSG-TYPE,
CS-UNUSED,
DG-NUM-OF-MSGS.
IF CSL-RC NOT EQUAL CS-SUCCEED
THEN
STRING 'CTBDIAG CS-STATUS CS-CLIENTMSG-TYP failed'
DELIMITED BY SIZE INTO ERROR-TEXT
MOVE CSL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
ELSE
IF DG-NUM-OF-MSGS > 0
THEN
PERFORM RETRIEVE-CLIENT-MSGS
VARYING I FROM 1 BY 1
UNTIL I IS GREATER THAN DG-NUM-OF-MSGS
END-IF
END-IF.
*****************************
* Then, get server messages *
*****************************
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-STATUS,
CS-SERVERMSG-TYPE,
CS-UNUSED,
DG-NUM-OF-MSGS.
IF CSL-RC NOT EQUAL CS-SUCCEED
THEN
STRING 'CTBDIAG CS-STATUS CS-SERVERMSG-TYP fail'
DELIMITED BY SIZE INTO ERROR-TEXT
MOVE CSL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
ELSE
IF DG-NUM-OF-MSGS > 0
THEN
PERFORM RETRIEVE-SERVER-MSGS
VARYING I FROM 1 BY 1
UNTIL I IS GREATER THAN DG-NUM-OF-MSGS
END-IF
END-IF.
GET-DIAG-MESSAGES-EXIT.
EXIT.
*============================================================
*== ==
*== Subroutine to retrieve diagnostic messages from client ==
*== ==
*============================================================
RETRIEVE-CLIENT-MSGS.
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-GET,
CS-CLIENTMSG-TYPE,
DG-MSGNO,
CLIENT-MSG.
IF CSL-RC NOT EQUAL CS-SUCCEED
THEN
STRING 'CTBDIAG CS-GET CS-CLIENTMSG-TYPE failed'
DELIMITED BY SIZE INTO ERROR-TEXT
MOVE CSL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
*-----------------------------------------------------------------
* display message text
*-----------------------------------------------------------------
MOVE DISP-CLIENT-MSG-HDR TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE SPACES TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE CM-SEVERITY TO CM-SEVERITY-DATA.
MOVE CM-STATUS TO CM-STATUS-DATA.
MOVE DISP-CLIENT-MSG-1 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE CM-MSGNO TO CM-OC-MSGNO-DATA.
MOVE DISP-CLIENT-MSG-2 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
IF CM-MSGNO NOT EQUAL 0
THEN
MOVE SPACES TO CM-OC-MSG-DATA
MOVE CM-TEXT TO CM-OC-MSG-DATA
MOVE CM-TEXT TO DISP-CLIENT-MSG-3A
MOVE DISP-CLIENT-MSG-3 TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-TEXT-LEN > 66
THEN
MOVE CM-OC-MSG-DATA-2 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-TEXT-LEN > 132
THEN
MOVE SPACES TO CM-OC-MSG-DATA-X
MOVE CM-OC-MSG-DATA-3 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-TEXT-LEN > 198
THEN
MOVE SPACES TO CM-OC-MSG-DATA-X
MOVE CM-OC-MSG-DATA-4 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
END-IF
END-IF
END-IF
ELSE
MOVE DISP-EMPTY-CLIENT-MSG-3 TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
END-IF.
MOVE CM-OS-MSGNO TO CM-OS-MSGNO-DATA.
MOVE DISP-CLIENT-MSG-4 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
IF CM-OS-MSGNO NOT EQUAL 0
THEN
MOVE SPACES TO CM-OS-MSG-DATA
MOVE CM-OS-MSGTXT TO CM-OS-MSG-DATA
MOVE SPACES TO DISP-CLIENT-MSG-5A
MOVE CM-OS-MSGTXT TO DISP-CLIENT-MSG-5A
MOVE DISP-CLIENT-MSG-5 TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-OS-MSGTEXT-LEN > 66
THEN
MOVE SPACES TO CM-OC-MSG-DATA-X
MOVE CM-OS-MSG-DATA-2 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-OS-MSGTEXT-LEN > 132
THEN
MOVE SPACES TO CM-OC-MSG-DATA-X
MOVE CM-OS-MSG-DATA-3 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF CM-OS-MSGTEXT-LEN > 198
THEN
MOVE SPACES TO CM-OC-MSG-DATA-X
MOVE CM-OS-MSG-DATA-4 TO CM-OC-MSG-DATA-X
MOVE DISP-CLIENT-MSG-3B TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
END-IF
END-IF
END-IF
ELSE
MOVE DISP-EMPTY-CLIENT-MSG-5 TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
END-IF.
RETRIEVE-CLIENT-MSGS-EXIT.
EXIT.
*============================================================
*== ==
*== Subroutine to retrieve diagnostic messages from server ==
*== ==
*============================================================
RETRIEVE-SERVER-MSGS.
CALL 'CTBDIAG' USING CSL-CON-HANDLE,
CSL-RC,
CS-UNUSED,
CS-GET,
CS-SERVERMSG-TYPE,
DG-MSGNO,
SERVER-MSG.
IF CSL-RC NOT EQUAL CS-SUCCEED
THEN
STRING 'CTBDIAG CS-GET CS-SERVERMSG-TYPE failed'
DELIMITED BY SIZE INTO ERROR-TEXT
MOVE CSL-RC TO ERROR-RC
PERFORM SEND-ERROR-MESSAGE
PERFORM ALL-DONE
END-IF.
*----------------------------------------------------------------
* display message text
*----------------------------------------------------------------
MOVE SM-MSGNO TO SM-MSG-NO-DATA.
MOVE SM-SEV TO SM-SEVERITY-DATA.
MOVE SM-STATE TO SM-STATE-DATA.
MOVE SM-LINE TO SM-LINE-NO-DATA.
MOVE SM-STATUS TO SM-STATUS-DATA.
MOVE SPACES TO SM-SVRNAME-DATA.
MOVE SM-SVRNAME TO SM-SVRNAME-DATA.
MOVE SPACES TO SM-PROC-ID-DATA.
MOVE SM-PROC TO SM-PROC-ID-DATA.
MOVE SPACES TO SM-MSG-DATA.
MOVE SM-TEXT TO SM-MSG-DATA.
MOVE SPACES TO DISP-SERVER-MSG-5A.
MOVE SM-TEXT TO DISP-SERVER-MSG-5A.
MOVE DISP-SERVER-MSG-HDR TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-SERVER-MSG-1 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-SERVER-MSG-2 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-SERVER-MSG-3 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-SERVER-MSG-4 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
MOVE DISP-SERVER-MSG-5 TO INFO-MSG-STR.
PERFORM SEND-INFO-MESSAGE.
IF SM-TEXT-LEN > 66
THEN
MOVE SPACES TO SM-MSG-DATA-X
MOVE SM-MSG-DATA-2 TO SM-MSG-DATA-X
MOVE DISP-SERVER-MSG-5X TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF SM-TEXT-LEN > 132
THEN
MOVE SPACES TO SM-MSG-DATA-X
MOVE SM-MSG-DATA-3 TO SM-MSG-DATA-X
MOVE DISP-SERVER-MSG-5X TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
IF SM-TEXT-LEN > 198
THEN
MOVE SPACES TO SM-MSG-DATA-X
MOVE SM-MSG-DATA-4 TO SM-MSG-DATA-X
MOVE DISP-SERVER-MSG-5X TO INFO-MSG-STR
PERFORM SEND-INFO-MESSAGE
END-IF
END-IF
END-IF.
RETRIEVE-SERVER-MSGS-EXIT.
EXIT.