HLUOPTF2 ;ALB/CJM-HL7 -Fast Purge ;02/04/2004
;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
;
FAST1 ;entry point for FAST PURGE 1, called by the Event Monitor
I '$$COUNT D PURGE
Q
FAST2 ;entry point for FAST PURGE 2, called by the Event Monitor
I $$COUNT=1 D PURGE
Q
;
START ;Interactive entry point, asks user whether or not to queue the Fast Purge
;
N ASK,STOP
S STOP=1
S ASK=$$ASKYESNO^HLEMU("Do you want to queue the Fast Purge so that it operates in the background","YES")
I ASK D
.N ZTRTN,ZTDESC,ZTSAVE,ZTIO,ZTSK
.S ZTRTN="PURGE^HLUOPTF2"
.S ZTDESC="HL7 FAST PURGE UTILITY"
.S ZTIO=""
.S ZTSAVE("STOP")=1
.D ^%ZTLOAD
.W !,$S($D(ZTSK):"HL7 FAST PURGE UTILITY QUEUED, TASK="_ZTSK,1:"REQUEST CANCELLED")
E I ASK=0 D
.W !,"Starting Fast Purge....",!
.D PURGE
K ^TMP("HLEVFLAG",$J)
Q
STOP ;
;entry point to ask the Fast Purge Job to stop
I $$COUNT>$G(^XTMP("HL7 FAST PURGE JOBS","STOP")),$$I^HLEMU($NA(^XTMP("HL7 FAST PURGE JOBS","STOP")),1)
Q
COUNT() ;
;returns the number of Fast Purge Jobs that are running
N COUNT,I
S COUNT=0
F I=1:1:20 D
.L ^XTMP("HL7 FAST PURGE JOBS",I):0
.I '$T D
..S COUNT=COUNT+1
.E D
..L -^XTMP("HL7 FAST PURGE JOBS",I)
Q COUNT
;
PURGE ;entry point for the FAST PURGE
;
;Variables:
; CHECKAT - next time to check in with TaskMan, Job Monitor, andEvent Logging, set every 10 minutes
; HOUR - the date and time to 1 hour precision that this process is currently purging, each hour is locked before purging
; IEN772 - entry in file 772 identified for purging
; IEN773 - entry in file 773 identified for purging
; 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
; CNT773 - count to report for EVENT LOGGING of entries purged (file 773)
; CNT772 - count to report for EVENT LOGGING of entries purged (file 772)
; QUIT - set to 1 when signaled to stop via TaskMan
; TIME - time currently being processed on the AI x-ref, file 773
;
;
I $G(STOP)=1 D
.;setting this flag allows the job to run outside of Process Monitorng
.S ^TMP("HLEVFLAG",$J)="STOP"
;
N LCNT,CNT773,CNT772,HOUR,LASTCHK,TIME,IEN772,IEN773,CHECKAT,QUIT,VAR,I
S (TIME,HOUR,CNT773,CNT772,LCOUNT,QUIT)=0
;
D START^HLEVAPI(.VAR)
;
S CHECKAT=$$FMADD^XLFDT($$NOW^XLFDT,,,10)
;
;let everyone know that there is 1 more purge job running - maximum of 20 Fast Purges running at once
F I=1:1:20 L ^XTMP("HL7 FAST PURGE JOBS",I):0 Q:$T
;
;loop until signaled to stop or there is no work for a while
I $T F D Q:QUIT
.S:'TIME HOUR=$$FINDHOUR(HOUR) S:HOUR TIME=HOUR-.00000001
.;
.;wasn't able to get an hour to lock
.I 'HOUR D Q
..;
..;if there has been no work for a while then quit
..I $$NOW^XLFDT>CHECKAT,CNT773<2000 D
...S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT)
...S QUIT=1
..E D
...S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT)
...D EVENT(.CNT773,.CNT772)
...Q:QUIT
...D PAUSE
.;
.;at this point, an hour has been locked, so delete all the entries for that hour
.F S TIME=$O(^HLMA("AI",TIME)) D Q:'TIME Q:QUIT
..I ('TIME)!($E(TIME,1,10)>HOUR) S TIME=0 Q
..S LCOUNT=LCOUNT+1
..I LCOUNT>500 S QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT) Q:QUIT
..S (IEN772,IEN773)=0
..F S IEN773=$O(^HLMA("AI",TIME,773,IEN773)) Q:'IEN773 D
...S CNT773=CNT773+1
...D DEL773^HLUOPT3(IEN773)
...;
..F S IEN772=$O(^HLMA("AI",TIME,772,IEN772)) Q:'IEN772 D
...S CNT772=CNT772+1
...D DEL772^HLUOPT3(IEN772)
..;
..; 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
..K ^HLMA("AI",TIME)
;
;unlock the last hour currently being held
L:HOUR -^HLMA("AI",HOUR)
;
;let everyone know that there is 1 less purge job running
F I=1:1:20 L -^XTMP("HL7 FAST PURGE JOBS",I)
D CHECKOUT^HLEVAPI
K ^TMP("HLEVFLAG",$J)
Q
;
PAUSE ;sleep for 10 SECONDS
H 10
Q
;
CHECKIN(CHECKAT,CNT773,CNT772,LCOUNT) ;
;if NOW>CHECKAT then:
; 1) check in with TaskMan
; 2) send a new event to the event monitor
; 3) reset CHECKAT for 10 minutes in the future
; 4) as an alternative to TaskMan, check if special Stop Fast Purge option has been used
;
;Input:
; CHECKAT - the end of the current 10 minute time period
; CNT773 - number of records in file 773 purged since the last time Event Logging was updated
; CNT772 - number of records in file 772 purged since the last time Event Logging was updated
;Output:
; Function returns 1 if the Fast Purge should stop, 0 otherwise
; LCOUNT is reset to 0 **pass by reference**
; CNT773 and CNT772 are set to 0 if reported to Event Logging **pass by reference**
; CHECKAT is reset to 10 minute sin the future if the time is up **pass by reference**
;
N NOW,QUIT
S QUIT=0
;
S NOW=$$NOW^XLFDT
I NOW>CHECKAT D
.D EVENT(.CNT773,.CNT772)
.S CHECKAT=$$FMADD^XLFDT(NOW,,,10)
.I '$D(ZTQUEUED) D
..W "."
.E D
..;check in with the Job Monitor
..D CHECKIN^HLEVAPI
..S QUIT=$$S^ZTLOAD
..S:QUIT ZTSTOP=1
;
;Check if the special option has been used to stop the purge
I $G(^XTMP("HL7 FAST PURGE JOBS","STOP"))>0 D
.S QUIT=1
.I $$I^HLEMU($NA(^XTMP("HL7 FAST PURGE JOBS","STOP")),-1)
;
S LCOUNT=0
Q QUIT
;
FINDHOUR(HOUR) ;
;Finds the next dt/tm to the hour on the AI x-ref of file 773 that can be locked, returns 0 on failure
N QUIT,NOW
S QUIT=0
;
;unlock the last hour currently being held
L:HOUR -^HLMA("AI",HOUR)
;
S NOW=$$NOW^XLFDT
;
;if this is the first time through then start with the first entry on the x-ref
I 'HOUR D Q:QUIT HOUR
.S HOUR=$O(^HLMA("AI",0))
.;
.;any records to purge?
.I 'HOUR S QUIT=1 Q
.;
.;if so, quit if the next purgeable record is for the future
.I HOUR>NOW S HOUR=0 Q
.;
.S HOUR=$E(HOUR,1,10)
.L +^HLMA("AI",+HOUR):0 S:$T QUIT=1
;
S HOUR=$E(HOUR,1,10)
F D Q:QUIT
.;
.;look for the next entry at least 1 hour in the future
.S HOUR=$$FMADD^XLFDT(HOUR,,1)-.000000001
.S HOUR=$E($O(^HLMA("AI",HOUR)),1,10)
.I 'HOUR S QUIT=1 Q
.;
.;I the hour is in the future then the entries can not yet be purged
.I (HOUR>NOW) S HOUR=0,QUIT=1 Q
.;
.;check if this hour can be locked, if so this is the hour to be purged
.L +^HLMA("AI",+HOUR):0 I $T S QUIT=1
;
Q HOUR
;
EVENT(CNT773,CNT772) ;
;add the last number of records purged to event logging
N EVENT
I CNT773 D
.S EVENT=$$EVENT^HLEME("773 PURGE","HEALTH LEVEL SEVEN")
.I CNT773>1,$$INC^HLEME(EVENT,CNT773-1)
.S CNT773=0
I CNT772 D
.S EVENT=$$EVENT^HLEME("772 PURGE","HEALTH LEVEL SEVEN")
.I CNT772>1,$$INC^HLEME(EVENT,CNT772-1)
.S CNT772=0
Q
;
CHECK1() ;called by the Master Job to determine whether
;FAST HL7 PURGE #1 should run.
;Output:
; function returns 1 if yes, 0 if no
;
I $$COUNT^HLEVAPI3("FAST HL7 PURGE #1")
Q '$T
;
CHECK2() ;called by the Master Job to determine whether
;FAST HL7 PURGE #2 should run.
;Output:
; function returns 1 if yes, 0 if no
;
I $$COUNT^HLEVAPI3("FAST HL7 PURGE #1"),'$$COUNT^HLEVAPI3("FAST HL7 PURGE #2")
Q $T
HLUOPTF2 ;ALB/CJM-HL7 -Fast Purge ;02/04/2004
+1 ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
+2 ;
FAST1 ;entry point for FAST PURGE 1, called by the Event Monitor
+1 IF '$$COUNT
DO PURGE
+2 QUIT
FAST2 ;entry point for FAST PURGE 2, called by the Event Monitor
+1 IF $$COUNT=1
DO PURGE
+2 QUIT
+3 ;
START ;Interactive entry point, asks user whether or not to queue the Fast Purge
+1 ;
+2 NEW ASK,STOP
+3 SET STOP=1
+4 SET ASK=$$ASKYESNO^HLEMU("Do you want to queue the Fast Purge so that it operates in the background","YES")
+5 IF ASK
Begin DoDot:1
+6 NEW ZTRTN,ZTDESC,ZTSAVE,ZTIO,ZTSK
+7 SET ZTRTN="PURGE^HLUOPTF2"
+8 SET ZTDESC="HL7 FAST PURGE UTILITY"
+9 SET ZTIO=""
+10 SET ZTSAVE("STOP")=1
+11 DO ^%ZTLOAD
+12 WRITE !,$SELECT($DATA(ZTSK):"HL7 FAST PURGE UTILITY QUEUED, TASK="_ZTSK,1:"REQUEST CANCELLED")
End DoDot:1
+13 IF '$TEST
IF ASK=0
Begin DoDot:1
+14 WRITE !,"Starting Fast Purge....",!
+15 DO PURGE
End DoDot:1
+16 KILL ^TMP("HLEVFLAG",$JOB)
+17 QUIT
STOP ;
+1 ;entry point to ask the Fast Purge Job to stop
+2 IF $$COUNT>$G(^XTMP("HL7 FAST PURGE JOBS","STOP"))
IF $$I^HLEMU($NAME(^XTMP("HL7 FAST PURGE JOBS","STOP")),1)
+3 QUIT
COUNT() ;
+1 ;returns the number of Fast Purge Jobs that are running
+2 NEW COUNT,I
+3 SET COUNT=0
+4 FOR I=1:1:20
Begin DoDot:1
+5 LOCK ^XTMP("HL7 FAST PURGE JOBS",I):0
+6 IF '$TEST
Begin DoDot:2
+7 SET COUNT=COUNT+1
End DoDot:2
+8 IF '$TEST
Begin DoDot:2
+9 LOCK -^XTMP("HL7 FAST PURGE JOBS",I)
End DoDot:2
End DoDot:1
+10 QUIT COUNT
+11 ;
PURGE ;entry point for the FAST PURGE
+1 ;
+2 ;Variables:
+3 ; CHECKAT - next time to check in with TaskMan, Job Monitor, andEvent Logging, set every 10 minutes
+4 ; HOUR - the date and time to 1 hour precision that this process is currently purging, each hour is locked before purging
+5 ; IEN772 - entry in file 772 identified for purging
+6 ; IEN773 - entry in file 773 identified for purging
+7 ; 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
+8 ; CNT773 - count to report for EVENT LOGGING of entries purged (file 773)
+9 ; CNT772 - count to report for EVENT LOGGING of entries purged (file 772)
+10 ; QUIT - set to 1 when signaled to stop via TaskMan
+11 ; TIME - time currently being processed on the AI x-ref, file 773
+12 ;
+13 ;
+14 IF $GET(STOP)=1
Begin DoDot:1
+15 ;setting this flag allows the job to run outside of Process Monitorng
+16 SET ^TMP("HLEVFLAG",$JOB)="STOP"
End DoDot:1
+17 ;
+18 NEW LCNT,CNT773,CNT772,HOUR,LASTCHK,TIME,IEN772,IEN773,CHECKAT,QUIT,VAR,I
+19 SET (TIME,HOUR,CNT773,CNT772,LCOUNT,QUIT)=0
+20 ;
+21 DO START^HLEVAPI(.VAR)
+22 ;
+23 SET CHECKAT=$$FMADD^XLFDT($$NOW^XLFDT,,,10)
+24 ;
+25 ;let everyone know that there is 1 more purge job running - maximum of 20 Fast Purges running at once
+26 FOR I=1:1:20
LOCK ^XTMP("HL7 FAST PURGE JOBS",I):0
IF $TEST
QUIT
+27 ;
+28 ;loop until signaled to stop or there is no work for a while
+29 IF $TEST
FOR
Begin DoDot:1
+30 IF 'TIME
SET HOUR=$$FINDHOUR(HOUR)
IF HOUR
SET TIME=HOUR-.00000001
+31 ;
+32 ;wasn't able to get an hour to lock
+33 IF 'HOUR
Begin DoDot:2
+34 ;
+35 ;if there has been no work for a while then quit
+36 IF $$NOW^XLFDT>CHECKAT
IF CNT773<2000
Begin DoDot:3
+37 SET QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT)
+38 SET QUIT=1
End DoDot:3
+39 IF '$TEST
Begin DoDot:3
+40 SET QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT)
+41 DO EVENT(.CNT773,.CNT772)
+42 IF QUIT
QUIT
+43 DO PAUSE
End DoDot:3
End DoDot:2
QUIT
+44 ;
+45 ;at this point, an hour has been locked, so delete all the entries for that hour
+46 FOR
SET TIME=$ORDER(^HLMA("AI",TIME))
Begin DoDot:2
+47 IF ('TIME)!($EXTRACT(TIME,1,10)>HOUR)
SET TIME=0
QUIT
+48 SET LCOUNT=LCOUNT+1
+49 IF LCOUNT>500
SET QUIT=$$CHECKIN(.CHECKAT,.CNT773,.CNT772,.LCOUNT)
IF QUIT
QUIT
+50 SET (IEN772,IEN773)=0
+51 FOR
SET IEN773=$ORDER(^HLMA("AI",TIME,773,IEN773))
IF 'IEN773
QUIT
Begin DoDot:3
+52 SET CNT773=CNT773+1
+53 DO DEL773^HLUOPT3(IEN773)
+54 ;
End DoDot:3
+55 FOR
SET IEN772=$ORDER(^HLMA("AI",TIME,772,IEN772))
IF 'IEN772
QUIT
Begin DoDot:3
+56 SET CNT772=CNT772+1
+57 DO DEL772^HLUOPT3(IEN772)
End DoDot:3
+58 ;
+59 ; 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
+60 KILL ^HLMA("AI",TIME)
End DoDot:2
IF 'TIME
QUIT
IF QUIT
QUIT
End DoDot:1
IF QUIT
QUIT
+61 ;
+62 ;unlock the last hour currently being held
+63 IF HOUR
LOCK -^HLMA("AI",HOUR)
+64 ;
+65 ;let everyone know that there is 1 less purge job running
+66 FOR I=1:1:20
LOCK -^XTMP("HL7 FAST PURGE JOBS",I)
+67 DO CHECKOUT^HLEVAPI
+68 KILL ^TMP("HLEVFLAG",$JOB)
+69 QUIT
+70 ;
PAUSE ;sleep for 10 SECONDS
+1 HANG 10
+2 QUIT
+3 ;
CHECKIN(CHECKAT,CNT773,CNT772,LCOUNT) ;
+1 ;if NOW>CHECKAT then:
+2 ; 1) check in with TaskMan
+3 ; 2) send a new event to the event monitor
+4 ; 3) reset CHECKAT for 10 minutes in the future
+5 ; 4) as an alternative to TaskMan, check if special Stop Fast Purge option has been used
+6 ;
+7 ;Input:
+8 ; CHECKAT - the end of the current 10 minute time period
+9 ; CNT773 - number of records in file 773 purged since the last time Event Logging was updated
+10 ; CNT772 - number of records in file 772 purged since the last time Event Logging was updated
+11 ;Output:
+12 ; Function returns 1 if the Fast Purge should stop, 0 otherwise
+13 ; LCOUNT is reset to 0 **pass by reference**
+14 ; CNT773 and CNT772 are set to 0 if reported to Event Logging **pass by reference**
+15 ; CHECKAT is reset to 10 minute sin the future if the time is up **pass by reference**
+16 ;
+17 NEW NOW,QUIT
+18 SET QUIT=0
+19 ;
+20 SET NOW=$$NOW^XLFDT
+21 IF NOW>CHECKAT
Begin DoDot:1
+22 DO EVENT(.CNT773,.CNT772)
+23 SET CHECKAT=$$FMADD^XLFDT(NOW,,,10)
+24 IF '$DATA(ZTQUEUED)
Begin DoDot:2
+25 WRITE "."
End DoDot:2
+26 IF '$TEST
Begin DoDot:2
+27 ;check in with the Job Monitor
+28 DO CHECKIN^HLEVAPI
+29 SET QUIT=$$S^ZTLOAD
+30 IF QUIT
SET ZTSTOP=1
End DoDot:2
End DoDot:1
+31 ;
+32 ;Check if the special option has been used to stop the purge
+33 IF $GET(^XTMP("HL7 FAST PURGE JOBS","STOP"))>0
Begin DoDot:1
+34 SET QUIT=1
+35 IF $$I^HLEMU($NAME(^XTMP("HL7 FAST PURGE JOBS","STOP")),-1)
End DoDot:1
+36 ;
+37 SET LCOUNT=0
+38 QUIT QUIT
+39 ;
FINDHOUR(HOUR) ;
+1 ;Finds the next dt/tm to the hour on the AI x-ref of file 773 that can be locked, returns 0 on failure
+2 NEW QUIT,NOW
+3 SET QUIT=0
+4 ;
+5 ;unlock the last hour currently being held
+6 IF HOUR
LOCK -^HLMA("AI",HOUR)
+7 ;
+8 SET NOW=$$NOW^XLFDT
+9 ;
+10 ;if this is the first time through then start with the first entry on the x-ref
+11 IF 'HOUR
Begin DoDot:1
+12 SET HOUR=$ORDER(^HLMA("AI",0))
+13 ;
+14 ;any records to purge?
+15 IF 'HOUR
SET QUIT=1
QUIT
+16 ;
+17 ;if so, quit if the next purgeable record is for the future
+18 IF HOUR>NOW
SET HOUR=0
QUIT
+19 ;
+20 SET HOUR=$EXTRACT(HOUR,1,10)
+21 LOCK +^HLMA("AI",+HOUR):0
IF $TEST
SET QUIT=1
End DoDot:1
IF QUIT
QUIT HOUR
+22 ;
+23 SET HOUR=$EXTRACT(HOUR,1,10)
+24 FOR
Begin DoDot:1
+25 ;
+26 ;look for the next entry at least 1 hour in the future
+27 SET HOUR=$$FMADD^XLFDT(HOUR,,1)-.000000001
+28 SET HOUR=$EXTRACT($ORDER(^HLMA("AI",HOUR)),1,10)
+29 IF 'HOUR
SET QUIT=1
QUIT
+30 ;
+31 ;I the hour is in the future then the entries can not yet be purged
+32 IF (HOUR>NOW)
SET HOUR=0
SET QUIT=1
QUIT
+33 ;
+34 ;check if this hour can be locked, if so this is the hour to be purged
+35 LOCK +^HLMA("AI",+HOUR):0
IF $TEST
SET QUIT=1
End DoDot:1
IF QUIT
QUIT
+36 ;
+37 QUIT HOUR
+38 ;
EVENT(CNT773,CNT772) ;
+1 ;add the last number of records purged to event logging
+2 NEW EVENT
+3 IF CNT773
Begin DoDot:1
+4 SET EVENT=$$EVENT^HLEME("773 PURGE","HEALTH LEVEL SEVEN")
+5 IF CNT773>1
IF $$INC^HLEME(EVENT,CNT773-1)
+6 SET CNT773=0
End DoDot:1
+7 IF CNT772
Begin DoDot:1
+8 SET EVENT=$$EVENT^HLEME("772 PURGE","HEALTH LEVEL SEVEN")
+9 IF CNT772>1
IF $$INC^HLEME(EVENT,CNT772-1)
+10 SET CNT772=0
End DoDot:1
+11 QUIT
+12 ;
CHECK1() ;called by the Master Job to determine whether
+1 ;FAST HL7 PURGE #1 should run.
+2 ;Output:
+3 ; function returns 1 if yes, 0 if no
+4 ;
+5 IF $$COUNT^HLEVAPI3("FAST HL7 PURGE #1")
+6 QUIT '$TEST
+7 ;
CHECK2() ;called by the Master Job to determine whether
+1 ;FAST HL7 PURGE #2 should run.
+2 ;Output:
+3 ; function returns 1 if yes, 0 if no
+4 ;
+5 IF $$COUNT^HLEVAPI3("FAST HL7 PURGE #1")
IF '$$COUNT^HLEVAPI3("FAST HL7 PURGE #2")
+6 QUIT $TEST