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