Originally posted by usmanjee
I have an automated set of pgms that I use to perform database switching that uses this little utility to check the status of a data group before/after making changes etc. The main program has validation based on the parms returned.
best of all it is in Jamie's fave language ...
BTW - Indentation seems to have gotten stripped out of the do loops etc, sorry ...
Code:
/* +------------------------------------------------------------------------+ */ /* | SWTSTSC10 - Switching Program. Created 29 Dec 2009 - Greg Craill | */ /* +------------------------------------------------------------------------+ */ /* | This program is used to check the status of a MIMIX data group. It | */ /* | returns the status of the data group, the source system, and the | */ /* | number of pending transactions. | */ /* +------------------------------------------------------------------------+ */ /* | To Compile ... | */ /* | WRKDG DGDFN(GMISC *ALL *ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DGSTS) | */ /* | WRKDGACT DGDFN(GMISC) OUTPUT(*OUTFILE) | */ /* | OUTFILE(QTEMP/DGACT) STATUS(*ACTIVE *FAILED) | */ /* +------------------------------------------------------------------------+ */ PGM PARM(&DG_Name &DG_Status &DG_Source &DG_Backlog &ErrCode) /* --- Declare Parameters passed In/Out ----------------------- */ DCL VAR(&DG_Name) TYPE(*CHAR) LEN(10) /* In */ DCL VAR(&DG_Status) TYPE(*CHAR) LEN(10) /* Out */ DCL VAR(&DG_Source) TYPE(*CHAR) LEN(8) /* Out */ DCL VAR(&DG_Backlog) TYPE(*CHAR) LEN(10) /* Out */ DCL VAR(&ErrCode) TYPE(*CHAR) LEN(1) /* Out */ /* --- Declare Work Variables --------------------------------- */ /* --- Object Variables ---------------- */ DCL VAR(&DG_Ob_Cfg) TYPE(*CHAR) LEN(10) DCL VAR(&DG_Ob_Snd) TYPE(*CHAR) LEN(10) DCL VAR(&DG_Ob_Apy) TYPE(*CHAR) LEN(10) DCL VAR(&DG_Ob_Sts) TYPE(*CHAR) LEN(10) /* --- Database Variables -------------- */ DCL VAR(&DG_DB_Cfg) TYPE(*CHAR) LEN(10) DCL VAR(&DG_DB_Snd) TYPE(*CHAR) LEN(10) DCL VAR(&DG_DB_Apy) TYPE(*CHAR) LEN(10) DCL VAR(&DG_DB_Sts) TYPE(*CHAR) LEN(10) /* --- Other Variables ----------------- */ DCL VAR(&LogTxt) TYPE(*CHAR) LEN(60) DCL VAR(&DGBACK#) TYPE(*DEC) LEN(10 0) VALUE(0) DCL VAR(&CNT1) TYPE(*DEC) LEN(10 0) VALUE(1) DCL VAR(&CNT2) TYPE(*DEC) LEN(10 0) VALUE(0) DCL VAR(&DGS_RCD#) TYPE(*DEC) LEN(10 0) VALUE(0) DCL VAR(&BACKLOG) TYPE(*CHAR) LEN(10) VALUE(' ') DCL VAR(&LogMsg) TYPE(*CHAR) LEN(200) /* --- Declare Files Used ------------------------------------- */ DCLF FILE(QTEMP/DGSTS) OPNID(DGS) ALWGRAPHIC(*YES) DCLF FILE(QTEMP/DGACT) OPNID(DGA) ALWGRAPHIC(*YES) /* --- Set error flag to false -------------------------------- */ CHGVAR VAR(&ERRCODE) VALUE('O') /* --- Get Data Group Status and Source from WRKDG to outfile - */ MIMIX/WRKDG DGDFN(&DG_Name *ALL *ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DGSTS) RTVMBRD FILE(QTEMP/DGSTS) NBRCURRCD(&DGS_RCD#) IF COND(&DGS_RCD# *EQ 0) THEN(DO) CHGVAR VAR(&ERRCODE) VALUE('2') GOTO CMDLBL(ENDPGM) ENDDO /* --- Read in the data group information from the DGSTS file - */ RCVF OPNID(DGS) /* --- Get the source system for the data group --------------- */ CHGVAR VAR(&DG_Source) VALUE(&DGS_DTASRC) /* --- Get the Object Replication statuses -------------------- */ CHGVAR VAR(&DG_Ob_Cfg) VALUE(&DGS_OBJCFG) CHGVAR VAR(&DG_Ob_Snd) VALUE(&DGS_OBJSNDSTS) CHGVAR VAR(&DG_Ob_Apy) VALUE(&DGS_OBJAPYSTS) /* --- Get the DataBase Replication statuses ------------------ */ CHGVAR VAR(&DG_DB_Cfg) VALUE(&DGS_DBCFG) CHGVAR VAR(&DG_DB_Snd) VALUE(&DGS_DBSNDSTS) CHGVAR VAR(&DG_DB_Apy) VALUE(&DGS_DBAPYSTS) /* +---------------------------------------------------+ */ /* | Initialise Variables for checking status options | */ /* +---------------------------------------------------+ */ CHGVAR VAR(&DG_STATUS) VALUE(' ') CHGVAR VAR(&DG_DB_STS) VALUE(' ') CHGVAR VAR(&DG_OB_STS) VALUE(' ') CHGVAR VAR(&ERRCODE) VALUE('O') /* +---------------------------------------------------+ */ /* | If Object Replication is configured as *NO then | */ /* | both the Object Status fields should be empty, | */ /* | else there are errors. | */ /* +---------------------------------------------------+ */ If (&DG_Ob_Cfg = '*NO') Do If (&DG_Ob_Snd *NE ' ') Do Chgvar &DG_Status &DG_Ob_Snd Goto ExitChecks Enddo If (&DG_Ob_Apy *NE ' ') Do Chgvar &DG_Status &DG_Ob_Apy Goto ExitChecks Enddo Chgvar &DG_Ob_Sts '*NA ' Enddo /* +---------------------------------------------------+ */ /* | If Object Replication is configured as *YES then | */ /* | both the Object Status fields should be *ACTIVE | */ /* | or *INACTIVE. Blanks or other values are errors. | */ /* +---------------------------------------------------+ */ If (&DG_Ob_Cfg = '*YES') Do /* +-----------------------------------------------+ */ /* | Check the Object Send Status field. | */ /* +-----------------------------------------------+ */ Select When (&DG_Ob_Snd = ' ') Do Chgvar &DG_Ob_Sts '*BLANKS ' Enddo When (&DG_Ob_Snd = '*ACTIVE') Do Chgvar &DG_Ob_Sts &DG_Ob_Snd Enddo When (&DG_Ob_Snd = '*INACTIVE') Do Chgvar &DG_Ob_Sts &DG_Ob_Snd Enddo Otherwise Do Chgvar &DG_Status &DG_Ob_Snd Goto ExitChecks Enddo EndSelect /* +-----------------------------------------------+ */ /* | Check the Object Apply Status field. | */ /* +-----------------------------------------------+ */ Select When (&DG_Ob_Apy = ' ') Do Chgvar &DG_Ob_Sts '*BLANKS ' Enddo When (&DG_Ob_Apy = '*ACTIVE') Do If (&DG_Ob_Sts = '*INACTIVE ') Do Chgvar &DG_Ob_Sts '*PARTIAL ' Enddo Enddo When (&DG_Ob_Apy = '*INACTIVE') Do If (&DG_Ob_Sts = '*ACTIVE ') Do Chgvar &DG_Ob_Sts '*PARTIAL ' Enddo Enddo Otherwise Do Chgvar &DG_Status &DG_Ob_Apy Goto ExitChecks Enddo EndSelect EndDo /* +---------------------------------------------------+ */ /* | If DataBase Replication is configured as *NO then| */ /* | both the Database Status fields should be empty, | */ /* | else there are errors. | */ /* +---------------------------------------------------+ */ If (&DG_DB_Cfg = '*NO') Do If (&DG_DB_Snd *NE ' ') Do Chgvar &DG_Status &DG_DB_Snd Goto ExitChecks Enddo If (&DG_DB_Apy *NE ' ') Do Chgvar &DG_Status &DG_DB_Apy Goto ExitChecks Enddo Chgvar &DG_DB_Sts '*NA ' Enddo /* +-----------------------------------------------------+ */ /* | If DataBase Replication is configured as *YES then | */ /* | both the Object Status fields should be *ACTIVE | */ /* | or *INACTIVE. Blanks or other values are errors. | */ /* +-----------------------------------------------------+ */ If (&DG_DB_Cfg = '*YES') Do /* +-----------------------------------------------+ */ /* | Check the Database Send Status field. | */ /* +-----------------------------------------------+ */ Chgvar &DG_DB_Snd &DG_DB_Apy /* <============= */ /* +-----------------------------------------------+ */ /* | Send is always up for DB groups so cheat here | */ /* +-----------------------------------------------+ */ Select When (&DG_DB_Snd = ' ') Do Chgvar &DG_DB_Sts '*BLANKS ' Enddo When (&DG_DB_Snd = '*ACTIVE') Do Chgvar &DG_DB_Sts &DG_DB_Snd Enddo When (&DG_DB_Snd = '*INACTIVE') Do Chgvar &DG_DB_Sts &DG_DB_Snd Enddo Otherwise Do Chgvar &DG_Status &DG_DB_Snd Goto ExitChecks Enddo EndSelect /* +-----------------------------------------------+ */ /* | Check the DataBase Apply Status field. | */ /* +-----------------------------------------------+ */ Select When (&DG_DB_Apy = ' ') Do Chgvar &DG_DB_Sts '*BLANKS ' Enddo When (&DG_DB_Apy = '*ACTIVE') Do If (&DG_DB_Sts = '*INACTIVE ') Do Chgvar &DG_DB_Sts '*PARTIAL ' Enddo Enddo When (&DG_DB_Apy = '*INACTIVE') Do If (&DG_DB_Sts = '*ACTIVE ') Do Chgvar &DG_DB_Sts '*PARTIAL ' Enddo Enddo Otherwise Do Chgvar &DG_Status &DG_DB_Apy Goto ExitChecks Enddo EndSelect Enddo /* +-----------------------------------------------------+ */ /* | Once the DataBase and Object checks have been done | */ /* | average the two statuses together to return the | */ /* | combined status. | */ /* +-----------------------------------------------------+ */ Select When (&DG_DB_Sts *EQ &DG_Ob_Sts) Do Chgvar &DG_Status &DG_Ob_Sts Enddo When ((&DG_DB_Sts = '*NA ') *Or (&DG_DB_Sts = '*BLANKS ')) Do Chgvar &DG_Status &DG_Ob_Sts Enddo When ((&DG_Ob_Sts = '*NA ') *Or (&DG_Ob_Sts = '*BLANKS ')) Do Chgvar &DG_Status &DG_DB_Sts Enddo When ((&DG_DB_Sts = '*ACTIVE ') *AND (&DG_Ob_Sts = '*INACTIVE ')) Do Chgvar &DG_Status '*PARTIAL ' Enddo When ((&DG_DB_Sts = '*INACTIVE ') *AND (&DG_Ob_Sts = '*ACTIVE ')) Do Chgvar &DG_Status '*PARTIAL ' Enddo OtherWise Do Select When ((&DG_Ob_Sts *NE '*ACTIVE ') *And (&DG_Ob_Sts *NE '*INACTIVE ') *AND + (&DG_Ob_Sts *NE '*NA ') *And (&DG_Ob_Sts *NE '*BLANKS ')) Do Chgvar &DG_Status &DG_Ob_Sts EndDo When ((&DG_DB_Sts *NE '*ACTIVE ') *And (&DG_DB_Sts *NE '*INACTIVE ') *And + (&DG_DB_Sts *NE '*NA ') *And (&DG_DB_Sts *NE '*BLANKS ')) Do Chgvar &DG_Status &DG_DB_Sts EndDo Otherwise Do Chgvar &DG_Status &DG_DB_Sts /* either one */ EndDo EndSelect EndDo EndSelect /* --- --------------------------------------------------------- */ /* --- --------------------------------------------------------- */ EXITCHECKS: IF COND((&DG_STATUS *NE '*ACTIVE') *AND + (&DG_STATUS *NE '*INACTIVE')) THEN(DO) CHGVAR VAR(&ERRCODE) VALUE('1') ENDDO /* --- Get Data Group Active Entries from WRKDGACT to outfile - */ GETDGACT: MIMIX/WRKDGACT DGDFN(&DG_Name) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/DGACT) STATUS(*ACTIVE *FAILED) READ: RCVF OPNID(DGA) MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(EOF)) CHGVAR VAR(&DGBACK#) VALUE(&DGBACK# + &DGA_COUNT) GOTO CMDLBL(READ) EOF: /* --- Format the backlog to get rig of leading zeroes etc ---- */ CHGVAR VAR(&CNT1) VALUE(1) CHGVAR VAR(&BACKLOG) VALUE(&DGBACK#) IF COND(&DGBACK# = 0) THEN(DO) CHGVAR VAR(&DG_Backlog) VALUE('0') GOTO CMDLBL(REPORT) ENDDO NoZeroes: IF COND(%SST(&BACKLOG &CNT1 1) = '0') THEN(DO) CHGVAR VAR(%SST(&BACKLOG &CNT1 1)) VALUE(' ') CHGVAR VAR(&CNT1) VALUE(&CNT1 + 1) GOTO CMDLBL(NoZeroes) ENDDO CHGVAR VAR(&CNT2) VALUE(11 - &CNT1) CHGVAR VAR(&DG_Backlog) VALUE(%SST(&BACKLOG &CNT1 &CNT2)) Report: GOTO CMDLBL(ENDPGM) /* -------------------------------------------------------------- */ ERROR: /* --- Error Processing and Logging section ------------------------------- */ /* ------------------------------------------------------------------------- */ ENDPGM: CHGVAR VAR(&LOGMSG) VALUE('DGrp(' *TCAT &DG_Name *TCAT ')' + *BCAT 'DG-Src(' *TCAT &DG_Source *TCAT ')' + *BCAT 'DG-Sts(' *TCAT &DG_Status *TCAT ')' + *BCAT 'DG-Bak(' *TCAT &DG_Backlog *TCAT ')' ) SNDPGMMSG MSG(&LOGMSG) RCLRSC LVL(*CALLER) ENDPGM
Comment