IDENTIFICATION DIVISION.
*-----------------------
PROGRAM-ID. SYIXSAM2.
****** SYIXSAM2 - RPC REQUEST APPLICATION - COBOL2 - IMS ********
*
* TRANID: SYIXSAM2
* PROGRAM: SYIXSAM2
* PLAN NAME: N/A
* FILES: N/A
* TABLES: N/A
*
* This program is an example of a long-running transaction.
* It may also be used to stress test IMS Open Server. The
* program is executed via isql. The first parameter is
* a one byte character that is used to set up a reply
* row. The second parameter is the number of rows to
* return to the client.
*
* To execute from isql type:
*
* >isql -Usa -Sservername
*
* >exec SYIXSAM2 X, 100
*
* >go
*
* To end SYIXSAM2 type:
*
* >exec SYIXSAM2 X,0
*
* >go
*
* The SYIXSAM2 tran returns a 80 byte row containing the name
* client that initiated the RPC and a 71 byte pattern.
*
* Server Library calls:
*
* TDACCEPT accept request from client
* TDESCRIB describe a column
* TDFREE free TDPROC structure
* TDGETREQ get next set of parms
* TDINIT establish environment
* TDRCVPRM retrieve rpc parameter from client
* TDSNDDON send results-completion to client
* TDSNDMSG send message to client
* TDSNDROW send row to client
* TDSTATUS get status information
* TDSETPT pass type of program to gwlib
* TDTERM clean up control blocks
* CHANGE ACTIVITY:
* 9/93 - created for IMS MSP
**************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
**************************************************************
WORKING-STORAGE SECTION.
**************************************************************
*-------------------------------------------------------------
* SERVER LIBRARY COBOL COPY BOOK
*-------------------------------------------------------------
COPY SYGWCOB.
*-------------------------------------------------------------
* WORK AREAS
*-------------------------------------------------------------
01 GW-LIB-MISC-FIELDS.
05 GWL-SPA-PTR POINTER.
05 GWL-PROC POINTER.
05 GWL-INIT-HANDLE POINTER.
05 GWL-RC PIC S9(9) COMP VALUE +0.
05 GWL-REQ-TYPE PIC S9(9) COMP VALUE +0.
05 GWL-WAIT-OPTION PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-NR PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-DONE PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-COUNT PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-COMM PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-RETURN-CODE PIC S9(9) COMP VALUE +0.
05 GWL-STATUS-SUBCODE PIC S9(9) COMP VALUE +0.
05 GWL-PROG-TYPE PIC X(04) VALUE ‘MPP ‘.
05 GWL-TRAN-NAME PIC X(30) VALUE SPACES.
01 CPIC-RC PIC S9(9) COMP VALUE +0.
01 PARM-FIELDS.
05 PARM-L PIC S9(9) COMP VALUE +0.
05 PARM-ID1 PIC S9(9) COMP VALUE 1.
05 PARM-ID2 PIC S9(9) COMP VALUE 2.
05 PARM-PATTERN PIC X(1).
05 PARM-NR-ROWS PIC S9(9) COMP.
01 SNA-FIELDS.
05 SNA-SUBC PIC S9(9) COMP VALUE +0.
05 SNA-CONNECTION-NAME PIC X(8) VALUE SPACES.
01 COLUMN-NAME-FIELDS.
05 BANANA PIC X(06) VALUE ‘BANANA’.
01 DESCRIBE-BIND-FIELDS.
05 DB-HOST-TYPE PIC S9(9) COMP VALUE +0.
05 DB-CLIENT-TYPE PIC S9(9) COMP VALUE +0.
05 DB-NULL-INDICATOR PIC S9(4) COMP VALUE 0.
01 COUNTER-FIELDS.
05 CTR-COLUMN PIC S9(9) COMP VALUE 1.
05 CTR-ROWS PIC S9(9) COMP VALUE 0.
01 WROW.
05 WROW-LU PIC X(09).
05 WROW-PATTERN OCCURS 71 TIMES PIC X(01).
01 WORK-FIELDS.
05 WRKLEN1 PIC S9(9) COMP VALUE +0.
05 WRKLEN2 PIC S9(9) COMP VALUE +0.
05 WRK-DONE-STATUS PIC S9(9) COMP VALUE +0.
05 I PIC S9(9) COMP VALUE +0.
01 MESSAGE-FIELDS.
05 MSG-TYPE PIC S9(9) COMP VALUE +0.
05 MSG-SEVERITY PIC S9(9) COMP VALUE 11.
05 MSG-NR PIC S9(9) COMP VALUE 2.
05 MSG-RPC PIC X(8) VALUE ‘SYIXSAM2’.
05 MSG-RPC-L PIC S9(9) COMP VALUE +0.
05 MSG-TEXT PIC X(100).
05 MSG-TEXT-L PIC S9(9) COMP VALUE +0.
01 CANCEL-RECV-MSG.
05 FILLER PIC X(40) VALUE ‘CANCEL RECEIVED’.
01 CALL-ERROR-MESSAGE.
05 FILLER PIC X(5) VALUE SPACES.
05 CALL-PROG PIC X(10) VALUE ‘SYIXSAM2’.
05 FILLER PIC X(5) VALUE SPACES.
05 CALL-ERROR PIC X(10) VALUE SPACES.
05 FILLER PIC X(5) VALUE ‘ RC= ‘.
05 CALL-ERROR-RC PIC -9999.
01 SWITCHES.
05 ALL-DONE-SW PIC X VALUE ‘N’.
88 NOT-ALL-DONE VALUE ‘N’.
88 ALL-DONE VALUE ‘Y’.
05 SEND-DONE-SW PIC X VALUE ‘Y’.
88 SEND-DONE-ERROR VALUE ‘N’.
88 SEND-DONE-OK VALUE ‘Y’.
01 APSB PIC X(04) VALUE ‘APSB’.
01 DPSB PIC X(04) VALUE ‘DPSB’.
01 AIB.
05 AIBID PIC X(08).
05 AIBLEN PIC S9(9) COMP.
05 AIBSFUNC PIC X(08).
05 AIBRSNM1 PIC X(08).
05 FILLER PIC X(16).
05 AIBOALEN PIC S9(9) COMP.
05 AIBOAUSE PIC S9(9) COMP.
05 FILLER PIC X(12).
05 AIBRETRN PIC S9(9) COMP.
05 AIBREASN PIC S9(9) COMP.
05 FILLER PIC X(04).
05 AIBRSA1 PIC S9(9) COMP.
05 FILLER REDEFINES AIBRSA1.
10 AIBPTR POINTER.
05 FILLER PIC X(44).
LINKAGE SECTION.
01 PCB-ADDRESSES.
05 PCB-ADDRESS-LIST USAGE IS POINTER OCCURS 3 TIMES.
01 IO-PCB.
05 LTERM-NAME PIC X(8).
05 TERM-RESERVE PIC XX.
05 TERM-STATSUS PIC XX.
05 TERM-PREFIX.
15 FILLER PIC X.
15 JULIAN-DATE PIC S9(5) COMP-3.
15 TIME-O-DAY PIC S9(7) COMP-3.
15 FILLER PIC XXXX.
05 MODNAME PIC X(08).
**************************************************************
PROCEDURE DIVISION.
**************************************************************
*---------------------------------------------+---------------
INITIALIZE-PROGRAM.
*-------------------------------------------------------------
PERFORM ALLOC-AIB.
* -----------------------------------------------------------
* Establish Open Server environment
* ------------------------------------------------------------
CALL ‘TDINIT’ USING IO-PCB, GWL-RC, GWL-INIT-HANDLE.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDINIT’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
* ---------------------------------------------------------
* Set program type
* ---------------------------------------------------------
MOVE ‘EXPL’ to GWL-PROG-TYPE.
CALL ‘TDSETPT’ USING GWL-INIT-HANDLE, GWL-RC, GWL-PROG-TYPE
GWL-SPA-PTR, TDS-NULL, TDS-NULL.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDSETPT’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
* ---------------------------------------------------------
* accept client request
* ---------------------------------------------------------
CALL ‘TDACCEPT’ USING GWL-PROC, GWL-RC, GWL-INIT-HANDLE,
SNA-CONNECTION-NAME, SNA-SUBC.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDACCEPT’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
PERFORM READ-IN-USER-PARMS THRU READ-IN-EXIT
UNTIL (GWL-RC NOT EQUAL TO ZEROES).
GOBACK.
* ------------------------------------------------------------
READ-IN-USER-PARMS.
*-------------------------------------------------------------
* INITIALIZATION
*-------------------------------------------------------------
MOVE ‘Y’ TO SEND-DONE-SW.
MOVE ‘N’ TO ALL-DONE-SW.
MOVE SPACES TO CALL-ERROR.
MOVE ZEROES TO CALL-ERROR-RC CTR-ROWS.
MOVE 1 TO CTR-COLUMN.
*-------------------------------------------------------------
* GET PARM 1 - CHARACTER TO USE IN PATTERN
*-------------------------------------------------------------
MOVE LENGTH OF PARM-PATTERN TO WRKLEN1.
CALL ‘TDRCVPRM’ USING GWL-PROC, GWL-RC,
PARM-ID1,
PARM-PATTERN,
TDSCHAR,
WRKLEN1,
PARM-L.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDRCVPRM-1’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
MOVE BANANA TO WROW-LU.
PERFORM SET-UP-ROW-PATTERN
VARYING I FROM 1 BY 1
UNTIL I > 71.
*-------------------------------------------------------------
* GET PARM 2 - NUMBER OF ROWS TO SEND TO CLIENT
*-------------------------------------------------------------
MOVE LENGTH OF PARM-NR-ROWS TO WRKLEN1.
CALL ‘TDRCVPRM’ USING GWL-PROC, GWL-RC,
PARM-ID2,
PARM-NR-ROWS,
TDSINT4,
WRKLEN1,
PARM-L.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDRCVPRM-2’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
IF PARM-NR-ROWS = ZEROES THEN
GO TO SEND-DONE.
*-------------------------------------------------------------
* SETUP REPLY
*-------------------------------------------------------------
MOVE TDSCHAR TO DB-HOST-TYPE.
MOVE TDSCHAR TO DB-CLIENT-TYPE.
MOVE LENGTH OF WROW TO WRKLEN1.
MOVE LENGTH OF BANANA TO WRKLEN2.
CALL ‘TDESCRIB’ USING GWL-PROC, GWL-RC,
CTR-COLUMN,
DB-HOST-TYPE,
WRKLEN1,
WROW,
DB-NULL-INDICATOR,
TDS-FALSE,
DB-CLIENT-TYPE,
WRKLEN1,
BANANA,
WRKLEN2.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDESCRIB’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
*-------------------------------------------------------------
* SEND ROWS TO CLIENT
*-------------------------------------------------------------
MOVE ZEROES TO CTR-ROWS.
IF PARM-NR-ROWS = ZEROES THEN
MOVE ‘Y’ TO ALL-DONE-SW
ELSE
PERFORM SEND-ROWS
UNTIL ALL-DONE OR CTR-ROWS >= PARM-NR-ROWS.
IF SEND-DONE-OK
MOVE TDS-DONE-COUNT TO WRK-DONE-STATUS
ELSE
MOVE TDS-DONE-ERROR TO WRK-DONE-STATUS
MOVE ZERO TO CTR-ROWS
END-IF.
SEND-DONE.
IF PARM-NR-ROWS = ZEROES THEN
MOVE TDS-ENDRPC TO GWL-SEND-DONE
ELSE
MOVE TDS-ENDREPLY TO GWL-SEND-DONE.
*-------------------------------------------------------------
* ISSUE SEND DONE TO CLIENT
*-------------------------------------------------------------
CALL ‘TDSNDDON’ USING GWL-PROC, GWL-RC,
WRK-DONE-STATUS,
CTR-ROWS,
TDS-ZERO,
GWL-SEND-DONE.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE ‘TDSNDDON’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-IF.
IF PARM-NR-ROWS = ZEROES THEN
PERFORM FREE-ALL-STORAGE
GOBACK.
* ----------------------------------------------------------
* GET NEXT CLIENT REQUEST
* ----------------------------------------------------------
MOVE TDS-TRUE TO GWL-WAIT-OPTION.
MOVE ZEROES TO GWL-REQ-TYPE.
MOVE SPACES TO GWL-TRAN-NAME.
CALL ‘TDGETREQ’ USING GWL-PROC, GWL-RC, GWL-WAIT-OPTION,
GWL-REQ-TYPE, GWL-TRAN-NAME.
EVALUATE GWL-RC
WHEN ZEROES
GO TO READ-IN-USER-PARMS
WHEN TDS-RESULTS-COMPLETE
PERFORM FREE-ALL-STORAGE
WHEN TDS-CONNECTION-TERMINATED
PERFORM FREE-ALL-STORAGE
WHEN TDS-CONNECTION-FAILED
PERFORM FREE-ALL-STORAGE
WHEN OTHER
MOVE ‘TDGETREQ’ TO CALL-ERROR
PERFORM DISPLAY-CALL-ERROR
END-EVALUATE.
GOBACK.
READ-IN-EXIT.
EXIT.
SET-UP-ROW-PATTERN.
MOVE PARM-PATTERN TO WROW-PATTERN (I).
SET-UP-ROW-PATTERN-EXIT.
EXIT.
*-------------------------------------------------------------
SEND-ROWS.
*-------------------------------------------------------------
CALL ‘TDSNDROW’ USING GWL-PROC, GWL-RC
EVALUATE GWL-RC
WHEN ZEROES
ADD 1 TO CTR-ROWS
WHEN TDS-CANCEL-RECEIVED
MOVE ‘Y’ TO ALL-DONE-SW
MOVE CANCEL-RECV-MSG to MSG-TEXT
MOVE LENGTH OF CANCEL-RECV-MSG TO MSG-TEXT-L
PERFORM SEND-MESSAGE
WHEN OTHER
PERFORM DISPLAY-CALL-ERROR
MOVE ‘Y’ TO SEND-DONE-SW
MOVE ‘Y’ TO ALL-DONE-SW
END-EVALUATE.
SEND-ROWS-EXIT.
EXIT.
*-------------------------------------------------------------
DISPLAY-CALL-ERROR.
*-------------------------------------------------------------
MOVE GWL-RC TO CALL-ERROR-RC.
MOVE CALL-ERROR-MESSAGE TO MSG-TEXT.
MOVE LENGTH OF CALL-ERROR-MESSAGE TO MSG-TEXT-L.
PERFORM SEND-MESSAGE.
DISPLAY CALL-ERROR-MESSAGE.
PERFORM FREE-ALL-STORAGE.
GOBACK.
DISPLAY-CALL-ERROR-EXIT.
EXIT.
*-------------------------------------------------------------
FREE-ALL-STORAGE.
*-------------------------------------------------------------
CALL ‘TDFREE’ USING GWL-PROC, GWL-RC
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE GWL-RC TO CALL-ERROR-RC
MOVE ‘TDFREE’ TO CALL-ERROR
DISPLAY CALL-ERROR-MESSAGE
END-IF.
CALL ‘TDTERM’ USING GWL-INIT-HANDLE, GWL-RC.
IF GWL-RC NOT EQUAL TO ZEROES THEN
MOVE GWL-RC TO CALL-ERROR-RC
MOVE ‘TDTERM’ TO CALL-ERROR
DISPLAY CALL-ERROR-MESSAGE
END-IF.
PERFORM DEALLOC-AIB.
FREE-ALL-STORAGE-EXIT.
EXIT.
*-----------------------------------------------------------------
SEND-ERROR-MESSAGE.
*-----------------------------------------------------------------
MOVE 'N' TO SEND-DONE-SW.
MOVE TDS-ERROR-MSG TO MSG-TYPE.
MOVE LENGTH OF MSG-RPC TO MSG-RPC-L.
* Ensure we're in right state to send a message
CALL 'TDSTATUS' USING GWL-PROC, GWL-RC,
GWL-STATUS-NR,
GWL-STATUS-DONE,
GWL-STATUS-COUNT,
GWL-STATUS-COMM,
GWL-STATUS-RETURN-CODE,
GWL-STATUS-SUBCODE.
IF (GWL-RC = TDS-OK AND
GWL-STATUS-COMM = TDS-RECEIVE) THEN
CALL 'TDSNDMSG' USING GWL-PROC, GWL-RC,
MSG-TYPE, MSG-NR,
MSG-SEVERITY,
TDS-ZERO,
TDS-ZERO,
MSG-RPC, MSG-RPC-L,
MSG-TEXT, MSG-TEXT-L
END-IF.
SEND-MESSAGE-EXIT.
EXIT.
ALLOC-AIB.
* ---------------------------------------------------------
* Allocate AIB
* ---------------------------------------------------------
MOVE ‘DFSAIB ‘ TO AIBID.
MOVE ‘SYICSAM2’ TO AIBRSNM1.
MOVE 128 TO AIBLEN.
CALL ‘AIBTDLI’ USING APSB AIB.
IF AIBRETRN IS EQUAL TO ZEROES THEN
SET ADDRESS OF PCB-ADDRESSES TO AIBPTR
SET ADDRESS OF IO-PCB TO PCB-ADDRESS-LIST (1)
ELSE
DISPLAY ‘SYIXSAM2 - APSB CALL FAILED RC= ‘ AIBRETRN
DISPLAY ‘SYIXSAM2 - APSB CALL FAILED REASON= ‘ AIBREASN
GOBACK.
ALLOC-AIB-EXIT.
EXIT.
DEALLOC-AIB.
* ---------------------------------------------------------
* ISSUE SRRCMIT CALL
* ---------------------------------------------------------
CALL ‘SRRCMIT’ USING CPIC-RC.
IF CPIC-RC IS NOT EQUAL TO ZEROES THEN
DISPLAY ‘SYIXSAM2 SRRCMIT CALL FAILED CPIC-RC=’ CPIC-RC.
* ---------------------------------------------------------
* Deallocate AIB
* ---------------------------------------------------------
CALL ‘AIBTDLI’ USING DPSB AIB.
IF AIBRETRN IS NOT EQUAL TO ZEROES THEN
DISPLAY ‘SYIXSAM2 - DPSB CALL FAILED RC= ‘ AIBRETRN
DISPLAY ‘SYIXSAM2 - DPSB CALL FAILED REASON= ‘ AIBREASN.
DEALLOC-AIB-EXIT.
EXIT.
| Copyright © 2005. Sybase Inc. All rights reserved. |
|
|