| 1 | XMA3 ;ISC-SF/GMB-XMCLEAN, XMAUTOPURGE ;04/18/2002  07:09
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 |  ; Was (WASH ISC)/CAP
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ; Entry points used by MailMan options (not covered by DBIA):
 | 
|---|
| 6 |  ; CLEAN      Option: XMCLEAN - Clean out waste baskets and
 | 
|---|
| 7 |  ;                              Postmaster's ARRIVING basket
 | 
|---|
| 8 |  ; EN         Option: XMAUTOPURGE - Purge Unreferenced Messages
 | 
|---|
| 9 |  ; SCAN       Option: XMPURGE - Purge Unreferenced Messages, then STAT
 | 
|---|
| 10 |  ; STAT       Option: XMSTAT  - Message Statistics
 | 
|---|
| 11 |  Q
 | 
|---|
| 12 | EN ;
 | 
|---|
| 13 |  N XMPARM
 | 
|---|
| 14 |  D PURGEIT(.XMPARM)
 | 
|---|
| 15 |  S:$D(ZTQUEUED) ZTREQ="@"
 | 
|---|
| 16 |  Q
 | 
|---|
| 17 | STAT ;
 | 
|---|
| 18 |  D AUDIT^XMA30 ; Show purge audit records
 | 
|---|
| 19 |  D USERSTAT^XMA30 ; Show user mailbox info
 | 
|---|
| 20 |  Q
 | 
|---|
| 21 | SCAN ; PURGE MESSAGES
 | 
|---|
| 22 |  I $D(ZTQUEUED) G EN
 | 
|---|
| 23 |  N DIR,XMPARM,XMTEXT
 | 
|---|
| 24 |  D AUDIT^XMA30 ; Show purge audit records
 | 
|---|
| 25 |  S DIR(0)="E" D ^DIR Q:$D(DIRUT)  K DIR
 | 
|---|
| 26 |  D BLD^DIALOG(36425,"","","XMTEXT","F")
 | 
|---|
| 27 |  ;I will purge messages which are not in anybody's Mailbox.
 | 
|---|
| 28 |  ;This will be done by comparing the message numbers in the MESSAGE file
 | 
|---|
| 29 |  ;(3.9) against the 'M' cross reference of the MAILBOX file (3.7).
 | 
|---|
| 30 |  ;Because this is a real-time dynamic cross reference, it is
 | 
|---|
| 31 |  ;RECOMMENDED that you run the INTEGRITY CHECKER with some
 | 
|---|
| 32 |  ;frequency, to CORRECT problems, if any.
 | 
|---|
| 33 |  I '$P($G(^XMB(1,1,.12)),U) D
 | 
|---|
| 34 |  . D BLD^DIALOG(36426,"","","XMTEXT","SF")
 | 
|---|
| 35 |  . ;A Mailbox INTEGRITY CHECK will run before the PURGE.
 | 
|---|
| 36 |  E  D
 | 
|---|
| 37 |  . D BLD^DIALOG(36427,"","","XMTEXT","SF")
 | 
|---|
| 38 |  . ;A Mailbox INTEGRITY CHECK will NOT run before the PURGE,
 | 
|---|
| 39 |  . ;because your site parameters indicate you do not want it to.
 | 
|---|
| 40 |  . ;You may want to do a BACK-UP just before this runs, and revert
 | 
|---|
| 41 |  . ;to it if many problems are discovered.
 | 
|---|
| 42 |  W !
 | 
|---|
| 43 |  D MSG^DIALOG("WM","","","","XMTEXT")
 | 
|---|
| 44 |  W !
 | 
|---|
| 45 |  D GETPARMS(.XMPARM)
 | 
|---|
| 46 |  D BLD^DIALOG(36428,"","","DIR(""A"")") ;Do you really want to purge all unreferenced messages
 | 
|---|
| 47 |  S DIR("B")=$$EZBLD^DIALOG(39053) ; NO
 | 
|---|
| 48 |  S DIR(0)="Y"
 | 
|---|
| 49 |  D ^DIR Q:'Y
 | 
|---|
| 50 |  D WAIT^DICD
 | 
|---|
| 51 |  D PURGEIT(.XMPARM)
 | 
|---|
| 52 |  K DIR S DIR(0)="E" D ^DIR Q:$D(DIRUT)  K DIR
 | 
|---|
| 53 |  D STAT
 | 
|---|
| 54 |  Q
 | 
|---|
| 55 | PURGEIT(XMPARM) ;
 | 
|---|
| 56 |  N XMKILL,XMIEN,XMCNT,XMCRE8,XMABORT
 | 
|---|
| 57 |  D INIT(.XMIEN,.XMPARM,.XMKILL,.XMABORT) Q:XMABORT
 | 
|---|
| 58 |  D MPURGE(.XMCRE8,.XMPARM,.XMKILL,.XMCNT,.XMABORT)
 | 
|---|
| 59 |  D FINISH(XMIEN,XMCRE8,.XMKILL,.XMCNT,XMABORT)
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 | INIT(XMIEN,XMPARM,XMKILL,XMABORT) ;
 | 
|---|
| 62 |  S XMABORT=0
 | 
|---|
| 63 |  D:'$D(XMPARM) GETPARMS(.XMPARM)
 | 
|---|
| 64 |  I '$P($G(^XMB(1,1,.12)),U) D MAILBOX^XMUT4(.XMABORT) Q:XMABORT  ; Integrity check
 | 
|---|
| 65 |  S (XMKILL("MSG"),XMKILL("RESP"))=0
 | 
|---|
| 66 |  S XMKILL("START")=$P(^XMB(3.9,0),U,4)
 | 
|---|
| 67 |  D AUDTPURG^XMA32 ; purge audit records
 | 
|---|
| 68 |  D DONTPURG^XMA30 ; Note all messages which shouldn't be purged
 | 
|---|
| 69 |  D INITAUDT^XMA32A(.XMIEN,.XMPARM)
 | 
|---|
| 70 |  Q
 | 
|---|
| 71 | GETPARMS(XMPARM) ;
 | 
|---|
| 72 |  N XMSBUF,XMBUFREC
 | 
|---|
| 73 |  S (XMPARM("TYPE"),XMPARM("START"))=0
 | 
|---|
| 74 |  ; Set up a date buffer, beyond which we won't purge
 | 
|---|
| 75 |  S XMBUFREC=$G(^XMB(1,1,.14))
 | 
|---|
| 76 |  S XMPARM("END")=$$PDATE(+$P(XMBUFREC,U,1),2) ; purge thru this date
 | 
|---|
| 77 |  S XMPARM("PDATE")=$$PDATE(+$P(XMBUFREC,U,2),7) ; don't purge local messages sent on or after this date to remote sites.
 | 
|---|
| 78 |  ; If today is Saturday, start purge at beginning.
 | 
|---|
| 79 |  ; If not Saturday, check MailMan Site Parameter file for field 4.304 ...
 | 
|---|
| 80 |  I $$DOW^XLFDT(DT,1)'=6 D
 | 
|---|
| 81 |  . S XMSBUF=+$P($G(^XMB(1,1,"NOTOPURGE")),U)
 | 
|---|
| 82 |  . I XMSBUF=0,($G(^XMB("NETNAME"))="FORUM.VA.GOV"!$G(^XMB("NETNAME"))="FORUM.MED.VA.GOV") S XMSBUF=45
 | 
|---|
| 83 |  . Q:XMSBUF=0
 | 
|---|
| 84 |  . S XMPARM("START")=$$PDATE(XMSBUF,45)
 | 
|---|
| 85 |  Q:$D(ZTQUEUED)
 | 
|---|
| 86 |  N XMTEXT,XMVAR
 | 
|---|
| 87 |  S XMVAR(1)=$$FMTE^XLFDT($S(XMPARM("START")=0:$O(^XMB(3.9,"C",0)),1:XMPARM("START")),5)
 | 
|---|
| 88 |  S XMVAR(2)=$$FMTE^XLFDT(XMPARM("END"),5)
 | 
|---|
| 89 |  S XMVAR(3)=$$FMTE^XLFDT(XMPARM("PDATE"),5)
 | 
|---|
| 90 |  D BLD^DIALOG(36429,.XMVAR,"","XMTEXT","F")
 | 
|---|
| 91 |  D MSG^DIALOG("WM","","","","XMTEXT")
 | 
|---|
| 92 |  ;Any unreferenced message will be purged if its local create date
 | 
|---|
| 93 |  ;is from |1| to |2| inclusive.
 | 
|---|
| 94 |  ;However, locally generated messages sent to remote sites will not be purged
 | 
|---|
| 95 |  ;if they were sent on or after |3|.
 | 
|---|
| 96 |  ;The following messages are considered 'referenced' and will not be purged:
 | 
|---|
| 97 |  ;- Messages in users' baskets
 | 
|---|
| 98 |  ;- Messages in transit (arriving or being sent)
 | 
|---|
| 99 |  ;- Server messages
 | 
|---|
| 100 |  ;- Messages being edited (includes aborted edits)
 | 
|---|
| 101 |  ;- Later'd messages
 | 
|---|
| 102 |  Q
 | 
|---|
| 103 | PDATE(XMDAYS,XMDEFALT) ; Subtract so many days from today and return that date.
 | 
|---|
| 104 |  S:+XMDAYS=0 XMDAYS=XMDEFALT ; use default if days is null
 | 
|---|
| 105 |  Q $$FMADD^XLFDT(DT,-XMDAYS)
 | 
|---|
| 106 | FINISH(XMIEN,XMCRE8,XMKILL,XMCNT,XMABORT) ;
 | 
|---|
| 107 |  K ^TMP("XM",$J)
 | 
|---|
| 108 |  S XMKILL("TOTAL")=XMKILL("MSG")+XMKILL("RESP")
 | 
|---|
| 109 |  ;I $G(ZTSTOP) W !!,"*** Stopping prematurely per user request ***"
 | 
|---|
| 110 |  I '$D(ZTQUEUED) D
 | 
|---|
| 111 |  . N XMVAR,XMTEXT
 | 
|---|
| 112 |  . S XMVAR(1)=$J(XMCNT,$L(XMKILL("START")))
 | 
|---|
| 113 |  . S XMVAR(2)=$J(XMKILL("TOTAL"),$L(XMKILL("START")))
 | 
|---|
| 114 |  . S XMVAR(3)=$J(XMKILL("START")-XMKILL("TOTAL"),$L(XMKILL("START")))
 | 
|---|
| 115 |  . W !
 | 
|---|
| 116 |  . D BLD^DIALOG(36430,.XMVAR,"","XMTEXT","F")
 | 
|---|
| 117 |  . D MSG^DIALOG("WM","","","","XMTEXT")
 | 
|---|
| 118 |  . ;|1| messages processed, |2| messages purged, |3| messages in file 3.9
 | 
|---|
| 119 |  D CHKAUDT^XMA32A(XMIEN,XMCRE8,.XMKILL)
 | 
|---|
| 120 |  Q
 | 
|---|
| 121 | MPURGE(XMCRE8,XMPARM,XMKILL,XMCNT,XMABORT) ;
 | 
|---|
| 122 |  N XMZREC,XMZ
 | 
|---|
| 123 |  S XMZ="",XMCNT=0
 | 
|---|
| 124 |  S XMCRE8=$S(XMPARM("START")=0:0,1:$O(^XMB(3.9,"C",XMPARM("START")),-1))
 | 
|---|
| 125 |  F  S XMCRE8=$O(^XMB(3.9,"C",XMCRE8)) Q:'XMCRE8  Q:XMCRE8>XMPARM("END")  D
 | 
|---|
| 126 |  . F  S XMZ=$O(^XMB(3.9,"C",XMCRE8,XMZ)) Q:'XMZ  D
 | 
|---|
| 127 |  . . S XMCNT=XMCNT+1 I XMCNT#5000=0 D  Q:XMABORT
 | 
|---|
| 128 |  . . . I '$D(ZTQUEUED) W:$X>40 ! W XMCNT,"." Q
 | 
|---|
| 129 |  . . . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
 | 
|---|
| 130 |  . . I '$D(^XMB(3.9,XMZ)) K ^XMB(3.9,"C",XMCRE8,XMZ) Q
 | 
|---|
| 131 |  . . Q:$D(^XMB(3.7,"M",XMZ))        ; Msg is in someone's basket
 | 
|---|
| 132 |  . . Q:$D(^TMP("XM",$J,"NOP",XMZ))  ; Msg is one of "do not purge"
 | 
|---|
| 133 |  . . S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 134 |  . . Q:$P(XMZREC,U,8)                  ; Msg is a response
 | 
|---|
| 135 |  . . 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
 | 
|---|
| 136 |  . . D PURGE(XMZ,.XMKILL)
 | 
|---|
| 137 |  Q
 | 
|---|
| 138 | PURGE(XMZ,XMKILL) ; Purge message and responses
 | 
|---|
| 139 |  N XMZR,XMIEN
 | 
|---|
| 140 |  S XMIEN=0
 | 
|---|
| 141 |  F  S XMIEN=$O(^XMB(3.9,XMZ,3,XMIEN)) Q:XMIEN'>0  D
 | 
|---|
| 142 |  . S XMZR=$P($G(^XMB(3.9,XMZ,3,XMIEN,0)),U) Q:'XMZR
 | 
|---|
| 143 |  . D KILLRESP(XMZR,.XMKILL)
 | 
|---|
| 144 |  D KILLMSG(XMZ,.XMKILL)
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 | KILLRESP(XMZ,XMKILL) ; Kill response
 | 
|---|
| 147 |  Q:'$D(^XMB(3.9,XMZ))      ; Response does not exist
 | 
|---|
| 148 |  Q:$D(^XMB(3.7,"M",XMZ))   ; Someone has response in mailbox
 | 
|---|
| 149 |  D KILLMSG^XMXUTIL(XMZ)
 | 
|---|
| 150 |  S XMKILL("RESP")=XMKILL("RESP")+1
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 | KILLMSG(XMZ,XMKILL) ; Kill message
 | 
|---|
| 153 |  D KILLMSG^XMXUTIL(XMZ)
 | 
|---|
| 154 |  S XMKILL("MSG")=XMKILL("MSG")+1
 | 
|---|
| 155 |  Q
 | 
|---|
| 156 | CLEAN ; Clean various files
 | 
|---|
| 157 |  D CSTAT ; Clean Message Statistics file
 | 
|---|
| 158 |  D CMBOX ; Clean WASTE baskets & Postmaster's ARRIVING basket
 | 
|---|
| 159 |  S:$D(ZTQUEUED) ZTREQ="@"
 | 
|---|
| 160 |  Q
 | 
|---|
| 161 | CSTAT ; Clean Statistics file audits - delete records more than 2 years old
 | 
|---|
| 162 |  N XMINST,XMAUDT,XMCUTOFF,DA,DIK
 | 
|---|
| 163 |  S XMCUTOFF=DT\100-200   ; 2 years ago, in yyymm format
 | 
|---|
| 164 |  S XMINST=0
 | 
|---|
| 165 |  F  S XMINST=$O(^XMBS(4.2999,XMINST)) Q:XMINST'>0  D
 | 
|---|
| 166 |  . S DA(1)=XMINST,DIK="^XMBS(4.2999,"_DA(1)_",100,"
 | 
|---|
| 167 |  . S XMAUDT=0
 | 
|---|
| 168 |  . F  S XMAUDT=$O(^XMBS(4.2999,XMINST,100,XMAUDT)) Q:XMAUDT'>0!(XMAUDT>XMCUTOFF)  D
 | 
|---|
| 169 |  . . S DA=XMAUDT D ^DIK
 | 
|---|
| 170 |  Q
 | 
|---|
| 171 | CMBOX ; Clean the mailbox file
 | 
|---|
| 172 |  N XMDUZ,XMCNT,XMABORT
 | 
|---|
| 173 |  D CARRIVE
 | 
|---|
| 174 |  S (XMDUZ,XMCNT,XMABORT)=0
 | 
|---|
| 175 |  F  S XMDUZ=$O(^XMB(3.7,XMDUZ)) Q:XMDUZ'>0  D  Q:XMABORT
 | 
|---|
| 176 |  . D CWASTE(XMDUZ,.XMCNT,.XMABORT)
 | 
|---|
| 177 |  W:'$D(ZTQUEUED) !,$$EZBLD^DIALOG(36431) ; Waste & Arriving Baskets Cleaned!
 | 
|---|
| 178 |  Q
 | 
|---|
| 179 | CWASTE(XMDUZ,XMCNT,XMABORT) ; Clean a user's WASTE basket
 | 
|---|
| 180 |  S XMCNT=XMCNT+1 I XMCNT#100=0 D  Q:XMABORT
 | 
|---|
| 181 |  . I '$D(ZTQUEUED) W:$X>40 ! W XMCNT,"." Q
 | 
|---|
| 182 |  . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
 | 
|---|
| 183 |  L +^XMB(3.7,XMDUZ,2,.5):5  E  Q
 | 
|---|
| 184 |  N XMZ
 | 
|---|
| 185 |  S XMZ=0
 | 
|---|
| 186 |  F  S XMZ=$O(^XMB(3.7,XMDUZ,2,.5,1,XMZ)) Q:XMZ'>0  K ^XMB(3.7,"M",XMZ,XMDUZ,.5)
 | 
|---|
| 187 |  K ^XMB(3.7,XMDUZ,2,.5)
 | 
|---|
| 188 |  S ^XMB(3.7,XMDUZ,2,.5,0)=$$EZBLD^DIALOG(37004) ; "WASTE"
 | 
|---|
| 189 |  S ^XMB(3.7,XMDUZ,2,.5,1,0)="^3.702P^0^0"
 | 
|---|
| 190 |  L -^XMB(3.7,XMDUZ,2,.5)
 | 
|---|
| 191 |  Q
 | 
|---|
| 192 | CARRIVE ; Clean the postmaster's ARRIVING basket
 | 
|---|
| 193 |  N XMZ,XMCNT,XMZLAST,XMDATE,XMPARM
 | 
|---|
| 194 |  S XMPARM("END")=$$PDATE(+$P($G(^XMB(1,1,.14)),U,1),2)
 | 
|---|
| 195 |  L +^XMB(3.7,.5,2,.95):5 E  Q
 | 
|---|
| 196 |  S (XMZ,XMCNT,XMZLAST)=0
 | 
|---|
| 197 |  F  S XMZ=$O(^XMB(3.7,.5,2,.95,1,XMZ)) Q:XMZ'>0  D
 | 
|---|
| 198 |  . I '$D(^XMB(3.9,XMZ,0)) D  Q
 | 
|---|
| 199 |  . . S DA=XMZ,DA(1)=.95,DA(2)=.5,DIK="^XMB(3.7,.5,2,.95,1," D ^DIK
 | 
|---|
| 200 |  . ; If it's still arriving, its date will be a FileMan date.
 | 
|---|
| 201 |  . ; After it's finished arriving, its date will be an internet (text) date.
 | 
|---|
| 202 |  . S XMDATE=$P($G(^XMB(3.9,XMZ,0)),U,3)
 | 
|---|
| 203 |  . I XMDATE?7N1".".N,XMDATE'>XMPARM("END") D  Q  ; been arriving for over 24 hours
 | 
|---|
| 204 |  . . S DA=XMZ,DA(1)=.95,DA(2)=.5,DIK="^XMB(3.7,.5,2,.95,1," D ^DIK
 | 
|---|
| 205 |  . S XMCNT=XMCNT+1,XMZLAST=XMZ
 | 
|---|
| 206 |  S ^XMB(3.7,.5,2,.95,0)="ARRIVING",^(1,0)="^3.702P^"_XMZLAST_U_XMCNT
 | 
|---|
| 207 |  L -^XMB(3.7,.5,2,.95)
 | 
|---|
| 208 |  Q
 | 
|---|