- XMA3 ;ISC-SF/GMB-XMCLEAN, XMAUTOPURGE ;04/18/2002 07:09
- ;;8.0;MailMan;;Jun 28, 2002
- ; Was (WASH ISC)/CAP
- ;
- ; Entry points used by MailMan options (not covered by DBIA):
- ; CLEAN Option: XMCLEAN - Clean out waste baskets and
- ; Postmaster's ARRIVING basket
- ; EN Option: XMAUTOPURGE - Purge Unreferenced Messages
- ; SCAN Option: XMPURGE - Purge Unreferenced Messages, then STAT
- ; STAT Option: XMSTAT - Message Statistics
- Q
- EN ;
- N XMPARM
- D PURGEIT(.XMPARM)
- S:$D(ZTQUEUED) ZTREQ="@"
- Q
- STAT ;
- D AUDIT^XMA30 ; Show purge audit records
- D USERSTAT^XMA30 ; Show user mailbox info
- Q
- SCAN ; PURGE MESSAGES
- I $D(ZTQUEUED) G EN
- N DIR,XMPARM,XMTEXT
- D AUDIT^XMA30 ; Show purge audit records
- S DIR(0)="E" D ^DIR Q:$D(DIRUT) K DIR
- D BLD^DIALOG(36425,"","","XMTEXT","F")
- ;I will purge messages which are not in anybody's Mailbox.
- ;This will be done by comparing the message numbers in the MESSAGE file
- ;(3.9) against the 'M' cross reference of the MAILBOX file (3.7).
- ;Because this is a real-time dynamic cross reference, it is
- ;RECOMMENDED that you run the INTEGRITY CHECKER with some
- ;frequency, to CORRECT problems, if any.
- I '$P($G(^XMB(1,1,.12)),U) D
- . D BLD^DIALOG(36426,"","","XMTEXT","SF")
- . ;A Mailbox INTEGRITY CHECK will run before the PURGE.
- E D
- . D BLD^DIALOG(36427,"","","XMTEXT","SF")
- . ;A Mailbox INTEGRITY CHECK will NOT run before the PURGE,
- . ;because your site parameters indicate you do not want it to.
- . ;You may want to do a BACK-UP just before this runs, and revert
- . ;to it if many problems are discovered.
- W !
- D MSG^DIALOG("WM","","","","XMTEXT")
- W !
- D GETPARMS(.XMPARM)
- D BLD^DIALOG(36428,"","","DIR(""A"")") ;Do you really want to purge all unreferenced messages
- S DIR("B")=$$EZBLD^DIALOG(39053) ; NO
- S DIR(0)="Y"
- D ^DIR Q:'Y
- D WAIT^DICD
- D PURGEIT(.XMPARM)
- K DIR S DIR(0)="E" D ^DIR Q:$D(DIRUT) K DIR
- D STAT
- Q
- PURGEIT(XMPARM) ;
- N XMKILL,XMIEN,XMCNT,XMCRE8,XMABORT
- D INIT(.XMIEN,.XMPARM,.XMKILL,.XMABORT) Q:XMABORT
- D MPURGE(.XMCRE8,.XMPARM,.XMKILL,.XMCNT,.XMABORT)
- D FINISH(XMIEN,XMCRE8,.XMKILL,.XMCNT,XMABORT)
- Q
- INIT(XMIEN,XMPARM,XMKILL,XMABORT) ;
- S XMABORT=0
- D:'$D(XMPARM) GETPARMS(.XMPARM)
- I '$P($G(^XMB(1,1,.12)),U) D MAILBOX^XMUT4(.XMABORT) Q:XMABORT ; Integrity check
- S (XMKILL("MSG"),XMKILL("RESP"))=0
- S XMKILL("START")=$P(^XMB(3.9,0),U,4)
- D AUDTPURG^XMA32 ; purge audit records
- D DONTPURG^XMA30 ; Note all messages which shouldn't be purged
- D INITAUDT^XMA32A(.XMIEN,.XMPARM)
- Q
- GETPARMS(XMPARM) ;
- N XMSBUF,XMBUFREC
- S (XMPARM("TYPE"),XMPARM("START"))=0
- ; Set up a date buffer, beyond which we won't purge
- S XMBUFREC=$G(^XMB(1,1,.14))
- S XMPARM("END")=$$PDATE(+$P(XMBUFREC,U,1),2) ; purge thru this date
- S XMPARM("PDATE")=$$PDATE(+$P(XMBUFREC,U,2),7) ; don't purge local messages sent on or after this date to remote sites.
- ; If today is Saturday, start purge at beginning.
- ; If not Saturday, check MailMan Site Parameter file for field 4.304 ...
- I $$DOW^XLFDT(DT,1)'=6 D
- . S XMSBUF=+$P($G(^XMB(1,1,"NOTOPURGE")),U)
- . I XMSBUF=0,($G(^XMB("NETNAME"))="FORUM.VA.GOV"!$G(^XMB("NETNAME"))="FORUM.MED.VA.GOV") S XMSBUF=45
- . Q:XMSBUF=0
- . S XMPARM("START")=$$PDATE(XMSBUF,45)
- Q:$D(ZTQUEUED)
- N XMTEXT,XMVAR
- S XMVAR(1)=$$FMTE^XLFDT($S(XMPARM("START")=0:$O(^XMB(3.9,"C",0)),1:XMPARM("START")),5)
- S XMVAR(2)=$$FMTE^XLFDT(XMPARM("END"),5)
- S XMVAR(3)=$$FMTE^XLFDT(XMPARM("PDATE"),5)
- D BLD^DIALOG(36429,.XMVAR,"","XMTEXT","F")
- D MSG^DIALOG("WM","","","","XMTEXT")
- ;Any unreferenced message will be purged if its local create date
- ;is from |1| to |2| inclusive.
- ;However, locally generated messages sent to remote sites will not be purged
- ;if they were sent on or after |3|.
- ;The following messages are considered 'referenced' and will not be purged:
- ;- Messages in users' baskets
- ;- Messages in transit (arriving or being sent)
- ;- Server messages
- ;- Messages being edited (includes aborted edits)
- ;- Later'd messages
- Q
- PDATE(XMDAYS,XMDEFALT) ; Subtract so many days from today and return that date.
- S:+XMDAYS=0 XMDAYS=XMDEFALT ; use default if days is null
- Q $$FMADD^XLFDT(DT,-XMDAYS)
- FINISH(XMIEN,XMCRE8,XMKILL,XMCNT,XMABORT) ;
- K ^TMP("XM",$J)
- S XMKILL("TOTAL")=XMKILL("MSG")+XMKILL("RESP")
- ;I $G(ZTSTOP) W !!,"*** Stopping prematurely per user request ***"
- I '$D(ZTQUEUED) D
- . N XMVAR,XMTEXT
- . S XMVAR(1)=$J(XMCNT,$L(XMKILL("START")))
- . S XMVAR(2)=$J(XMKILL("TOTAL"),$L(XMKILL("START")))
- . S XMVAR(3)=$J(XMKILL("START")-XMKILL("TOTAL"),$L(XMKILL("START")))
- . W !
- . D BLD^DIALOG(36430,.XMVAR,"","XMTEXT","F")
- . D MSG^DIALOG("WM","","","","XMTEXT")
- . ;|1| messages processed, |2| messages purged, |3| messages in file 3.9
- D CHKAUDT^XMA32A(XMIEN,XMCRE8,.XMKILL)
- Q
- MPURGE(XMCRE8,XMPARM,XMKILL,XMCNT,XMABORT) ;
- N XMZREC,XMZ
- S XMZ="",XMCNT=0
- S XMCRE8=$S(XMPARM("START")=0:0,1:$O(^XMB(3.9,"C",XMPARM("START")),-1))
- F S XMCRE8=$O(^XMB(3.9,"C",XMCRE8)) Q:'XMCRE8 Q:XMCRE8>XMPARM("END") D
- . F S XMZ=$O(^XMB(3.9,"C",XMCRE8,XMZ)) Q:'XMZ D
- . . S XMCNT=XMCNT+1 I XMCNT#5000=0 D Q:XMABORT
- . . . I '$D(ZTQUEUED) W:$X>40 ! W XMCNT,"." Q
- . . . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
- . . I '$D(^XMB(3.9,XMZ)) K ^XMB(3.9,"C",XMCRE8,XMZ) Q
- . . Q:$D(^XMB(3.7,"M",XMZ)) ; Msg is in someone's basket
- . . Q:$D(^TMP("XM",$J,"NOP",XMZ)) ; Msg is one of "do not purge"
- . . S XMZREC=$G(^XMB(3.9,XMZ,0))
- . . Q:$P(XMZREC,U,8) ; Msg is a response
- . . I $P($P(XMZREC,U,3),".")?7N,XMCRE8'<XMPARM("PDATE"),$O(^XMB(3.9,XMZ,1,"C",":"))'="" Q ; local msg recently sent to remote site
- . . D PURGE(XMZ,.XMKILL)
- Q
- PURGE(XMZ,XMKILL) ; Purge message and responses
- N XMZR,XMIEN
- S XMIEN=0
- F S XMIEN=$O(^XMB(3.9,XMZ,3,XMIEN)) Q:XMIEN'>0 D
- . S XMZR=$P($G(^XMB(3.9,XMZ,3,XMIEN,0)),U) Q:'XMZR
- . D KILLRESP(XMZR,.XMKILL)
- D KILLMSG(XMZ,.XMKILL)
- Q
- KILLRESP(XMZ,XMKILL) ; Kill response
- Q:'$D(^XMB(3.9,XMZ)) ; Response does not exist
- Q:$D(^XMB(3.7,"M",XMZ)) ; Someone has response in mailbox
- D KILLMSG^XMXUTIL(XMZ)
- S XMKILL("RESP")=XMKILL("RESP")+1
- Q
- KILLMSG(XMZ,XMKILL) ; Kill message
- D KILLMSG^XMXUTIL(XMZ)
- S XMKILL("MSG")=XMKILL("MSG")+1
- Q
- CLEAN ; Clean various files
- D CSTAT ; Clean Message Statistics file
- D CMBOX ; Clean WASTE baskets & Postmaster's ARRIVING basket
- S:$D(ZTQUEUED) ZTREQ="@"
- Q
- CSTAT ; Clean Statistics file audits - delete records more than 2 years old
- N XMINST,XMAUDT,XMCUTOFF,DA,DIK
- S XMCUTOFF=DT\100-200 ; 2 years ago, in yyymm format
- S XMINST=0
- F S XMINST=$O(^XMBS(4.2999,XMINST)) Q:XMINST'>0 D
- . S DA(1)=XMINST,DIK="^XMBS(4.2999,"_DA(1)_",100,"
- . S XMAUDT=0
- . F S XMAUDT=$O(^XMBS(4.2999,XMINST,100,XMAUDT)) Q:XMAUDT'>0!(XMAUDT>XMCUTOFF) D
- . . S DA=XMAUDT D ^DIK
- Q
- CMBOX ; Clean the mailbox file
- N XMDUZ,XMCNT,XMABORT
- D CARRIVE
- S (XMDUZ,XMCNT,XMABORT)=0
- F S XMDUZ=$O(^XMB(3.7,XMDUZ)) Q:XMDUZ'>0 D Q:XMABORT
- . D CWASTE(XMDUZ,.XMCNT,.XMABORT)
- W:'$D(ZTQUEUED) !,$$EZBLD^DIALOG(36431) ; Waste & Arriving Baskets Cleaned!
- Q
- CWASTE(XMDUZ,XMCNT,XMABORT) ; Clean a user's WASTE basket
- S XMCNT=XMCNT+1 I XMCNT#100=0 D Q:XMABORT
- . I '$D(ZTQUEUED) W:$X>40 ! W XMCNT,"." Q
- . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
- L +^XMB(3.7,XMDUZ,2,.5):5 E Q
- N XMZ
- S XMZ=0
- F S XMZ=$O(^XMB(3.7,XMDUZ,2,.5,1,XMZ)) Q:XMZ'>0 K ^XMB(3.7,"M",XMZ,XMDUZ,.5)
- K ^XMB(3.7,XMDUZ,2,.5)
- S ^XMB(3.7,XMDUZ,2,.5,0)=$$EZBLD^DIALOG(37004) ; "WASTE"
- S ^XMB(3.7,XMDUZ,2,.5,1,0)="^3.702P^0^0"
- L -^XMB(3.7,XMDUZ,2,.5)
- Q
- CARRIVE ; Clean the postmaster's ARRIVING basket
- N XMZ,XMCNT,XMZLAST,XMDATE,XMPARM
- S XMPARM("END")=$$PDATE(+$P($G(^XMB(1,1,.14)),U,1),2)
- L +^XMB(3.7,.5,2,.95):5 E Q
- S (XMZ,XMCNT,XMZLAST)=0
- F S XMZ=$O(^XMB(3.7,.5,2,.95,1,XMZ)) Q:XMZ'>0 D
- . I '$D(^XMB(3.9,XMZ,0)) D Q
- . . S DA=XMZ,DA(1)=.95,DA(2)=.5,DIK="^XMB(3.7,.5,2,.95,1," D ^DIK
- . ; If it's still arriving, its date will be a FileMan date.
- . ; After it's finished arriving, its date will be an internet (text) date.
- . S XMDATE=$P($G(^XMB(3.9,XMZ,0)),U,3)
- . I XMDATE?7N1".".N,XMDATE'>XMPARM("END") D Q ; been arriving for over 24 hours
- . . S DA=XMZ,DA(1)=.95,DA(2)=.5,DIK="^XMB(3.7,.5,2,.95,1," D ^DIK
- . S XMCNT=XMCNT+1,XMZLAST=XMZ
- S ^XMB(3.7,.5,2,.95,0)="ARRIVING",^(1,0)="^3.702P^"_XMZLAST_U_XMCNT
- L -^XMB(3.7,.5,2,.95)
- Q
- XMA3 ;ISC-SF/GMB-XMCLEAN, XMAUTOPURGE ;04/18/2002 07:09
- +1 ;;8.0;MailMan;;Jun 28, 2002
- +2 ; Was (WASH ISC)/CAP
- +3 ;
- +4 ; Entry points used by MailMan options (not covered by DBIA):
- +5 ; CLEAN Option: XMCLEAN - Clean out waste baskets and
- +6 ; Postmaster's ARRIVING basket
- +7 ; EN Option: XMAUTOPURGE - Purge Unreferenced Messages
- +8 ; SCAN Option: XMPURGE - Purge Unreferenced Messages, then STAT
- +9 ; STAT Option: XMSTAT - Message Statistics
- +10 QUIT
- EN ;
- +1 NEW XMPARM
- +2 DO PURGEIT(.XMPARM)
- +3 IF $DATA(ZTQUEUED)
- SET ZTREQ="@"
- +4 QUIT
- STAT ;
- +1 ; Show purge audit records
- DO AUDIT^XMA30
- +2 ; Show user mailbox info
- DO USERSTAT^XMA30
- +3 QUIT
- SCAN ; PURGE MESSAGES
- +1 IF $DATA(ZTQUEUED)
- GOTO EN
- +2 NEW DIR,XMPARM,XMTEXT
- +3 ; Show purge audit records
- DO AUDIT^XMA30
- +4 SET DIR(0)="E"
- DO ^DIR
- IF $DATA(DIRUT)
- QUIT
- KILL DIR
- +5 DO BLD^DIALOG(36425,"","","XMTEXT","F")
- +6 ;I will purge messages which are not in anybody's Mailbox.
- +7 ;This will be done by comparing the message numbers in the MESSAGE file
- +8 ;(3.9) against the 'M' cross reference of the MAILBOX file (3.7).
- +9 ;Because this is a real-time dynamic cross reference, it is
- +10 ;RECOMMENDED that you run the INTEGRITY CHECKER with some
- +11 ;frequency, to CORRECT problems, if any.
- +12 IF '$PIECE($GET(^XMB(1,1,.12)),U)
- Begin DoDot:1
- +13 DO BLD^DIALOG(36426,"","","XMTEXT","SF")
- +14 ;A Mailbox INTEGRITY CHECK will run before the PURGE.
- End DoDot:1
- +15 IF '$TEST
- Begin DoDot:1
- +16 DO BLD^DIALOG(36427,"","","XMTEXT","SF")
- +17 ;A Mailbox INTEGRITY CHECK will NOT run before the PURGE,
- +18 ;because your site parameters indicate you do not want it to.
- +19 ;You may want to do a BACK-UP just before this runs, and revert
- +20 ;to it if many problems are discovered.
- End DoDot:1
- +21 WRITE !
- +22 DO MSG^DIALOG("WM","","","","XMTEXT")
- +23 WRITE !
- +24 DO GETPARMS(.XMPARM)
- +25 ;Do you really want to purge all unreferenced messages
- DO BLD^DIALOG(36428,"","","DIR(""A"")")
- +26 ; NO
- SET DIR("B")=$$EZBLD^DIALOG(39053)
- +27 SET DIR(0)="Y"
- +28 DO ^DIR
- IF 'Y
- QUIT
- +29 DO WAIT^DICD
- +30 DO PURGEIT(.XMPARM)
- +31 KILL DIR
- SET DIR(0)="E"
- DO ^DIR
- IF $DATA(DIRUT)
- QUIT
- KILL DIR
- +32 DO STAT
- +33 QUIT
- PURGEIT(XMPARM) ;
- +1 NEW XMKILL,XMIEN,XMCNT,XMCRE8,XMABORT
- +2 DO INIT(.XMIEN,.XMPARM,.XMKILL,.XMABORT)
- IF XMABORT
- QUIT
- +3 DO MPURGE(.XMCRE8,.XMPARM,.XMKILL,.XMCNT,.XMABORT)
- +4 DO FINISH(XMIEN,XMCRE8,.XMKILL,.XMCNT,XMABORT)
- +5 QUIT
- INIT(XMIEN,XMPARM,XMKILL,XMABORT) ;
- +1 SET XMABORT=0
- +2 IF '$DATA(XMPARM)
- DO GETPARMS(.XMPARM)
- +3 ; Integrity check
- IF '$PIECE($GET(^XMB(1,1,.12)),U)
- DO MAILBOX^XMUT4(.XMABORT)
- IF XMABORT
- QUIT
- +4 SET (XMKILL("MSG"),XMKILL("RESP"))=0
- +5 SET XMKILL("START")=$PIECE(^XMB(3.9,0),U,4)
- +6 ; purge audit records
- DO AUDTPURG^XMA32
- +7 ; Note all messages which shouldn't be purged
- DO DONTPURG^XMA30
- +8 DO INITAUDT^XMA32A(.XMIEN,.XMPARM)
- +9 QUIT
- GETPARMS(XMPARM) ;
- +1 NEW XMSBUF,XMBUFREC
- +2 SET (XMPARM("TYPE"),XMPARM("START"))=0
- +3 ; Set up a date buffer, beyond which we won't purge
- +4 SET XMBUFREC=$GET(^XMB(1,1,.14))
- +5 ; purge thru this date
- SET XMPARM("END")=$$PDATE(+$PIECE(XMBUFREC,U,1),2)
- +6 ; don't purge local messages sent on or after this date to remote sites.
- SET XMPARM("PDATE")=$$PDATE(+$PIECE(XMBUFREC,U,2),7)
- +7 ; If today is Saturday, start purge at beginning.
- +8 ; If not Saturday, check MailMan Site Parameter file for field 4.304 ...
- +9 IF $$DOW^XLFDT(DT,1)'=6
- Begin DoDot:1
- +10 SET XMSBUF=+$PIECE($GET(^XMB(1,1,"NOTOPURGE")),U)
- +11 IF XMSBUF=0
- IF ($GET(^XMB("NETNAME"))="FORUM.VA.GOV"!$GET(^XMB("NETNAME"))="FORUM.MED.VA.GOV")
- SET XMSBUF=45
- +12 IF XMSBUF=0
- QUIT
- +13 SET XMPARM("START")=$$PDATE(XMSBUF,45)
- End DoDot:1
- +14 IF $DATA(ZTQUEUED)
- QUIT
- +15 NEW XMTEXT,XMVAR
- +16 SET XMVAR(1)=$$FMTE^XLFDT($SELECT(XMPARM("START")=0:$ORDER(^XMB(3.9,"C",0)),1:XMPARM("START")),5)
- +17 SET XMVAR(2)=$$FMTE^XLFDT(XMPARM("END"),5)
- +18 SET XMVAR(3)=$$FMTE^XLFDT(XMPARM("PDATE"),5)
- +19 DO BLD^DIALOG(36429,.XMVAR,"","XMTEXT","F")
- +20 DO MSG^DIALOG("WM","","","","XMTEXT")
- +21 ;Any unreferenced message will be purged if its local create date
- +22 ;is from |1| to |2| inclusive.
- +23 ;However, locally generated messages sent to remote sites will not be purged
- +24 ;if they were sent on or after |3|.
- +25 ;The following messages are considered 'referenced' and will not be purged:
- +26 ;- Messages in users' baskets
- +27 ;- Messages in transit (arriving or being sent)
- +28 ;- Server messages
- +29 ;- Messages being edited (includes aborted edits)
- +30 ;- Later'd messages
- +31 QUIT
- PDATE(XMDAYS,XMDEFALT) ; Subtract so many days from today and return that date.
- +1 ; use default if days is null
- IF +XMDAYS=0
- SET XMDAYS=XMDEFALT
- +2 QUIT $$FMADD^XLFDT(DT,-XMDAYS)
- FINISH(XMIEN,XMCRE8,XMKILL,XMCNT,XMABORT) ;
- +1 KILL ^TMP("XM",$JOB)
- +2 SET XMKILL("TOTAL")=XMKILL("MSG")+XMKILL("RESP")
- +3 ;I $G(ZTSTOP) W !!,"*** Stopping prematurely per user request ***"
- +4 IF '$DATA(ZTQUEUED)
- Begin DoDot:1
- +5 NEW XMVAR,XMTEXT
- +6 SET XMVAR(1)=$JUSTIFY(XMCNT,$LENGTH(XMKILL("START")))
- +7 SET XMVAR(2)=$JUSTIFY(XMKILL("TOTAL"),$LENGTH(XMKILL("START")))
- +8 SET XMVAR(3)=$JUSTIFY(XMKILL("START")-XMKILL("TOTAL"),$LENGTH(XMKILL("START")))
- +9 WRITE !
- +10 DO BLD^DIALOG(36430,.XMVAR,"","XMTEXT","F")
- +11 DO MSG^DIALOG("WM","","","","XMTEXT")
- +12 ;|1| messages processed, |2| messages purged, |3| messages in file 3.9
- End DoDot:1
- +13 DO CHKAUDT^XMA32A(XMIEN,XMCRE8,.XMKILL)
- +14 QUIT
- MPURGE(XMCRE8,XMPARM,XMKILL,XMCNT,XMABORT) ;
- +1 NEW XMZREC,XMZ
- +2 SET XMZ=""
- SET XMCNT=0
- +3 SET XMCRE8=$SELECT(XMPARM("START")=0:0,1:$ORDER(^XMB(3.9,"C",XMPARM("START")),-1))
- +4 FOR
- SET XMCRE8=$ORDER(^XMB(3.9,"C",XMCRE8))
- IF 'XMCRE8
- QUIT
- IF XMCRE8>XMPARM("END")
- QUIT
- Begin DoDot:1
- +5 FOR
- SET XMZ=$ORDER(^XMB(3.9,"C",XMCRE8,XMZ))
- IF 'XMZ
- QUIT
- Begin DoDot:2
- +6 SET XMCNT=XMCNT+1
- IF XMCNT#5000=0
- Begin DoDot:3
- +7 IF '$DATA(ZTQUEUED)
- IF $X>40
- WRITE !
- WRITE XMCNT,"."
- QUIT
- +8 ; User asked the task to stop
- IF $$S^%ZTLOAD
- SET (XMABORT,ZTSTOP)=1
- End DoDot:3
- IF XMABORT
- QUIT
- +9 IF '$DATA(^XMB(3.9,XMZ))
- KILL ^XMB(3.9,"C",XMCRE8,XMZ)
- QUIT
- +10 ; Msg is in someone's basket
- IF $DATA(^XMB(3.7,"M",XMZ))
- QUIT
- +11 ; Msg is one of "do not purge"
- IF $DATA(^TMP("XM",$JOB,"NOP",XMZ))
- QUIT
- +12 SET XMZREC=$GET(^XMB(3.9,XMZ,0))
- +13 ; Msg is a response
- IF $PIECE(XMZREC,U,8)
- QUIT
- +14 ; local msg recently sent to remote site
- IF $PIECE($PIECE(XMZREC,U,3),".")?7N
- IF XMCRE8'<XMPARM("PDATE")
- IF $ORDER(^XMB(3.9,XMZ,1,"C",":"))'=""
- QUIT
- +15 DO PURGE(XMZ,.XMKILL)
- End DoDot:2
- End DoDot:1
- +16 QUIT
- PURGE(XMZ,XMKILL) ; Purge message and responses
- +1 NEW XMZR,XMIEN
- +2 SET XMIEN=0
- +3 FOR
- SET XMIEN=$ORDER(^XMB(3.9,XMZ,3,XMIEN))
- IF XMIEN'>0
- QUIT
- Begin DoDot:1
- +4 SET XMZR=$PIECE($GET(^XMB(3.9,XMZ,3,XMIEN,0)),U)
- IF 'XMZR
- QUIT
- +5 DO KILLRESP(XMZR,.XMKILL)
- End DoDot:1
- +6 DO KILLMSG(XMZ,.XMKILL)
- +7 QUIT
- KILLRESP(XMZ,XMKILL) ; Kill response
- +1 ; Response does not exist
- IF '$DATA(^XMB(3.9,XMZ))
- QUIT
- +2 ; Someone has response in mailbox
- IF $DATA(^XMB(3.7,"M",XMZ))
- QUIT
- +3 DO KILLMSG^XMXUTIL(XMZ)
- +4 SET XMKILL("RESP")=XMKILL("RESP")+1
- +5 QUIT
- KILLMSG(XMZ,XMKILL) ; Kill message
- +1 DO KILLMSG^XMXUTIL(XMZ)
- +2 SET XMKILL("MSG")=XMKILL("MSG")+1
- +3 QUIT
- CLEAN ; Clean various files
- +1 ; Clean Message Statistics file
- DO CSTAT
- +2 ; Clean WASTE baskets & Postmaster's ARRIVING basket
- DO CMBOX
- +3 IF $DATA(ZTQUEUED)
- SET ZTREQ="@"
- +4 QUIT
- CSTAT ; Clean Statistics file audits - delete records more than 2 years old
- +1 NEW XMINST,XMAUDT,XMCUTOFF,DA,DIK
- +2 ; 2 years ago, in yyymm format
- SET XMCUTOFF=DT\100-200
- +3 SET XMINST=0
- +4 FOR
- SET XMINST=$ORDER(^XMBS(4.2999,XMINST))
- IF XMINST'>0
- QUIT
- Begin DoDot:1
- +5 SET DA(1)=XMINST
- SET DIK="^XMBS(4.2999,"_DA(1)_",100,"
- +6 SET XMAUDT=0
- +7 FOR
- SET XMAUDT=$ORDER(^XMBS(4.2999,XMINST,100,XMAUDT))
- IF XMAUDT'>0!(XMAUDT>XMCUTOFF)
- QUIT
- Begin DoDot:2
- +8 SET DA=XMAUDT
- DO ^DIK
- End DoDot:2
- End DoDot:1
- +9 QUIT
- CMBOX ; Clean the mailbox file
- +1 NEW XMDUZ,XMCNT,XMABORT
- +2 DO CARRIVE
- +3 SET (XMDUZ,XMCNT,XMABORT)=0
- +4 FOR
- SET XMDUZ=$ORDER(^XMB(3.7,XMDUZ))
- IF XMDUZ'>0
- QUIT
- Begin DoDot:1
- +5 DO CWASTE(XMDUZ,.XMCNT,.XMABORT)
- End DoDot:1
- IF XMABORT
- QUIT
- +6 ; Waste & Arriving Baskets Cleaned!
- IF '$DATA(ZTQUEUED)
- WRITE !,$$EZBLD^DIALOG(36431)
- +7 QUIT
- CWASTE(XMDUZ,XMCNT,XMABORT) ; Clean a user's WASTE basket
- +1 SET XMCNT=XMCNT+1
- IF XMCNT#100=0
- Begin DoDot:1
- +2 IF '$DATA(ZTQUEUED)
- IF $X>40
- WRITE !
- WRITE XMCNT,"."
- QUIT
- +3 ; User asked the task to stop
- IF $$S^%ZTLOAD
- SET (XMABORT,ZTSTOP)=1
- End DoDot:1
- IF XMABORT
- QUIT
- +4 LOCK +^XMB(3.7,XMDUZ,2,.5):5
- IF '$TEST
- QUIT
- +5 NEW XMZ
- +6 SET XMZ=0
- +7 FOR
- SET XMZ=$ORDER(^XMB(3.7,XMDUZ,2,.5,1,XMZ))
- IF XMZ'>0
- QUIT
- KILL ^XMB(3.7,"M",XMZ,XMDUZ,.5)
- +8 KILL ^XMB(3.7,XMDUZ,2,.5)
- +9 ; "WASTE"
- SET ^XMB(3.7,XMDUZ,2,.5,0)=$$EZBLD^DIALOG(37004)
- +10 SET ^XMB(3.7,XMDUZ,2,.5,1,0)="^3.702P^0^0"
- +11 LOCK -^XMB(3.7,XMDUZ,2,.5)
- +12 QUIT
- CARRIVE ; Clean the postmaster's ARRIVING basket
- +1 NEW XMZ,XMCNT,XMZLAST,XMDATE,XMPARM
- +2 SET XMPARM("END")=$$PDATE(+$PIECE($GET(^XMB(1,1,.14)),U,1),2)
- +3 LOCK +^XMB(3.7,.5,2,.95):5
- IF '$TEST
- QUIT
- +4 SET (XMZ,XMCNT,XMZLAST)=0
- +5 FOR
- SET XMZ=$ORDER(^XMB(3.7,.5,2,.95,1,XMZ))
- IF XMZ'>0
- QUIT
- Begin DoDot:1
- +6 IF '$DATA(^XMB(3.9,XMZ,0))
- Begin DoDot:2
- +7 SET DA=XMZ
- SET DA(1)=.95
- SET DA(2)=.5
- SET DIK="^XMB(3.7,.5,2,.95,1,"
- DO ^DIK
- End DoDot:2
- QUIT
- +8 ; If it's still arriving, its date will be a FileMan date.
- +9 ; After it's finished arriving, its date will be an internet (text) date.
- +10 SET XMDATE=$PIECE($GET(^XMB(3.9,XMZ,0)),U,3)
- +11 ; been arriving for over 24 hours
- IF XMDATE?7N1".".N
- IF XMDATE'>XMPARM("END")
- Begin DoDot:2
- +12 SET DA=XMZ
- SET DA(1)=.95
- SET DA(2)=.5
- SET DIK="^XMB(3.7,.5,2,.95,1,"
- DO ^DIK
- End DoDot:2
- QUIT
- +13 SET XMCNT=XMCNT+1
- SET XMZLAST=XMZ
- End DoDot:1
- +14 SET ^XMB(3.7,.5,2,.95,0)="ARRIVING"
- SET ^(1,0)="^3.702P^"_XMZLAST_U_XMCNT
- +15 LOCK -^XMB(3.7,.5,2,.95)
- +16 QUIT