| 1 | HLUOPTF2 ;ALB/CJM-HL7 -Fast Purge ;02/04/2004 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | FAST1 ;entry point for FAST PURGE 1, called by the Event Monitor | 
|---|
| 5 | I '$$COUNT D PURGE | 
|---|
| 6 | Q | 
|---|
| 7 | FAST2 ;entry point for FAST PURGE 2, called by the Event Monitor | 
|---|
| 8 | I $$COUNT=1 D PURGE | 
|---|
| 9 | Q | 
|---|
| 10 | ; | 
|---|
| 11 | START ;Interactive entry point, asks user whether or not to queue the Fast Purge | 
|---|
| 12 | ; | 
|---|
| 13 | N ASK,STOP | 
|---|
| 14 | S STOP=1 | 
|---|
| 15 | S ASK=$$ASKYESNO^HLEMU("Do you want to queue the Fast Purge so that it operates in the background","YES") | 
|---|
| 16 | I ASK D | 
|---|
| 17 | .N ZTRTN,ZTDESC,ZTSAVE,ZTIO,ZTSK | 
|---|
| 18 | .S ZTRTN="PURGE^HLUOPTF2" | 
|---|
| 19 | .S ZTDESC="HL7 FAST PURGE UTILITY" | 
|---|
| 20 | .S ZTIO="" | 
|---|
| 21 | .S ZTSAVE("STOP")=1 | 
|---|
| 22 | .D ^%ZTLOAD | 
|---|
| 23 | .W !,$S($D(ZTSK):"HL7 FAST PURGE UTILITY QUEUED, TASK="_ZTSK,1:"REQUEST CANCELLED") | 
|---|
| 24 | E  I ASK=0 D | 
|---|
| 25 | .W !,"Starting Fast Purge....",! | 
|---|
| 26 | .D PURGE | 
|---|
| 27 | K ^TMP("HLEVFLAG",$J) | 
|---|
| 28 | Q | 
|---|
| 29 | STOP ; | 
|---|
| 30 | ;entry point to ask the Fast Purge Job to stop | 
|---|
| 31 | I $$COUNT>$G(^XTMP("HL7 FAST PURGE JOBS","STOP")),$$I^HLEMU($NA(^XTMP("HL7 FAST PURGE JOBS","STOP")),1) | 
|---|
| 32 | Q | 
|---|
| 33 | COUNT() ; | 
|---|
| 34 | ;returns the number of Fast Purge Jobs that are running | 
|---|
| 35 | N COUNT,I | 
|---|
| 36 | S COUNT=0 | 
|---|
| 37 | F I=1:1:20 D | 
|---|
| 38 | .L ^XTMP("HL7 FAST PURGE JOBS",I):0 | 
|---|
| 39 | .I '$T D | 
|---|
| 40 | ..S COUNT=COUNT+1 | 
|---|
| 41 | .E  D | 
|---|
| 42 | ..L -^XTMP("HL7 FAST PURGE JOBS",I) | 
|---|
| 43 | Q COUNT | 
|---|
| 44 | ; | 
|---|
| 45 | PURGE ;entry point for the FAST PURGE | 
|---|
| 46 | ; | 
|---|
| 47 | ;Variables: | 
|---|
| 48 | ;  CHECKAT - next time to check in with TaskMan, Job Monitor, andEvent Logging, set every 10 minutes | 
|---|
| 49 | ;  HOUR - the date and time to 1 hour precision that this process is currently purging, each hour is locked before purging | 
|---|
| 50 | ; IEN772 - entry in file 772 identified for purging | 
|---|
| 51 | ; IEN773 - entry in file 773 identified for purging | 
|---|
| 52 | ; LASTCHK - a simple count, the time is checked everytime this count reaches 500 - for efficiency, do not want to check the time after purging every entry | 
|---|
| 53 | ; CNT773 - count to report for EVENT LOGGING of entries purged (file 773) | 
|---|
| 54 | ; CNT772 - count to report for EVENT LOGGING of entries purged (file 772) | 
|---|
| 55 | ; QUIT - set to 1 when signaled to stop via TaskMan | 
|---|
| 56 | ; TIME - time currently being processed on the AI x-ref, file 773 | 
|---|
| 57 | ; | 
|---|
| 58 | ; | 
|---|
| 59 | I $G(STOP)=1 D | 
|---|
| 60 | .;setting this flag allows the job to run outside of Process Monitorng | 
|---|
| 61 | .S ^TMP("HLEVFLAG",$J)="STOP" | 
|---|
| 62 | ; | 
|---|
| 63 | N LCNT,CNT773,CNT772,HOUR,LASTCHK,TIME,IEN772,IEN773,CHECKAT,QUIT,VAR,I | 
|---|
| 64 | S (TIME,HOUR,CNT773,CNT772,LCOUNT,QUIT)=0 | 
|---|
| 65 | ; | 
|---|
| 66 | D START^HLEVAPI(.VAR) | 
|---|
| 67 | ; | 
|---|
| 68 | S CHECKAT=$$FMADD^XLFDT($$NOW^XLFDT,,,10) | 
|---|
| 69 | ; | 
|---|
| 70 | ;let everyone know that there is 1 more purge job running - maximum of 20 Fast Purges running at once | 
|---|
| 71 | F I=1:1:20 L ^XTMP("HL7 FAST PURGE JOBS",I):0 Q:$T | 
|---|
| 72 | ; | 
|---|
| 73 | ;loop until signaled to stop or there is no work for a while | 
|---|
| 74 | I $T F  D  Q:QUIT | 
|---|
| 75 | .S:'TIME HOUR=$$FINDHOUR(HOUR) S:HOUR TIME=HOUR-.00000001 | 
|---|
| 76 | .; | 
|---|
| 77 | .;wasn't able to get an hour to lock | 
|---|
| 78 | .I 'HOUR D  Q | 
|---|
| 79 | ..; | 
|---|
| 80 | ..;if there has been no work for a while then quit | 
|---|
| 81 | ..I $$NOW^XLFDT>CHECKAT,CNT773<2000 D | 
|---|
| 82 | ...S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT) | 
|---|
| 83 | ...S QUIT=1 | 
|---|
| 84 | ..E  D | 
|---|
| 85 | ...S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT) | 
|---|
| 86 | ...D EVENT(.CNT773,.CNT772) | 
|---|
| 87 | ...Q:QUIT | 
|---|
| 88 | ...D PAUSE | 
|---|
| 89 | .; | 
|---|
| 90 | .;at this point, an hour has been locked, so delete all the entries for that hour | 
|---|
| 91 | .F  S TIME=$O(^HLMA("AI",TIME)) D  Q:'TIME  Q:QUIT | 
|---|
| 92 | ..I ('TIME)!($E(TIME,1,10)>HOUR) S TIME=0 Q | 
|---|
| 93 | ..S LCOUNT=LCOUNT+1 | 
|---|
| 94 | ..I LCOUNT>500 S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT) Q:QUIT | 
|---|
| 95 | ..S (IEN772,IEN773)=0 | 
|---|
| 96 | ..F  S IEN773=$O(^HLMA("AI",TIME,773,IEN773)) Q:'IEN773  D | 
|---|
| 97 | ...S CNT773=CNT773+1 | 
|---|
| 98 | ...D DEL773^HLUOPT3(IEN773) | 
|---|
| 99 | ...; | 
|---|
| 100 | ..F  S IEN772=$O(^HLMA("AI",TIME,772,IEN772)) Q:'IEN772  D | 
|---|
| 101 | ...S CNT772=CNT772+1 | 
|---|
| 102 | ...D DEL772^HLUOPT3(IEN772) | 
|---|
| 103 | ..; | 
|---|
| 104 | ..; make sure that no more records are on this x-ref for that time - could only happen in the case of corruption of some sort | 
|---|
| 105 | ..K ^HLMA("AI",TIME) | 
|---|
| 106 | ; | 
|---|
| 107 | ;unlock the last hour currently being held | 
|---|
| 108 | L:HOUR -^HLMA("AI",HOUR) | 
|---|
| 109 | ; | 
|---|
| 110 | ;let everyone know that there is 1 less purge job running | 
|---|
| 111 | F I=1:1:20 L -^XTMP("HL7 FAST PURGE JOBS",I) | 
|---|
| 112 | D CHECKOUT^HLEVAPI | 
|---|
| 113 | K ^TMP("HLEVFLAG",$J) | 
|---|
| 114 | Q | 
|---|
| 115 | ; | 
|---|
| 116 | PAUSE ;sleep for 10 SECONDS | 
|---|
| 117 | H 10 | 
|---|
| 118 | Q | 
|---|
| 119 | ; | 
|---|
| 120 | CHECKIN(CHECKAT,CNT773,CNT772,LCOUNT) ; | 
|---|
| 121 | ;if NOW>CHECKAT then: | 
|---|
| 122 | ;  1) check in with TaskMan | 
|---|
| 123 | ;  2) send a new event to the event monitor | 
|---|
| 124 | ;  3) reset CHECKAT for 10 minutes in the future | 
|---|
| 125 | ;  4) as an alternative to TaskMan, check if special Stop Fast Purge option has been used | 
|---|
| 126 | ; | 
|---|
| 127 | ;Input: | 
|---|
| 128 | ;  CHECKAT - the end of the current 10 minute time period | 
|---|
| 129 | ;  CNT773 - number of records in file 773 purged since the last time Event Logging was updated | 
|---|
| 130 | ;  CNT772 - number of records in file 772 purged since the last time Event Logging was updated | 
|---|
| 131 | ;Output: | 
|---|
| 132 | ;   Function returns 1 if the Fast Purge should stop, 0 otherwise | 
|---|
| 133 | ;   LCOUNT is reset to 0 **pass by reference** | 
|---|
| 134 | ;   CNT773 and CNT772 are set to 0 if reported to Event Logging **pass by reference** | 
|---|
| 135 | ;   CHECKAT is reset to 10 minute sin the future if the time is up **pass by reference** | 
|---|
| 136 | ; | 
|---|
| 137 | N NOW,QUIT | 
|---|
| 138 | S QUIT=0 | 
|---|
| 139 | ; | 
|---|
| 140 | S NOW=$$NOW^XLFDT | 
|---|
| 141 | I NOW>CHECKAT D | 
|---|
| 142 | .D EVENT(.CNT773,.CNT772) | 
|---|
| 143 | .S CHECKAT=$$FMADD^XLFDT(NOW,,,10) | 
|---|
| 144 | .I '$D(ZTQUEUED) D | 
|---|
| 145 | ..W "." | 
|---|
| 146 | .E  D | 
|---|
| 147 | ..;check in with the Job Monitor | 
|---|
| 148 | ..D CHECKIN^HLEVAPI | 
|---|
| 149 | ..S QUIT=$$S^ZTLOAD | 
|---|
| 150 | ..S:QUIT ZTSTOP=1 | 
|---|
| 151 | ; | 
|---|
| 152 | ;Check if the special option has been used to stop the purge | 
|---|
| 153 | I $G(^XTMP("HL7 FAST PURGE JOBS","STOP"))>0 D | 
|---|
| 154 | .S QUIT=1 | 
|---|
| 155 | .I $$I^HLEMU($NA(^XTMP("HL7 FAST PURGE JOBS","STOP")),-1) | 
|---|
| 156 | ; | 
|---|
| 157 | S LCOUNT=0 | 
|---|
| 158 | Q QUIT | 
|---|
| 159 | ; | 
|---|
| 160 | FINDHOUR(HOUR) ; | 
|---|
| 161 | ;Finds the next dt/tm to the hour on the AI x-ref of file 773 that can be locked, returns 0 on failure | 
|---|
| 162 | N QUIT,NOW | 
|---|
| 163 | S QUIT=0 | 
|---|
| 164 | ; | 
|---|
| 165 | ;unlock the last hour currently being held | 
|---|
| 166 | L:HOUR -^HLMA("AI",HOUR) | 
|---|
| 167 | ; | 
|---|
| 168 | S NOW=$$NOW^XLFDT | 
|---|
| 169 | ; | 
|---|
| 170 | ;if this is the first time through then start with the first entry on the x-ref | 
|---|
| 171 | I 'HOUR D  Q:QUIT HOUR | 
|---|
| 172 | .S HOUR=$O(^HLMA("AI",0)) | 
|---|
| 173 | .; | 
|---|
| 174 | .;any records to purge? | 
|---|
| 175 | .I 'HOUR S QUIT=1 Q | 
|---|
| 176 | .; | 
|---|
| 177 | .;if so, quit if the next purgeable record is for the future | 
|---|
| 178 | .I HOUR>NOW S HOUR=0 Q | 
|---|
| 179 | .; | 
|---|
| 180 | .S HOUR=$E(HOUR,1,10) | 
|---|
| 181 | .L +^HLMA("AI",+HOUR):0 S:$T QUIT=1 | 
|---|
| 182 | ; | 
|---|
| 183 | S HOUR=$E(HOUR,1,10) | 
|---|
| 184 | F  D  Q:QUIT | 
|---|
| 185 | .; | 
|---|
| 186 | .;look for the next entry at least 1 hour in the future | 
|---|
| 187 | .S HOUR=$$FMADD^XLFDT(HOUR,,1)-.000000001 | 
|---|
| 188 | .S HOUR=$E($O(^HLMA("AI",HOUR)),1,10) | 
|---|
| 189 | .I 'HOUR S QUIT=1 Q | 
|---|
| 190 | .; | 
|---|
| 191 | .;I the hour is in the future then the entries can not yet be purged | 
|---|
| 192 | .I (HOUR>NOW) S HOUR=0,QUIT=1 Q | 
|---|
| 193 | .; | 
|---|
| 194 | .;check if this hour can be locked, if so this is the hour to be purged | 
|---|
| 195 | .L +^HLMA("AI",+HOUR):0 I $T S QUIT=1 | 
|---|
| 196 | ; | 
|---|
| 197 | Q HOUR | 
|---|
| 198 | ; | 
|---|
| 199 | EVENT(CNT773,CNT772) ; | 
|---|
| 200 | ;add the last number of records purged to event logging | 
|---|
| 201 | N EVENT | 
|---|
| 202 | I CNT773 D | 
|---|
| 203 | .S EVENT=$$EVENT^HLEME("773 PURGE","HEALTH LEVEL SEVEN") | 
|---|
| 204 | .I CNT773>1,$$INC^HLEME(EVENT,CNT773-1) | 
|---|
| 205 | .S CNT773=0 | 
|---|
| 206 | I CNT772 D | 
|---|
| 207 | .S EVENT=$$EVENT^HLEME("772 PURGE","HEALTH LEVEL SEVEN") | 
|---|
| 208 | .I CNT772>1,$$INC^HLEME(EVENT,CNT772-1) | 
|---|
| 209 | .S CNT772=0 | 
|---|
| 210 | Q | 
|---|
| 211 | ; | 
|---|
| 212 | CHECK1() ;called by the Master Job to determine whether | 
|---|
| 213 | ;FAST HL7 PURGE #1 should run. | 
|---|
| 214 | ;Output: | 
|---|
| 215 | ;  function returns 1 if yes, 0 if no | 
|---|
| 216 | ; | 
|---|
| 217 | I $$COUNT^HLEVAPI3("FAST HL7 PURGE #1") | 
|---|
| 218 | Q '$T | 
|---|
| 219 | ; | 
|---|
| 220 | CHECK2() ;called by the Master Job to determine whether | 
|---|
| 221 | ;FAST HL7 PURGE #2 should run. | 
|---|
| 222 | ;Output: | 
|---|
| 223 | ;  function returns 1 if yes, 0 if no | 
|---|
| 224 | ; | 
|---|
| 225 | I $$COUNT^HLEVAPI3("FAST HL7 PURGE #1"),'$$COUNT^HLEVAPI3("FAST HL7 PURGE #2") | 
|---|
| 226 | Q $T | 
|---|