| 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
 | 
|---|