/* ***************************************************************** */ /* PROGRAM: LSTCURUSR */ /* */ /* LANGUAGE: CL */ /* */ /* INPUT: CHAR(10) - USER PROFILE NAME OR BLANK */ /* */ /* DESCRIPTION: THIS PROGRAM IS AN EXAMPLE OF HOW TO RETRIEVE */ /* THE CURRENT USER AN ODBC JOB IS RUNNING UNDER. */ /* */ /* THIS PROGRAM WILL LIST THE FULLY QUALIFIED ODBC */ /* JOB NAME AND THE USER PROFILE THAT THE JOB IS */ /* CURRENTLY RUNNING UNDER (CURRENT USER) FOR EITHER */ /* ALL ACTIVE ODBC JOBS (INPUT PARAM IS BLANK) OR */ /* A SPECIFIC USER PROFILE (PASSED AS INPUT PARAM). */ /* THE LISTING IS IN THE JOBLOG. */ /* THE SAMPLE PROGRAM ONLY RETRIEVES TCP/IP CONNECTED */ /* ODBC JOBS (QZDASOINIT). CHANGE THE JOB NAME TO */ /* QZDAINIT TO RETRIEVE SNA ATTACHED JOBS. */ /* */ /* THIS PROGRAM RETRIEVES A LIST OF ALL QZDASOINIT */ /* JOBS. IT THEN PULLS THE JOB INFO FOR EACH OF */ /* OF THESE JOBS. IT USES FORMAT 0600 TO FIND THE */ /* CURRENT USER. IT USES FORMAT 0200 TO */ /* RETRIEVE THE JOB ACTIVE STATUS. */ /* */ /* APIS USED: QUSCRTUS, QUSDLTUS, QUSLJOB, QUSRTVUS, QUSRJOBI */ /* */ /* DAVID DILLING V1.0 */ /* ***************************************************************** */ PGM PARM(&TARGETUSER) /* */ /* LOCAL VARIABLES */ /* */ DCL VAR(&TARGETUSER) TYPE(*CHAR) LEN(10) + VALUE(' ') /* BLANK - ALL USERS, + otherwise list only jobs for that + specific user */ DCL VAR(&TEMP) TYPE(*CHAR) LEN(5) DCL VAR(&ERR) TYPE(*CHAR) LEN(8) + VALUE(X'0000000000000000') DCL VAR(&USRSPC) TYPE(*CHAR) LEN(20) + VALUE('CHGA QTEMP ') /* USER + SPACE NAME FOR APIS */ DCL VAR(&BIN4) TYPE(*CHAR) LEN(4) /* NUMBER OF + JOBS FOR LIST JOB AND USER SPACE OFFSET + IN BINARY 4 FORM */ DCL VAR(&LOOP) TYPE(*DEC) LEN(8 0) /* NUMBER OF + JOBS FROM LIST JOB */ DCL VAR(&DEC8) TYPE(*DEC) LEN(8 0) /* USER SPACE + OFFSET IN DECIMAL 8,0 FORM */ DCL VAR(&ELEN) TYPE(*DEC) LEN(8 0) /* LIST JOB + ENTRY LENGTH IN DECIMAL 8,0 FORM */ DCL VAR(&ELENB) TYPE(*CHAR) LEN(4) /* LIST JOB + ENTRY LENGTH IN BINARY 4 FORM */ /* DATA IN THE LIST JOB INFORMATION */ DCL VAR(&LJOBE) TYPE(*CHAR) LEN(56) /* RETRIEVE + AREA FOR LIST JOB ENTRY */ DCL VAR(&FQJOBNAME) TYPE(*CHAR) LEN(26) + VALUE(' *ALL ') DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNUMBER) TYPE(*CHAR) LEN(10) DCL VAR(&INTJOB) TYPE(*CHAR) LEN(16) /* RETRIEVE + AREA FOR INTERNAL JOB ID */ /* DATA IN THE JOBI API INFORMATION */ DCL VAR(&JOBI) TYPE(*CHAR) LEN(104) /* RETRIEVE + AREA FOR JOB INFORMATION */ DCL VAR(&JOBI200) TYPE(*CHAR) LEN(111) /* + RETRIEVE AREA FOR JOB INFORMATION */ DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) /* JOB TYPE */ DCL VAR(&STATUS) TYPE(*CHAR) LEN(10) /* JOB TYPE */ DCL VAR(&ACTSTATUS) TYPE(*CHAR) LEN(4) DCL VAR(&CURUSER) TYPE(*CHAR) LEN(10) /* + RETRIEVE JOB NAME */ DCL VAR(&RJOB) TYPE(*CHAR) LEN(10) /* RETRIEVE + JOB NAME */ DCL VAR(&RUSER) TYPE(*CHAR) LEN(10) /* RETRIEVE + USER NAME */ DCL VAR(&RNBR) TYPE(*CHAR) LEN(6) /* RETRIEVE + JOB NUMBER */ /* */ /* START OF EXECUTABLE CODE */ /* */ /* */ /* DELETE USER SPACE IF IT ALREADY EXISTS */ /* */ /* CHGVAR VAR(&EUSRSPC) VALUE(%SST(&USRSPC 1 10)) */ CALL PGM(QUSDLTUS) PARM(&USRSPC &ERR) MONMSG CPF0000 /* */ /* CREATE USER SPACE */ /* */ CALL PGM(QUSCRTUS) PARM(&USRSPC 'CHGACTJOB ' + X'00011000' ' ' '*ALL ' 'QSERVER JOB + LIST TEMP USER SPACE ') /* */ /* LIST ACTIVE JOBS WITH JOB NAME SPECIFIED */ /* */ CALL PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' + 'QZDASOINITQUSER *ALL ' '*ACTIVE ') /* */ /* RETRIEVE NUMBER OF ENTRIES RETURNED. CONVERT TO DECIMAL AND */ /* */ CALL PGM(QUSRTVUS) PARM(&USRSPC X'00000085' + X'00000004' &BIN4) CHGVAR VAR(&LOOP) VALUE(%BINARY(&BIN4)) CHGVAR VAR(&TEMP) VALUE(&LOOP) SNDPGMMSG MSG(&TEMP *BCAT ' QZDASOINIT JOBS TO BE + PROCESSED') IF COND(&LOOP = 0) THEN(GOTO CMDLBL(ALLDONE)) /* */ /* RETRIEVE LIST ENTRY LENGTH, CONVERT TO DECIMAL. */ /* RETRIEVE LIST ENTRY OFFSET, CONVERT TO DECIMAL, AND ADD ONE */ /* TO SET THE POSITION. */ /* */ CALL QUSRTVUS (&USRSPC X'00000089' X'00000004' + &ELENB) CHGVAR &ELEN %BINARY(&ELENB) CALL QUSRTVUS (&USRSPC X'0000007D' X'00000004' + &BIN4) CHGVAR VAR(&DEC8) VALUE(%BINARY(&BIN4)) CHGVAR VAR(&DEC8) VALUE(&DEC8 + 1) /* */ /* LOOP FOR THE NUMBER OF JOBS UNTIL NO MORE JOBS THEN GO TO */ /* ALLDONE LABEL */ /* */ STARTLOOP: IF (&LOOP = 0) THEN(GOTO ALLDONE) /* */ /* CONVERT DECIMAL POSITION TO BINARY 4 AND RETRIEVE LIST JOB ENTRY */ /* */ CHGVAR VAR(%BINARY(&BIN4)) VALUE(&DEC8) CALL QUSRTVUS (&USRSPC &BIN4 &ELENB + &LJOBE) /* */ /* COPY INTERNAL JOB IDENTIFIER AND RETRIEVE JOB INFORMATION FOR */ /* BASIC INFORMATION. */ /* */ CHGVAR VAR(&INTJOB) VALUE(%SST(&LJOBE 27 16)) CALL PGM(QUSRJOBI) PARM(&JOBI X'00000068' + 'JOBI0600' '*INT ' + &INTJOB) CALL PGM(QUSRJOBI) PARM(&JOBI200 X'0000006F' + 'JOBI0200' '*INT ' + &INTJOB) /* */ /* COPY JOB TYPE, ACTIVE JOB STATUS, CURRENT USER AND ANY OTHER */ /* JOB INFORMATION NEEDED. */ /* */ CHGVAR VAR(&JOBTYPE) VALUE(%SST(&JOBI 61 1)) CHGVAR VAR(&CURUSER) VALUE(%SST(&JOBI 92 10)) CHGVAR VAR(&STATUS) VALUE(%SST(&JOBI 51 10)) CHGVAR VAR(&RJOB) VALUE(%SST(&JOBI 9 10)) CHGVAR VAR(&RUSER) VALUE(%SST(&JOBI 19 10)) CHGVAR VAR(&RNBR) VALUE(%SST(&JOBI 29 6)) CHGVAR VAR(&ACTSTATUS) VALUE(%SST(&JOBI200 108 4)) IF COND((&TARGETUSER *EQ ' ') *OR + (&TARGETUSER *EQ &CURUSER)) + THEN(SNDPGMMSG MSG('JOB' *BCAT &RNBR + *TCAT '/' *TCAT &RUSER *TCAT '/' *TCAT + &RJOB *TCAT ' CURRENT USER:' *TCAT + &CURUSER *TCAT ' ACTIVE STATUS:' *TCAT + &ACTSTATUS *TCAT ' STATUS:' *TCAT &STATUS + *BCAT ' JOBTYPE: ' *TCAT &JOBTYPE)) /* */ /* PERFORM ANY SPECIAL JOB PROCESSING HERE */ /* */ /* */ /* AT END OF LOOP SET NEW DECIMAL POSITION TO NEXT ENTRY AND */ /* DECREMENT LOOP COUNTER BY ONE. */ /* */ ENDLOOP: CHGVAR VAR(&DEC8) VALUE(&DEC8 + &ELEN) CHGVAR VAR(&LOOP) VALUE(&LOOP - 1) GOTO CMDLBL(STARTLOOP) /* */ /* ALL DONE. NOW DELETE TEMPORARY USER SPACE THAT WE CREATED. */ /* */ ALLDONE: CALL PGM(QUSDLTUS) PARM(&USRSPC &ERR) MONMSG MSGID(CPF0000) ENDPGM