| 1 | HLEVMST ;O-OIFO/LJA - Event Monitor MASTER JOB ;02/04/2004 14:42 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Calling STARTJOB always queues a new master job NOW... | 
|---|
| 5 | ; | 
|---|
| 6 | MSTENV ; Display environment to user... | 
|---|
| 7 | ; | 
|---|
| 8 | ; | 
|---|
| 9 | ; Collect Master Job Information | 
|---|
| 10 | ; | 
|---|
| 11 | ; | 
|---|
| 12 | ; Collect Active Event Monitors | 
|---|
| 13 | ; | 
|---|
| 14 | ; | 
|---|
| 15 | Q | 
|---|
| 16 | ; | 
|---|
| 17 | CHECKMST ; Called from outside Event Monitoring, from the Link Manager, | 
|---|
| 18 | ; to see if the master job needs to be started.  (See ^HLCSLM.) | 
|---|
| 19 | ; When the Link Manager calls here, two actions potentially occur: | 
|---|
| 20 | ; | 
|---|
| 21 | ; * Check is made whether this CHECKMST code has been run before, | 
|---|
| 22 | ;   and if so, how long ago.  This check is performed by $$TIMECHK. | 
|---|
| 23 | ; * If never run, or if run more than four hours ago, CHECKMST is run. | 
|---|
| 24 | ; | 
|---|
| 25 | ; CHECKMST checks whether a master job is running, or is properly | 
|---|
| 26 | ; queued.  If not, it queues a master job. | 
|---|
| 27 | ; | 
|---|
| 28 | N LAPSE,LASTDT,LASTIEN,NODE,PAR0,RUNOW,RUNTIME,X | 
|---|
| 29 | ; | 
|---|
| 30 | QUIT:'$$TIMECHK  ;-> | 
|---|
| 31 | ; | 
|---|
| 32 | ; Set last check time for later use by $$TIMECHK... | 
|---|
| 33 | S HLEVLCHK(1)=$$SEC^HLEVMST0($H) | 
|---|
| 34 | ; | 
|---|
| 35 | ; Parameter status check... | 
|---|
| 36 | S PAR0=$G(^HLEV(776.999,1,0)) Q:PAR0']""  ;-> | 
|---|
| 37 | I $P(PAR0,U,2)'="A" D  QUIT  ;-> Not ACTIVE... | 
|---|
| 38 | .  D SHOWQUIT("Master job not started.  Parameter STATUS is INACTIVE...") | 
|---|
| 39 | ; | 
|---|
| 40 | ; Lapse (since last run) check... | 
|---|
| 41 | S LAPSE=$P(PAR0,U,3) I LAPSE'>0 D  QUIT  ;-> | 
|---|
| 42 | .  D SHOWQUIT("Master job not started.  Master Job Interval not set up...") | 
|---|
| 43 | ; Get IEN for last master job run | 
|---|
| 44 | S LASTDT=$O(^HLEV(776.2,"B",":"),-1) | 
|---|
| 45 | S LASTIEN=$O(^HLEV(776.2,"B",+LASTDT,":"),-1) | 
|---|
| 46 | ; | 
|---|
| 47 | I LASTIEN'>0 D STARTJOB QUIT  ;-> | 
|---|
| 48 | S NODE=$G(^HLEV(776.2,+LASTIEN,0)) | 
|---|
| 49 | S X=$P(NODE,U,4) I X="E"!(X="P") D STARTJOB QUIT  ;-> | 
|---|
| 50 | S RUNTIME=$P(NODE,U,6) ; Queue time for last run... | 
|---|
| 51 | S RUNOW=$$RUNEV^HLEVAPI0(RUNTIME,LAPSE+15) ; No start unless 15" overdue | 
|---|
| 52 | I RUNOW D STARTJOB QUIT  ;-> 15" overdue!!  So, start master job | 
|---|
| 53 | D SHOWQUIT("Master job not started.  Not time yet...") | 
|---|
| 54 | ; | 
|---|
| 55 | Q | 
|---|
| 56 | ; | 
|---|
| 57 | TIMECHK() ; Every loop in the Link Manager code in HLCSLM results in one | 
|---|
| 58 | ; call being made to CHECKMST^HLEVMST.  The CHECKMST subroutine in turn | 
|---|
| 59 | ; calls here to ensure that the Event Monitor's master job is running | 
|---|
| 60 | ; properly.  However, the CHECKMST subroutine should be run by HLCSLM | 
|---|
| 61 | ; only once every four hours.  The code in this subroutine uses | 
|---|
| 62 | ; HLEVLCHK(#) variables to ensure that this every four hour rule is | 
|---|
| 63 | ; followed.  (HLEVLCHK is newed at the top of HLCSLM.) | 
|---|
| 64 | ; | 
|---|
| 65 | ; Set the time NOW in seconds... | 
|---|
| 66 | S HLEVLCHK(0)=$$SEC^HLEVMST0($H) | 
|---|
| 67 | ; | 
|---|
| 68 | ; This is the time of last check.  Make sure it exists... | 
|---|
| 69 | S HLEVLCHK(1)=$G(HLEVLCHK(1)) | 
|---|
| 70 | ; | 
|---|
| 71 | ; If no check every made, make a check now... | 
|---|
| 72 | I HLEVLCHK(1)'>0 QUIT 1 ;-> | 
|---|
| 73 | ; | 
|---|
| 74 | ; Set the number seconds between NOW and time of last check... | 
|---|
| 75 | S HLEVLCHK(3)=HLEVLCHK(0)-HLEVLCHK(1) ; DIFF = NOW - LAST CHECK | 
|---|
| 76 | ; | 
|---|
| 77 | ; If less than 4 hours since last check, quit w/no check... | 
|---|
| 78 | QUIT:HLEVLCHK(3)<(60*60*4) "" ;-> | 
|---|
| 79 | ; | 
|---|
| 80 | Q 1 ; Check should be made... | 
|---|
| 81 | ; | 
|---|
| 82 | SHOWQUIT(TXT) QUIT:$D(ZTQUEUED)  ;-> | 
|---|
| 83 | W !!,TXT,! | 
|---|
| 84 | Q | 
|---|
| 85 | ; | 
|---|
| 86 | STARTJOB ; Start a new job with optional display to screen... | 
|---|
| 87 | N JOBS | 
|---|
| 88 | S JOBS=$$NEWMSTR(0,1) QUIT:$D(ZTQUEUED)  ;-> | 
|---|
| 89 | W !!,"New master job queued to task# ",+JOBS,"..." | 
|---|
| 90 | W !,"Entry #",$P(JOBS,U,2)," created in HL7 Monitor Master Job file..." | 
|---|
| 91 | Q | 
|---|
| 92 | ; | 
|---|
| 93 | MASTER ; Whenever a master job starts, here's where it's queued... | 
|---|
| 94 | ; HLEVIENM - req | 
|---|
| 95 | ; | 
|---|
| 96 | N D,D0,DA,DIE,DR,FLD,NOEVCHK,NOPURG,NOW,RES,ZTSKMST | 
|---|
| 97 | ; | 
|---|
| 98 | S ZTREQ="@",NOW=$$NOW^XLFDT | 
|---|
| 99 | ; | 
|---|
| 100 | S ZTSKMST=$G(ZTSK) QUIT:ZTSKMST'>0  ;-> | 
|---|
| 101 | ; | 
|---|
| 102 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']""  ;-> | 
|---|
| 103 | ; | 
|---|
| 104 | ; Check parameter... | 
|---|
| 105 | I $P($G(^HLEV(776.999,1,0)),U,2)'="A" D  QUIT  ;-> | 
|---|
| 106 | .  F FLD=2,3,8 D UPDFLDM(+HLEVIENM,FLD,NOW) | 
|---|
| 107 | .  D UPDFLDM(+HLEVIENM,4,"A") | 
|---|
| 108 | ; | 
|---|
| 109 | ; Give (possibly just executed) $$NEWMSTR(0) DIE call time to execute... | 
|---|
| 110 | H 2 | 
|---|
| 111 | ; | 
|---|
| 112 | ; Queue next job... | 
|---|
| 113 | S NEWJOB=$$NEWMSTR(1) | 
|---|
| 114 | ; | 
|---|
| 115 | ; What if job requested to stop? | 
|---|
| 116 | I $P($G(^HLEV(776.2,+HLEVIENM,0)),U,4)="S" D  QUIT  ;-> | 
|---|
| 117 | .  F FLD=2,3,8 D UPDFLDM(+HLEVIENM,FLD,NOW) | 
|---|
| 118 | .  D UPDFLDM(+HLEVIENM,4,"A") | 
|---|
| 119 | ; | 
|---|
| 120 | ; Mark entry to show it successfully started... | 
|---|
| 121 | D UPDFLDM(+HLEVIENM,4,"R") | 
|---|
| 122 | F FLD=3,8 D UPDFLDM(+HLEVIENM,FLD,NOW) | 
|---|
| 123 | D UPDFLDM(+HLEVIENM,50,"Queued job started at "_$$NOW^XLFDT) | 
|---|
| 124 | ; | 
|---|
| 125 | ; Work starts here... | 
|---|
| 126 | KILL NOEVCHK | 
|---|
| 127 | S NOEVCHK=0 | 
|---|
| 128 | D EVENTCHK^HLEVAPI0(+HLEVIENM) | 
|---|
| 129 | ; | 
|---|
| 130 | ; Purge MONITOR and MASTER entries... | 
|---|
| 131 | D PURGEALL^HLEVUTIL(+HLEVIENM) | 
|---|
| 132 | ; | 
|---|
| 133 | ; Mark ERROR any monitors still RUNNING by not current.. | 
|---|
| 134 | D MARKERR^HLEVAPI3 | 
|---|
| 135 | ; | 
|---|
| 136 | ; Done... | 
|---|
| 137 | D UPDFLDM(+HLEVIENM,2,$$NOW^XLFDT) | 
|---|
| 138 | D UPDFLDM(+HLEVIENM,4,"F") | 
|---|
| 139 | D UPDFLDM(+HLEVIENM,50,"Queued job finished at "_$$NOW^XLFDT) | 
|---|
| 140 | D UPDFLDM(+HLEVIENM,50,"# events checked = "_$G(NOEVCHK)) | 
|---|
| 141 | S RES="" | 
|---|
| 142 | F  S RES=$O(NOEVCHK(RES)) Q:RES']""  D | 
|---|
| 143 | .  S RES(1)=$S(RES="E":" were not queued (too early.)",RES="I":" were not queued (inactivated.)",RES="Q":" were queued to execute.",RES="R":" Previous job still running.",RES="X":" errored, for some reason.",1:" have unknown disposition.") | 
|---|
| 144 | .  I RES="M" S RES(1)=" M code check failed." | 
|---|
| 145 | .  S RES(1)="#"_NOEVCHK(RES)_" Events"_RES(1) | 
|---|
| 146 | .  D UPDFLDM(+HLEVIENM,50,RES(1)) | 
|---|
| 147 | ; | 
|---|
| 148 | Q | 
|---|
| 149 | ; | 
|---|
| 150 | NEWMSTR(FUTURE,SILENT) ; Create a new master job... | 
|---|
| 151 | ; | 
|---|
| 152 | ; If FUTURE=0, then master job will be queued for NOW... | 
|---|
| 153 | ; If FUTURE=1, then master job will be q'd for CUTMIN in future... | 
|---|
| 154 | ; | 
|---|
| 155 | N CUTMIN,DA,DIC,DIE,DD,DO,DR,HLEVIENM,X,Y,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSK | 
|---|
| 156 | ; | 
|---|
| 157 | ; Should this process be silent? | 
|---|
| 158 | S SILENT=$S($G(SILENT)>0:1,1:0) | 
|---|
| 159 | ; | 
|---|
| 160 | ; Check parameter... | 
|---|
| 161 | I $P($G(^HLEV(776.999,1,0)),U,2)'="A" D  QUIT "" ;-> | 
|---|
| 162 | .  QUIT:$D(ZTQUEUED)!(SILENT)  ;-> | 
|---|
| 163 | .  W !!,"Exiting!  Master job not started.  Parameter turned off..." | 
|---|
| 164 | .  H 2 | 
|---|
| 165 | ; | 
|---|
| 166 | ; Make master stub entry... | 
|---|
| 167 | S X=$$NOW^XLFDT,DIC="^HLEV(776.2,",DIC(0)="L" | 
|---|
| 168 | D FILE^DICN | 
|---|
| 169 | S HLEVIENM=$S(+Y>0:+Y,1:"") I HLEVIENM'>0 D  QUIT "" ;-> | 
|---|
| 170 | .  QUIT:$D(ZTQUEUED)!(SILENT)  ;-> | 
|---|
| 171 | .  W !!,"Exiting!  Master job not started.  Stub record creation failed..." | 
|---|
| 172 | .  H 2 | 
|---|
| 173 | ; | 
|---|
| 174 | ; Get CUTMIN and queue new job... | 
|---|
| 175 | S CUTMIN=$H ; Default to NOW... | 
|---|
| 176 | I $G(FUTURE) D | 
|---|
| 177 | .  S CUTMIN=$O(^HLEV(776.999,":"),-1),CUTMIN=$P($G(^HLEV(776.999,+CUTMIN,0)),U,3) | 
|---|
| 178 | .  S CUTMIN=$S(CUTMIN:CUTMIN,1:60) ; Default to 60 minutes between jobs... | 
|---|
| 179 | .  S CUTMIN=$$FMTH^XLFDT($$FMADD^XLFDT($$NOW^XLFDT,0,0,CUTMIN)) | 
|---|
| 180 | S ZTIO="",ZTDTH=CUTMIN,ZTDESC="HL Master Job - Event Monitoring" | 
|---|
| 181 | S ZTRTN="MASTER^HLEVMST" | 
|---|
| 182 | S ZTSAVE("HLEVIENM")="" | 
|---|
| 183 | D ^%ZTLOAD | 
|---|
| 184 | ; | 
|---|
| 185 | ; Store task #, etc... | 
|---|
| 186 | KILL DA,DD,DIC,DO,X,Y | 
|---|
| 187 | S DA=+HLEVIENM,DIE=776.2,DR="4///Q;5///"_ZTSK_";6////"_$$HTFM^XLFDT(CUTMIN)_";7////"_+DUZ | 
|---|
| 188 | D ^DIE | 
|---|
| 189 | ; | 
|---|
| 190 | I '$D(ZTQUEUED)&('SILENT) D | 
|---|
| 191 | .  W !!,"Master job created.  Task# ",ZTSK,", and Event# ",HLEVIENM,"..." | 
|---|
| 192 | .  H 2 | 
|---|
| 193 | ; | 
|---|
| 194 | QUIT $G(ZTSK)_U_HLEVIENM | 
|---|
| 195 | ; | 
|---|
| 196 | UPDFLDM(HLEVIENM,FLD,VAL) ; Update a specific piece in 776.2... | 
|---|
| 197 | N D,D0,DA,DI,DIE,DR | 
|---|
| 198 | ; | 
|---|
| 199 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']""!($G(VAL)']"")  ;-> | 
|---|
| 200 | ; | 
|---|
| 201 | ; Call call here to store one 50 diary entry.  (Required that | 
|---|
| 202 | ; FLD=50 and VAL=Text to store on line.  Must call here one time | 
|---|
| 203 | ; for every line to be stored.) | 
|---|
| 204 | I FLD=50 D  QUIT  ;->  Call call here to store one 50 diary entry | 
|---|
| 205 | .  S NODE=$G(^HLEV(776.2,+HLEVIENM,50,0)) | 
|---|
| 206 | .  S:NODE']"" NODE="^776.201^^" | 
|---|
| 207 | .  S CT=$O(^HLEV(776.2,+HLEVIENM,50,":"),-1)+1 | 
|---|
| 208 | .  S $P(NODE,U,3)=CT,$P(NODE,U,4)=CT | 
|---|
| 209 | .  S ^HLEV(776.2,+HLEVIENM,50,0)=NODE | 
|---|
| 210 | .  S ^HLEV(776.2,+HLEVIENM,50,+CT,0)=VAL | 
|---|
| 211 | ; | 
|---|
| 212 | I FLD=51 QUIT  ;-> Not allowed! | 
|---|
| 213 | ; | 
|---|
| 214 | ; Store zero node information... | 
|---|
| 215 | S DA=+HLEVIENM,DIE=776.2,DR=FLD_"///"_VAL | 
|---|
| 216 | D ^DIE | 
|---|
| 217 | ; | 
|---|
| 218 | Q | 
|---|
| 219 | ; | 
|---|
| 220 | STAMPM(HLEVIENM) ; Update TIMESTAMP field in event.. | 
|---|
| 221 | N D,D0,DA,DI,DIE,DR | 
|---|
| 222 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']""  ;-> | 
|---|
| 223 | S DA=+HLEVIENM,DIE=776.2,DR="3////"_$$NOW^XLFDT | 
|---|
| 224 | D ^DIE | 
|---|
| 225 | Q | 
|---|
| 226 | ; | 
|---|
| 227 | PURGEM(HLEVIENM) ; Purge master job entries... | 
|---|
| 228 | N CUTIME,IENM,LOOPTM,NOPURG,RETHRM | 
|---|
| 229 | ; | 
|---|
| 230 | ; Check parameter... | 
|---|
| 231 | QUIT:$P($G(^HLEV(776.999,1,0)),U,2)'="A" "" ;-> | 
|---|
| 232 | ; | 
|---|
| 233 | S NOPURG=0 | 
|---|
| 234 | ; | 
|---|
| 235 | ; Get retention time (HR) for master job data... | 
|---|
| 236 | S RETHRM=$O(^HLEV(776.999,":"),-1) | 
|---|
| 237 | S RETHRM=$P($G(^HLEV(776.999,+RETHRM,0)),U,5) | 
|---|
| 238 | S RETHRM=$S(RETHRM>0:RETHRM,1:96) ; Default to 96 hours | 
|---|
| 239 | ; | 
|---|
| 240 | ; Cutoff time... | 
|---|
| 241 | S CUTIME=$$FMADD^XLFDT($$NOW^XLFDT,0,-RETHRM) | 
|---|
| 242 | ; | 
|---|
| 243 | F  S CUTIME=$O(^HLEV(776.2,"B",CUTIME),-1) Q:CUTIME'>0  D | 
|---|
| 244 | .  S IEN=0 | 
|---|
| 245 | .  F  S IEN=$O(^HLEV(776.2,"B",CUTIME,IEN)) Q:IEN'>0  D | 
|---|
| 246 | .  .  QUIT:IEN=HLEVIENM  ;-> Don't delete yourself!! | 
|---|
| 247 | .  .  S NOPURG=NOPURG+1 | 
|---|
| 248 | .  .  D PURGEME^HLEVUTIL(+IEN) ; Delete events in master job... | 
|---|
| 249 | .  .  D DELETE^HLEVUTIL(776.2,+IEN) | 
|---|
| 250 | ; | 
|---|
| 251 | Q NOPURG | 
|---|
| 252 | ; | 
|---|
| 253 | EOR ;HLEVMST - Event Monitor MASTER JOB ;5/16/03 14:42 | 
|---|