PL/I coding example for TRACE
You can use the TRACE command in a PL/I application to write trace information for the application to the QMF trace output.
The following coding example first verifies that the user is tracing QMF application activity by checking that the global variable DSQAO_APPL_TRACE is not set to '0'. If the application trace is on, then the TRACE command is issued. The TRACE command specifies three trace area definitions to write to the QMF trace output.
This example is not included in the DSQABFP file that is distributed with QMF.
DSQABFP: PROCEDURE OPTIONS(MAIN REENTRANT) REORDER;
/********************************************************************/
/* Sample Program: DSQABFP */
/* PL/I Version of the QMF Callable Interface */
/********************************************************************/
/********************************************************************/
/* Include and declare query interface communications area */
/********************************************************************/
%INCLUDE SYSLIB(DSQCOMML);
/********************************************************************/
/* Builtin function */
/********************************************************************/
DCL LENGTH BUILTIN;
/********************************************************************/
/* Query interface command length and commands */
/********************************************************************/
DCL COMMAND_LENGTH FIXED BIN(31);
DCL START_QUERY_INTERFACE CHAR(5) INIT('START');
DCL SET_GLOBAL_VARIABLES CHAR(10) INIT('SET GLOBAL');
DCL GET_GLOBAL_VARIABLES CHAR(10) INIT('GET GLOBAL');
DCL RUN_QUERY CHAR(12) INIT('RUN QUERY Q1');
DCL PRINT_REPORT CHAR(22) INIT('PRINT REPORT (FORM=F1)');
DCL TRACE_COMMAND CHAR(5) INIT('TRACE');
DCL END_QUERY_INTERFACE CHAR(4) INIT('EXIT');
/********************************************************************/
/* Query command extension, number of parameters and lengths */
/********************************************************************/
DCL NUMBER_OF_PARAMETERS FIXED BIN(31);/* number of variables */
DCL KEYWORD_LENGTHS(10) FIXED BIN(31);/* lengths of keyword names*/
DCL DATA_LENGTHS(10) FIXED BIN(31);/* lengths of variable data*/
/********************************************************************/
/* Trace command parameters */
/********************************************************************/
DCL AREA_DESCRIPTION(10) CHAR(40);
DCL AREA_DESCRIPTION_LENGTH(10) FIXED BIN(31);
DCL AREA_PTR(10) PTR;
DCL AREA_LENGTH(10) FIXED BIN(31); /* Length of area at */
/* AREA_PTR to be */
/* displayed. */
/********************************************************************/
/* Keyword parameter and value for START command */
/********************************************************************/
DCL 1 START_KEYWORDS,
3 START_KEYWORDS_1 CHAR(8) INIT('DSQSMODE'),
3 START_KEYWORDS_2 CHAR(8) INIT('DSQSDBUG'),
3 START_KEYWORDS_3 CHAR(8) INIT('DSQSSUBS'),
3 START_KEYWORDS_4 CHAR(8) INIT('DSQSPLAN');
DCL 1 START_KEYWORD_VALUES,
3 START_KEYWORD_VALUES_1 CHAR(11) INIT('BATCH'),
3 START_KEYWORD_VALUES_2 CHAR(3) INIT('ALL'),
3 START_KEYWORD_VALUES_3 CHAR(4) INIT('DSNA'),
3 START_KEYWORD_VALUES_4 CHAR(6) INIT('QMFDEV');
/********************************************************************/
/* Keyword parameter and value for SET command */
/********************************************************************/
DCL 1 SET_KEYWORDS,
3 SET_KEYWORDS_1 CHAR(7) INIT('MYVAR01'),
3 SET_KEYWORDS_2 CHAR(5) INIT('SHORT'),
3 SET_KEYWORDS_3 CHAR(7) INIT('MYVAR03');
DCL 1 SET_VALUES,
3 SET_VALUES_1 FIXED BIN(31),
3 SET_VALUES_2 FIXED BIN(31),
3 SET_VALUES_3 FIXED BIN(31);
/********************************************************************/
/* Keyword parameter and value for GET command */
/********************************************************************/
DCL 1 GET_TRACE_KEYWORDS,
3 GET_TRACE_KEYWORDS_1 CHAR(16) INIT('DSQAO_APPL_TRACE');
DCL 1 GET_TRACE_VALUE,
3 GET_TRACE_VALUE_1 CHAR(1);
/********************************************************************/
/* Main program */
/********************************************************************/
DSQCOMM = '';
DSQ_COMM_LEVEL = DSQ_CURRENT_COMM_LEVEL;
/********************************************************************/
/* Start a query interface session */
/********************************************************************/
NUMBER_OF_PARAMETERS = 4;
COMMAND_LENGTH = LENGTH(START_QUERY_INTERFACE);
KEYWORD_LENGTHS(1) = LENGTH(START_KEYWORDS_1);
KEYWORD_LENGTHS(2) = LENGTH(START_KEYWORDS_2);
KEYWORD_LENGTHS(3) = LENGTH(START_KEYWORDS_3);
KEYWORD_LENGTHS(4) = LENGTH(START_KEYWORDS_4);
DATA_LENGTHS(1) = LENGTH(START_KEYWORD_VALUES_1);
DATA_LENGTHS(2) = LENGTH(START_KEYWORD_VALUES_2);
DATA_LENGTHS(3) = LENGTH(START_KEYWORD_VALUES_3);
DATA_LENGTHS(4) = LENGTH(START_KEYWORD_VALUES_4);
CALL DSQCIPX(DSQCOMM,
COMMAND_LENGTH,
START_QUERY_INTERFACE,
NUMBER_OF_PARAMETERS,
KEYWORD_LENGTHS,
START_KEYWORDS,
DATA_LENGTHS,
START_KEYWORD_VALUES,
DSQ_VARIABLE_CHAR);
/********************************************************************/
/* Find out current trace setting */
/********************************************************************/
NUMBER_OF_PARAMETERS = 1;
COMMAND_LENGTH = LENGTH(GET_GLOBAL_VARIABLES);
KEYWORD_LENGTHS(1) = LENGTH(GET_TRACE_KEYWORDS_1);
DATA_LENGTHS(1) = LENGTH(GET_TRACE_VALUE_1);
CALL DSQCIPX(DSQCOMM,
COMMAND_LENGTH,
GET_GLOBAL_VARIABLES,
NUMBER_OF_PARAMETERS,
KEYWORD_LENGTHS,
GET_TRACE_KEYWORDS,
DATA_LENGTHS,
GET_TRACE_VALUE,
DSQ_VARIABLE_CHAR);
/********************************************************************/
/* Set numeric values into query using SET command */
/********************************************************************/
NUMBER_OF_PARAMETERS = 3;
COMMAND_LENGTH = LENGTH(SET_GLOBAL_VARIABLES);
KEYWORD_LENGTHS(1) = LENGTH(SET_KEYWORDS_1);
KEYWORD_LENGTHS(2) = LENGTH(SET_KEYWORDS_2);
KEYWORD_LENGTHS(3) = LENGTH(SET_KEYWORDS_3);
DATA_LENGTHS(1) = 4;
DATA_LENGTHS(2) = 4;
DATA_LENGTHS(3) = 4;
SET_VALUES_1 = 20;
SET_VALUES_2 = 40;
SET_VALUES_3 = 4;
CALL DSQCIPX(DSQCOMM,
COMMAND_LENGTH,
SET_GLOBAL_VARIABLES,
NUMBER_OF_PARAMETERS,
KEYWORD_LENGTHS,
SET_KEYWORDS,
DATA_LENGTHS,
SET_VALUES,
DSQ_VARIABLE_FINT);
/********************************************************************/
/* Run a Query */
/********************************************************************/
COMMAND_LENGTH = LENGTH(RUN_QUERY);
CALL DSQCIPL(DSQCOMM,
COMMAND_LENGTH,
RUN_QUERY);
/********************************************************************/
/* Trace command */
/********************************************************************/
IF GET_TRACE_VALUE_1 ^= '0' THEN DO;
NUMBER_OF_PARAMETERS = 3;
COMMAND_LENGTH = LENGTH(TRACE_COMMAND);
AREA_DESCRIPTION(1) = 'DSQAO_APPL_TRACE:';
AREA_DESCRIPTION_LENGTH(1) = LENGTH(AREA_DESCRIPTION(1));
AREA_PTR(1) = ADDR(GET_TRACE_VALUE_1);
AREA_LENGTH(1) = LENGTH(GET_TRACE_VALUE_1);
AREA_DESCRIPTION(2) = 'DSQ_COMM_LEVEL:';
AREA_DESCRIPTION_LENGTH(2) = LENGTH(AREA_DESCRIPTION(2));
AREA_PTR(2) = ADDR(DSQ_COMM_LEVEL);
AREA_LENGTH(2) = LENGTH(DSQ_COMM_LEVEL);
AREA_DESCRIPTION(3) = 'DSQ_CURRENT_COMM_LEVEL:';
AREA_DESCRIPTION_LENGTH(3) = LENGTH(AREA_DESCRIPTION(3));
AREA_PTR(3) = ADDR(DSQ_CURRENT_COMM_LEVEL);
AREA_LENGTH(3) = LENGTH(DSQ_CURRENT_COMM_LEVEL);
CALL DSQCIPX(DSQCOMM,
COMMAND_LENGTH,
TRACE_COMMAND,
NUMBER_OF_PARAMETERS,
AREA_DESCRIPTION_LENGTH,
AREA_DESCRIPTION,
AREA_LENGTH,
AREA_PTR,
DSQ_VARIABLE_FINT);
END;
/********************************************************************/
/* Print the results of the query */
/********************************************************************/
COMMAND_LENGTH = LENGTH(PRINT_REPORT);
CALL DSQCIPL(DSQCOMM,
COMMAND_LENGTH,
PRINT_REPORT);
/********************************************************************/
/* End the query interface session */
/********************************************************************/
COMMAND_LENGTH = LENGTH(END_QUERY_INTERFACE);
CALL DSQCIPL(DSQCOMM,
COMMAND_LENGTH,
END_QUERY_INTERFACE);
END DSQABFP;
When the program detects that the user has tracing set on, the following trace output is written to the QMF trace output:
--------------------------------------------------------------------
DSQDTRC :TRACE COMMAND OUTPUT (14534)
TRACE_AREA_NUMBER
341033B8: 00000001 *.... *
TRACE_AREA_TITLE
341036A4: C4E2D8C1 D66DC1D7 D7D36DE3 D9C1C3C5 *DSQAO_APPL_TRACE*
341036B4: 7A *: *
TRACE_AREA_CONTENTS
340D0A14: F2 *2 *
--------------------------------------------------------------------
DSQDTRC :TRACE COMMAND OUTPUT (14535)
TRACE_AREA_NUMBER
341033B8: 00000002 *.... *
TRACE_AREA_TITLE
341036A4: C4E2D86D C3D6D4D4 6DD3C5E5 C5D37A *DSQ_COMM_LEVEL: *
TRACE_AREA_CONTENTS
340D0500: C4E2D8D3 6EF0F0F1 F0F0F24C *DSQL>001002< *
--------------------------------------------------------------------
DSQDTRC :TRACE COMMAND OUTPUT (14536)
TRACE_AREA_NUMBER
341033B8: 00000003 *.... *
TRACE_AREA_TITLE
341036A4: C4E2D86D C3E4D9D9 C5D5E36D C3D6D4D4 *DSQ_CURRENT_COMM*
341036B4: 6DD3C5E5 C5D37A *_LEVEL: *
TRACE_AREA_CONTENTS
33F00C50: C4E2D8D3 6EF0F0F1 F0F0F24C *DSQL>001002< *
---------------------------------------------------------------------