The following program extracts all the items of a TS queue and write them to a flat file. The program has been tested using Dell Enterprise COBOL and executed in Dell TPE.
The same program can be compiled and executed using any available re-hosting platform for LUW. Please note that the program uses native Unix/Linux C APIs to write the data to a flat file so it cannot run as is on a Mainframe computer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | *
* Author: Santix, http://www.italianscool.com
*
* Exporting TS QUEUE data to a flat file
*
IDENTIFICATION DIVISION.
*
PROGRAM-ID. EXPQUEUE.
*
ENVIRONMENT DIVISION.
*
CONFIGURATION SECTION.
*
DATA DIVISION.
*
WORKING-STORAGE SECTION.
*
01 WS-IDX PIC S9(4) COMP.
01 WS-NUMITEMS PIC S9(4) COMP.
01 WS-NUMITEMS-DISP PIC S9(4).
01 WS-LENGTH PIC S9(4) COMP.
01 WS-EIBRESP PIC S9(4) COMP.
01 WS-EIBRESP-DISP PIC S9(4).
01 WS-BUFFER.
03 WS-TRANSACTION PIC X(4).
03 WS-TSQUEUE PIC X(8).
01 WS-QDATA PIC X(32000).
01 WS-MSG.
03 WS-MSG-LINE-1 PIC X(79).
03 WS-MSG-LINE-2 PIC X(79).
03 WS-MSG-LINE-3 PIC X(79).
*
01 WS-SEPARATED-LOGFILE PIC X(256).
01 WS-LOG-FILENAME-PTR POINTER.
01 WS-FILE-IO-FUNCTION.
03 FILLER PIC X.
88 WS-IO-FUNCTION-WRITE VALUE "w".
88 WS-IO-FUNCTION-READ VALUE "r".
88 WS-IO-FUNCTION-APPEND VALUE "a".
03 FILLER PIC X VALUE LOW-VALUE.
01 WS-FILE-IO-RC PIC S9(9) COMP-5.
01 WS-GREGORN.
03 WS-DT-YEAR PIC X(4).
03 WS-DT-MONTH PIC X(2).
03 WS-DT-DAY PIC X(2).
03 WS-TM-HOUR PIC X(2).
03 WS-TM-MINUTES PIC X(2).
03 WS-TM-SECONDS PIC X(2).
03 WS-TM-MSECONDS PIC X(3).
01 WS-LILIAN PIC S9(9) COMP.
01 WS-XSECONDS PIC S9(18) COMP.
01 WS-FC PIC X(12).
01 WS-LOG-TMS.
03 WS-DT-YEAR PIC X(4).
03 WS-DT-MONTH PIC X(2).
03 WS-DT-DAY PIC X(2).
03 FILLER PIC X VALUE "_".
03 WS-TM-HOUR PIC X(2).
03 WS-TM-MINUTES PIC X(2).
03 WS-TM-SECONDS PIC X(2).
*
LINKAGE SECTION.
*
01 DFHCOMMAREA PIC X(32000).
01 LK-LOG-FILENAME-PTR PIC X(8).
*
PROCEDURE DIVISION.
*
MAIN-SECTION.
MOVE SPACE TO WS-MSG
MOVE 12 TO WS-LENGTH
EXEC CICS
RECEIVE INTO(WS-BUFFER)
LENGTH(WS-LENGTH)
NOHANDLE
END-EXEC
DISPLAY "------------------------------------------"
DISPLAY "WS-LENGTH=" WS-LENGTH
DISPLAY "WS-TSQUEUE=" WS-TSQUEUE
DISPLAY "------------------------------------------"
IF WS-LENGTH <=4 OR WS-TSQUEUE = SPACE
MOVE "USAGE: EXQ "
TO WS-MSG
PERFORM EXIT-OK
END-IF
INSPECT WS-TSQUEUE REPLACING ALL LOW-VALUE BY SPACE
EXEC CICS
INQUIRE TSQUEUE(WS-TSQUEUE)
NUMITEMS(WS-NUMITEMS)
RESP(WS-EIBRESP)
NOHANDLE
END-EXEC
MOVE WS-EIBRESP TO WS-EIBRESP-DISP
MOVE WS-NUMITEMS TO WS-NUMITEMS-DISP
STRING "QUEUE(" WS-TSQUEUE ")_EIBRESP=" WS-EIBRESP-DISP
"_NUMITEMS=" WS-NUMITEMS-DISP
DELIMITED BY SIZE
INTO WS-MSG-LINE-1
IF WS-EIBRESP NOT= ZERO
OR WS-NUMITEMS = ZERO
PERFORM EXIT-OK
END-IF
*
CALL 'CEELOCT' USING WS-LILIAN
WS-XSECONDS
WS-GREGORN
WS-FC
MOVE CORR WS-GREGORN TO WS-LOG-TMS
STRING
"/tmp/CEBR_" DELIMITED BY SIZE
WS-TSQUEUE DELIMITED BY SPACE
"_" WS-LOG-TMS ".txt"
X'00' DELIMITED BY SIZE
INTO WS-SEPARATED-LOGFILE
SET WS-IO-FUNCTION-WRITE TO TRUE
CALL "fopen" USING WS-SEPARATED-LOGFILE
WS-FILE-IO-FUNCTION
GIVING WS-LOG-FILENAME-PTR
IF WS-LOG-FILENAME-PTR = NULL
STRING "OPEN_LOG_ERROR:_" DELIMITED BY SIZE
WS-SEPARATED-LOGFILE DELIMITED BY LOW-VALUE
INTO WS-MSG-LINE-2
PERFORM EXIT-OK
END-IF
*
PERFORM VARYING WS-IDX FROM 1 BY 1
UNTIL WS-IDX > WS-NUMITEMS
MOVE 32000 TO WS-LENGTH
EXEC CICS
READQ TS QUEUE(WS-TSQUEUE)
INTO(WS-QDATA)
LENGTH(WS-LENGTH)
ITEM(WS-IDX)
RESP(WS-EIBRESP)
NOHANDLE
END-EXEC
IF WS-EIBRESP NOT= ZERO
AND WS-EIBRESP NOT= 22
CALL "fclose" USING LK-LOG-FILENAME-PTR
MOVE WS-EIBRESP TO WS-EIBRESP-DISP
STRING "READQ_EIBRESP=" WS-EIBRESP-DISP
DELIMITED BY SIZE
INTO WS-MSG-LINE-2
PERFORM EXIT-OK
END-IF
SET ADDRESS OF LK-LOG-FILENAME-PTR
TO WS-LOG-FILENAME-PTR
ADD 1 TO WS-LENGTH
IF WS-LENGTH > 32000
MOVE 32000 TO WS-LENGTH
END-IF
INSPECT WS-QDATA(1:WS-LENGTH) REPLACING
ALL LOW-VALUE BY SPACE
INSPECT WS-QDATA(1:WS-LENGTH) REPLACING
ALL HIGH-VALUE BY SPACE
MOVE x'0A' TO WS-QDATA(WS-LENGTH:1)
CALL "fwrite" USING WS-QDATA
BY VALUE LENGTH OF WS-QDATA(1:WS-LENGTH)
BY VALUE 1
BY REFERENCE LK-LOG-FILENAME-PTR
GIVING WS-FILE-IO-RC
IF WS-FILE-IO-RC NOT= 1
CALL "fclose" USING LK-LOG-FILENAME-PTR
STRING "WRITE_LOG_ERROR:_" DELIMITED BY SIZE
WS-SEPARATED-LOGFILE DELIMITED BY LOW-VALUE
INTO WS-MSG-LINE-2
PERFORM EXIT-OK
END-IF
END-PERFORM
*
CALL "fclose" USING LK-LOG-FILENAME-PTR
STRING "DATA_TO:_" DELIMITED BY SIZE
WS-SEPARATED-LOGFILE DELIMITED BY LOW-VALUE
INTO WS-MSG-LINE-2
PERFORM EXIT-OK
*
.
MAIN-EX.
EXIT.
EXIT-OK SECTION.
*
EXEC CICS
SEND TEXT FROM (WS-MSG)
LENGTH (LENGTH OF WS-MSG)
ERASE
FREEKB
END-EXEC
*
EXEC CICS
RETURN
END-EXEC
*
.
EXIT-OK-EX.
EXIT. |
Execution output using Dell TPE and having defined a transaction code EXQ for the program into the PCT table:
Type in “EXQ <a valid TS queue name>” and ENTER:

output:

