/* * * This program parses the Journal PEX Trace point events in * QAYUSRDFN and puts them into a nicely formatted table * * * * Syntax: PARSEJOPEX library * library = library which contains results * also used as output file location * * Compile statement: CRTSQLCI OBJ(JOLICTOOLS/PARSEJOPEX) SRCFILE(JOLICTOOLS/PARSEJOPEX) SRCMBR(PARSEJOPEX) COMMIT(*NONE) OBJTYPE(*PGM) **/ #include #include #include #include #include // toupper() call #include #include #include #include EXEC sql include SQLCA; int main(int argc, char *argv[]) { EXEC SQL BEGIN DECLARE SECTION; /* command line parameters */ char lib[11]; /* host vars */ long int cnt = 0; char dta[300]; short int typ = 0; short int styp = 0; /* a counter */ long int i; int j; /* for QLICHGLL call */ char current[11]; char same[11]; long int num_user_libs = -1; Qus_EC_t *err_code; char errorbuffer[512]; /* for QCMDEXC call */ decimal(15,5) packed_length; int length; char command[200]; char statement[200]; /* data */ char port[16]; EXEC SQL END DECLARE SECTION; if (argc != 2) { printf("PARSEJOPEX lib\n"); } else { sprintf(lib, "%s", argv[1]); /* convert the library to upper case */ for (i = 0; i < 10; i++) { lib[i] = toupper(lib[i]); } /* set the current library */ sprintf(current, "%-10s", lib); strcpy(same, "*SAME "); err_code = (Qus_EC_t *) errorbuffer; err_code->Bytes_Provided = 0; QLICHGLL(current, same, same, same, num_user_libs, err_code); /* create the output table */ EXEC SQL CREATE TABLE JOPEXOUT (record int, type int, subtype int, portaddr char(16), accpathaddr char(16), objectaddr char(16), recrasetting char(16), recraobjects char(8), smapptrans char(2), smappreason char(2), cycleid char(16), curSeqNum char(16), curSyncPoint char(16), writes char(8), permWrites char(8), syncDbReads char(8), syncNonDbReads char(8), syncDbWrites char(8), syncNonDbWrites char(8), asyncDbReads char(8), asyncNonDbReads char(8), asyncDbWrites char(8), asyncNonDbWrites char(8), accessGroupFaults char(8), ioPendingWaits char(8), synIoWaits char(8), pageFaults char(8), seizewt char(16), mJOCommitOps char(8), mJOSecCommitOps char(8), mJODecommOps char(8), mJOSecDecommOps char(8), mJOJrnWrts char(8), mJONonSMAPP char(8), mJOUser char(8), mJOSystem char(8), mJOFixedBytes char(16), mJODepFixedBytes char(16), mJOTransient char(16), mJODepTransient char(16), mJONaptime char(16), mJONaps char(8), mJOEval_Messages char(8), mJOTriggered_Evals char(8), mJOBuildtime_Ests char(8), queuingWaitTime char(16)); /* copy the QAYPEUSRDF and QAYPETIDX table */ /* copy the table because a table of the same name exists in * QSYS which will be found prior to the one in the * specified library due to the library list. A new name * will allow this one to be found without specifying * a library. This is due to the fact that I do not know * how to use a host variable in a dynamic statement which * would allow me to specify the library name passed in. */ sprintf(command, "CPYF %s/QAYPEUSRDF %s/USRDFCOPY CRTFILE(*YES)", lib, lib); length = strlen(command); cpynv(NUM_DESCR(_T_PACKED,15,5), &packed_length, NUM_DESCR(_T_SIGNED,4,0), &length); QCMDEXC(command, packed_length); sprintf(command, "CPYF %s/QAYPETIDX %s/TIDXCOPY CRTFILE(*YES)", lib, lib); length = strlen(command); cpynv(NUM_DESCR(_T_PACKED,15,5), &packed_length, NUM_DESCR(_T_SIGNED,4,0), &length); QCMDEXC(command, packed_length); /* get the number of events to parse */ EXEC SQL select max(QRECN) into :cnt from USRDFCOPY; for (i = 1; i <= cnt; i++) { /* get a row of data to parse */ EXEC SQL select QUSDTA into :dta from USRDFCOPY where QRECN = :i; EXEC SQL INSERT into JOPEXOUT (record, portaddr, accpathaddr, objectaddr, recrasetting, recraobjects, smapptrans, smappreason, cycleid, curSeqNum, curSyncPoint, writes, permWrites, syncDbReads, syncNonDbReads, syncDbWrites, syncNonDbWrites, asyncDbReads, asyncNonDbReads, asyncDbWrites, asyncNonDbWrites, accessGroupFaults, ioPendingWaits, synIoWaits, pageFaults, seizewt, mJOCommitOps, mJOSecCommitOps, mJODecommOps, mJOSecDecommOps, mJOJrnWrts, mJONonSMAPP, mJOUser, mJOSystem, mJOFixedBytes, mJODepFixedBytes, mJOTransient, mJODepTransient, mJONaptime, mJONaps, mJOEval_Messages, mJOTriggered_Evals, mJOBuildtime_Ests, queuingWaitTime) select QRECN, HEX(SUBSTR(QUSDTA, 1, 8)) portaddr, HEX(SUBSTR(QUSDTA, 9, 8)) accpathaddr, HEX(SUBSTR(QUSDTA, 17, 8)) objectaddr, HEX(SUBSTR(QUSDTA, 25, 8)) recrasetting, HEX(SUBSTR(QUSDTA, 33, 4)) recraobjects, HEX(SUBSTR(QUSDTA, 37, 1)) smapptrans, HEX(SUBSTR(QUSDTA, 38, 1)) smappreason, HEX(SUBSTR(QUSDTA, 41, 8)) cycleid, HEX(SUBSTR(QUSDTA, 49, 8)) curSeqNum, HEX(SUBSTR(QUSDTA, 57, 8)) curSyncPoint, HEX(SUBSTR(QUSDTA, 65, 4)) writes, HEX(SUBSTR(QUSDTA, 69, 4)) permWrites, HEX(SUBSTR(QUSDTA, 73, 4)) syncDbReads, HEX(SUBSTR(QUSDTA, 77, 4)) syncNonDbReads, HEX(SUBSTR(QUSDTA, 81, 4)) syncDbWrites, HEX(SUBSTR(QUSDTA, 85, 4)) syncNonDbWrites, HEX(SUBSTR(QUSDTA, 89, 4)) asyncDbReads, HEX(SUBSTR(QUSDTA, 93, 4)) asyncNonDbReads, HEX(SUBSTR(QUSDTA, 97, 4)) asyncDbWrites, HEX(SUBSTR(QUSDTA, 101, 4)) asyncNonDbWrites, HEX(SUBSTR(QUSDTA, 105, 4)) accessGroupFaults, HEX(SUBSTR(QUSDTA, 109, 4)) ioPendingWaits, HEX(SUBSTR(QUSDTA, 113, 4)) synIoWaits, HEX(SUBSTR(QUSDTA, 117, 4)) pageFaults, HEX(SUBSTR(QUSDTA, 121, 8)) seizewt, HEX(SUBSTR(QUSDTA, 129, 4)) mJOCommitOps, HEX(SUBSTR(QUSDTA, 133, 4)) mJOSecCommitOps, HEX(SUBSTR(QUSDTA, 137, 4)) mJODecommOps, HEX(SUBSTR(QUSDTA, 141, 4)) mJOSecDecommOps, HEX(SUBSTR(QUSDTA, 145, 4)) mJOJrnWrts, HEX(SUBSTR(QUSDTA, 149, 4)) mJONonSMAPP, HEX(SUBSTR(QUSDTA, 153, 4)) mJOUser, HEX(SUBSTR(QUSDTA, 157, 4)) mJOSystem, HEX(SUBSTR(QUSDTA, 161, 8)) mJOFixedBytes, HEX(SUBSTR(QUSDTA, 169, 8)) mJODepFixedBytes, HEX(SUBSTR(QUSDTA, 177, 8)) mJOTransient, HEX(SUBSTR(QUSDTA, 185, 8)) mJODepTransient, HEX(SUBSTR(QUSDTA, 193, 8)) mJONaptime, HEX(SUBSTR(QUSDTA, 201, 4)) mJONaps, HEX(SUBSTR(QUSDTA, 205, 4)) mJOEval_Messages, HEX(SUBSTR(QUSDTA, 209, 4)) mJOTriggered_Evals, HEX(SUBSTR(QUSDTA, 213, 4)) mJOBuildtime_Ests, HEX(SUBSTR(QUSDTA, 217, 8)) queuingWaitTime from USRDFCOPY where QRECN = :i; EXEC SQL SELECT QTITY, QTISTY into :typ, :styp from TIDXCOPY where QRECN = :i; EXEC SQL UPDATE JOPEXOUT SET type = :typ, subtype = :styp where record = :i; } /* clean up the temp files */ sprintf(command, "DLTF TIDXCOPY", lib, lib); length = strlen(command); cpynv(NUM_DESCR(_T_PACKED,15,5), &packed_length, NUM_DESCR(_T_SIGNED,4,0), &length); QCMDEXC(command, packed_length); /* clean up the temp files */ sprintf(command, "DLTF USRDFCOPY", lib, lib); length = strlen(command); cpynv(NUM_DESCR(_T_PACKED,15,5), &packed_length, NUM_DESCR(_T_SIGNED,4,0), &length); QCMDEXC(command, packed_length); /* set the current library to nothing */ sprintf(current, "*CRTDFT "); strcpy(same, "*SAME "); err_code = (Qus_EC_t *) errorbuffer; err_code->Bytes_Provided = 0; QLICHGLL(current, same, same, same, num_user_libs, err_code); } return 0; }