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