1 | XMUT4 ;ISC-SF/GMB-Integrity Checker for files 3.7, 3.9 ;07/15/2002 07:25
|
---|
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 | ; CHKFILES XMUT-CHKFIL
|
---|
7 | Q
|
---|
8 | CHKFILES ;
|
---|
9 | I $D(ZTQUEUED) D PROCESS Q
|
---|
10 | N XMABORT
|
---|
11 | S XMABORT=0
|
---|
12 | D WARNING^XMUT41(.XMABORT) Q:XMABORT
|
---|
13 | D EN^XUTMDEVQ("PROCESS^XMUT4",$$EZBLD^DIALOG(36080)) ; MailMan: Global Integrity Checker
|
---|
14 | Q
|
---|
15 | PROCESS ;
|
---|
16 | I $D(ZTQUEUED) S ZTREQ="@"
|
---|
17 | N XMABORT
|
---|
18 | S XMABORT=0
|
---|
19 | D MAILBOX(.XMABORT)
|
---|
20 | D:'XMABORT MESSAGE^XMUT4C(.XMABORT)
|
---|
21 | D SUMMARY^XMUT41(XMABORT)
|
---|
22 | Q
|
---|
23 | MAILBOX(XMABORT) ;
|
---|
24 | W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36081) ; Checking MAILBOX file 3.7
|
---|
25 | D USERS(.XMABORT) Q:XMABORT
|
---|
26 | D MXREF^XMUT41(.XMABORT) Q:XMABORT
|
---|
27 | D POSTBSKT^XMUT41
|
---|
28 | Q
|
---|
29 | USERS(XMABORT) ;
|
---|
30 | ; XMUCNT # users
|
---|
31 | ; XMUKCNT # bskts for a particular user
|
---|
32 | ; XMUECNT # msg entries for a particular user
|
---|
33 | ; XMKCNT # bskts
|
---|
34 | ; XMECNT # msg entries
|
---|
35 | N XMUSER,XMECNT,XMUCNT,XMKCNT,XMUKCNT,XMUECNT
|
---|
36 | W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36082),! ; Checking each user mailbox
|
---|
37 | S (XMUSER,XMECNT,XMUCNT,XMKCNT)=0
|
---|
38 | F S XMUSER=$O(^XMB(3.7,XMUSER)) Q:XMUSER'>0 D Q:XMABORT
|
---|
39 | . S XMUCNT=XMUCNT+1 I XMUCNT#20=0 D Q:XMABORT
|
---|
40 | . . I '$D(ZTQUEUED) W:$X>40 ! W XMUCNT,"." Q
|
---|
41 | . . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
|
---|
42 | . D USER(XMUSER,.XMUKCNT,.XMUECNT)
|
---|
43 | . S XMKCNT=XMKCNT+XMUKCNT
|
---|
44 | . S XMECNT=XMECNT+XMUECNT
|
---|
45 | Q:XMABORT
|
---|
46 | I '$D(ZTQUEUED) D
|
---|
47 | . N XMPARM,XMTEXT
|
---|
48 | . S XMPARM(1)=XMUCNT,XMPARM(2)=XMKCNT,XMPARM(3)=XMECNT
|
---|
49 | . W !
|
---|
50 | . D BLD^DIALOG(36083,.XMPARM,"","XMTEXT","F")
|
---|
51 | . D MSG^DIALOG("WM","","","","XMTEXT")
|
---|
52 | . ;|1| Users, |2| Baskets, |3| Msg Entries"
|
---|
53 | I $D(^XMB(3.7,0)) S:$P(^XMB(3.7,0),U,4)'=XMUCNT $P(^(0),U,4)=XMUCNT Q
|
---|
54 | S ^XMB(3.7,0)="MAILBOX^3.7P^3^"_XMUCNT
|
---|
55 | Q
|
---|
56 | USER(XMUSER,XMUKCNT,XMUECNT) ;
|
---|
57 | ; XMUNCNT # new msgs for a user
|
---|
58 | ; XMUKECNT # msgs in a user's bskt
|
---|
59 | ; XMUKNCNT # new msgs in a user's bskt
|
---|
60 | N XMK,XMUKNCNT,XMUKECNT,XMUNCNT
|
---|
61 | D BXREF(XMUSER)
|
---|
62 | D N0XREF(XMUSER)
|
---|
63 | S (XMK,XMUKCNT,XMUNCNT,XMUECNT)=0
|
---|
64 | F S XMK=$O(^XMB(3.7,XMUSER,2,XMK)) Q:XMK'>0 D
|
---|
65 | . Q:XMK=.95
|
---|
66 | . S XMUKCNT=XMUKCNT+1
|
---|
67 | . D BSKT(XMUSER,XMK,.XMUKNCNT,.XMUKECNT)
|
---|
68 | . S XMUNCNT=XMUNCNT+XMUKNCNT
|
---|
69 | . S XMUECNT=XMUECNT+XMUKECNT
|
---|
70 | S:$P($G(^XMB(3.7,XMUSER,0)),U,1)'=XMUSER $P(^(0),U,1)=XMUSER
|
---|
71 | S:$P(^XMB(3.7,XMUSER,0),U,6)'=XMUNCNT $P(^(0),U,6)=XMUNCNT
|
---|
72 | S:'$D(^XMB(3.7,"B",XMUSER,XMUSER)) ^XMB(3.7,"B",XMUSER,XMUSER)=""
|
---|
73 | I $D(^XMB(3.7,XMUSER,2,0)) S:$P(^XMB(3.7,XMUSER,2,0),U,4)'=XMUKCNT $P(^(0),U,4)=XMUKCNT Q
|
---|
74 | S ^XMB(3.7,XMUSER,2,0)="^3.701^"_$O(^XMB(3.7,XMUSER,2,"B"),-1)_U_XMUKCNT
|
---|
75 | Q
|
---|
76 | BSKT(XMUSER,XMK,XMUKNCNT,XMUKECNT) ;
|
---|
77 | N XMKN,XMKZ,XMZ,XMREC,XMRESEQ,XMKNAME
|
---|
78 | S XMKNAME(1)=$$EZBLD^DIALOG(37005) ; IN
|
---|
79 | S XMKNAME(.5)=$$EZBLD^DIALOG(37004) ; WASTE
|
---|
80 | S XMKNAME("?")=$$EZBLD^DIALOG(34009) ; * No Name *
|
---|
81 | D CXREF(XMUSER,XMK,.XMRESEQ)
|
---|
82 | S (XMZ,XMUKNCNT,XMUKECNT)=0
|
---|
83 | F S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,XMZ)) Q:XMZ'>0 D
|
---|
84 | . S XMREC=^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)
|
---|
85 | . I $P(XMREC,U,1)'=XMZ D
|
---|
86 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,1)=XMZ
|
---|
87 | . . D ERR(103,XMUSER,XMK,XMZ) ; Msg in bskt, but no .01 field: .01 field created
|
---|
88 | . I '$D(^XMB(3.9,XMZ,0)) D Q
|
---|
89 | . . D ERR(101,XMUSER,XMK,XMZ) ; Msg in bskt, but no msg: removed from bskt
|
---|
90 | . . D ZAPIT^XMXMSGS2(XMUSER,XMK,XMZ)
|
---|
91 | . S XMUKECNT=XMUKECNT+1
|
---|
92 | . S XMKZ=$P(XMREC,U,2)
|
---|
93 | . I XMKZ D
|
---|
94 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)) S ^(XMZ)="" D ERR(112,XMUSER,XMK,XMZ) ; Msg in bskt, but no C xref: xref created
|
---|
95 | . E D
|
---|
96 | . . S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",""),-1)+1
|
---|
97 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ
|
---|
98 | . . S ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)=""
|
---|
99 | . . D ERR(102,XMUSER,XMK,XMZ) ; Msg in bskt, but no seq #: seq # created
|
---|
100 | . I '$D(^XMB(3.7,"M",XMZ,XMUSER,XMK,XMZ)) S ^(XMZ)="" D ERR(111,XMUSER,XMK,XMZ) ; Msg in bskt, but no M xref: xref created
|
---|
101 | . ;I XMUSER=.5,XMK>999 Q
|
---|
102 | . I $P(XMREC,U,3) D
|
---|
103 | . . I XMK=.5 D Q
|
---|
104 | . . . D ERR(104,XMUSER,XMK,XMZ) ; New msg in WASTE bskt: msg made not new
|
---|
105 | . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)=""
|
---|
106 | . . . K ^XMB(3.7,XMUSER,"N0",XMK,XMZ)
|
---|
107 | . . S XMUKNCNT=XMUKNCNT+1
|
---|
108 | . . I '$D(^XMB(3.7,XMUSER,"N0",XMK,XMZ)) S ^(XMZ)="" D ERR(113,XMUSER,XMK,XMZ) ; New msg, but no N0 xref: xref created
|
---|
109 | I '$D(^XMB(3.7,XMUSER,2,XMK,0)) D
|
---|
110 | . S XMKN=$G(XMKNAME(XMK),XMKNAME("?"))
|
---|
111 | . S ^XMB(3.7,XMUSER,2,XMK,0)=XMKN
|
---|
112 | . D ERR(131,XMUSER,XMK) ; No bskt 0 node: created
|
---|
113 | E D
|
---|
114 | . S XMKN=$P(^XMB(3.7,XMUSER,2,XMK,0),U)
|
---|
115 | . I XMKN="" D Q
|
---|
116 | . . S XMKN=$G(XMKNAME(XMK),XMKNAME("?"))
|
---|
117 | . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
|
---|
118 | . . D ERR(132,XMUSER,XMK) ; Bskt name null: created
|
---|
119 | . Q:XMK>1
|
---|
120 | . Q:'$D(XMKNAME(XMK))
|
---|
121 | . Q:XMKN=XMKNAME(XMK)
|
---|
122 | . N XMKNBAD
|
---|
123 | . S XMKNBAD=XMKN
|
---|
124 | . S XMKN=XMKNAME(XMK)
|
---|
125 | . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
|
---|
126 | . K ^XMB(3.7,XMUSER,2,"B",XMKNBAD,XMK)
|
---|
127 | . D ERR(134,XMUSER,XMK,"",XMKNBAD) ; Bskt name '|1|' wrong: corrected
|
---|
128 | I '$D(^XMB(3.7,XMUSER,2,"B",$E(XMKN,1,30),XMK)) S ^(XMK)="" D ERR(141,XMUSER,XMK) ; Bskt name, but no B xref: xref created
|
---|
129 | S:$P(^XMB(3.7,XMUSER,2,XMK,0),U,2)'=XMUKNCNT $P(^(0),U,2)=XMUKNCNT
|
---|
130 | I $D(^XMB(3.7,XMUSER,2,XMK,1,0)) D
|
---|
131 | . S:$P(^XMB(3.7,XMUSER,2,XMK,1,0),U,4)'=XMUKECNT $P(^(0),U,4)=XMUKECNT
|
---|
132 | E I XMUKECNT D
|
---|
133 | . S ^XMB(3.7,XMUSER,2,XMK,1,0)="^3.702P^"_$O(^XMB(3.7,XMUSER,2,XMK,1,"C"),-1)_U_XMUKECNT
|
---|
134 | . D ERR(133,XMUSER,XMK) ; No msg multiple 0 node: created
|
---|
135 | Q:'$G(XMRESEQ)
|
---|
136 | D RSEQ^XMXBSKT(XMUSER,XMK)
|
---|
137 | D ERR(125,XMUSER,XMK) ; C xref duplicate seq #s: bskt reseq'd
|
---|
138 | Q
|
---|
139 | CXREF(XMUSER,XMK,XMRESEQ) ; Check the bskt's C xref (msg seq numbers in bskt)
|
---|
140 | N XMKZ,XMZ,XMCNT
|
---|
141 | S XMKZ=0
|
---|
142 | F S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ)) Q:'XMKZ D
|
---|
143 | . S (XMZ,XMCNT)=0
|
---|
144 | . F S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)) Q:'XMZ D
|
---|
145 | . . S XMCNT=XMCNT+1
|
---|
146 | . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,2)=XMKZ
|
---|
147 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D Q
|
---|
148 | . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_U_XMKZ
|
---|
149 | . . . D ERR(122,XMUSER,XMK,XMZ) ; C xref, but msg not in bskt: put in bskt
|
---|
150 | . . I $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)="" D Q
|
---|
151 | . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ
|
---|
152 | . . . D ERR(123,XMUSER,XMK,XMZ) ; C xref, but no msg seq #: set seq # using xref
|
---|
153 | . . K ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)
|
---|
154 | . . D ERR(124,XMUSER,XMK,XMZ) ; C xref does not match msg seq #: xref killed
|
---|
155 | . S:XMCNT>1 XMRESEQ=1
|
---|
156 | Q
|
---|
157 | N0XREF(XMUSER) ; Check the user's N0 xref (new msgs)
|
---|
158 | N XMK,XMZ
|
---|
159 | S XMK=0
|
---|
160 | F S XMK=$O(^XMB(3.7,XMUSER,"N0",XMK)) Q:'XMK D
|
---|
161 | . S XMZ=0
|
---|
162 | . F S XMZ=$O(^XMB(3.7,XMUSER,"N0",XMK,XMZ)) Q:'XMZ D
|
---|
163 | . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,3)=1
|
---|
164 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D Q
|
---|
165 | . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_"^^1"
|
---|
166 | . . . D ERR(126,XMUSER,XMK,XMZ) ; N0 xref, but msg not in bskt: msg put in bskt
|
---|
167 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)=1
|
---|
168 | . . D ERR(127,XMUSER,XMK,XMZ) ; N0 xref, but msg not new: new flag set
|
---|
169 | Q
|
---|
170 | BXREF(XMUSER) ; Check the user's B xref (bskt names)
|
---|
171 | N XMK,XMKN
|
---|
172 | S XMKN=""
|
---|
173 | F S XMKN=$O(^XMB(3.7,XMUSER,2,"B",XMKN)) Q:XMKN="" D
|
---|
174 | . S XMK=0
|
---|
175 | . F S XMK=$O(^XMB(3.7,XMUSER,2,"B",XMKN,XMK)) Q:'XMK D
|
---|
176 | . . Q:$E($P($G(^XMB(3.7,XMUSER,2,XMK,0)),U),1,30)=XMKN
|
---|
177 | . . I $D(^XMB(3.7,XMUSER,2,XMK,0)) D Q
|
---|
178 | . . . I $P($G(^XMB(3.7,XMUSER,2,XMK,0)),U)="" D Q
|
---|
179 | . . . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
|
---|
180 | . . . . D ERR(151,XMUSER,XMK) ; B xref, but bskt name null: name set using xref
|
---|
181 | . . . D ERR(153,XMUSER,XMK) ; B xref does not match bskt name: xref killed
|
---|
182 | . . . K ^XMB(3.7,XMUSER,2,"B",XMKN,XMK)
|
---|
183 | . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
|
---|
184 | . . D ERR(152,XMUSER,XMK) ; B xref, but no bskt node: node set using xref
|
---|
185 | Q
|
---|
186 | ERR(XMERRNUM,XMUSER,XMK,XMZ,XMDPARM) ;
|
---|
187 | S XMERROR(XMERRNUM)=$G(XMERROR(XMERRNUM))+1
|
---|
188 | Q:$D(ZTQUEUED)
|
---|
189 | N XMPARM
|
---|
190 | S XMPARM(1)=XMUSER,XMPARM(2)=XMK,XMPARM(3)=XMERRNUM
|
---|
191 | S XMPARM(4)=$$EZBLD^DIALOG(36000+XMERRNUM,.XMDPARM)
|
---|
192 | ;DUZ=|1|, Bskt=|2|$S($G(XMZ):", Msg=|5|",1:""), Err=|3| |4|
|
---|
193 | I $G(XMZ) S XMPARM(5)=XMZ W !,$$EZBLD^DIALOG(36099,.XMPARM) Q
|
---|
194 | W !,$$EZBLD^DIALOG(36098,.XMPARM)
|
---|
195 | Q
|
---|
196 | ;34009 * No Name *
|
---|
197 | ;37004 WASTE
|
---|
198 | ;37005 IN
|
---|
199 | ;36098 DUZ=|1|, Bskt=|2|, Err=|3| |4|
|
---|
200 | ;36099 DUZ=|1|, Bskt=|2|, Msg=|5|, Err=|3| |4|
|
---|
201 | ;36101 Msg in bskt, but no msg: removed from bskt
|
---|
202 | ;36102 Msg in bskt, but no seq #: seq # created
|
---|
203 | ;36103 Msg in bskt, but no .01 field: .01 field
|
---|
204 | ;36104 New msg in WASTE bskt: msg made not new
|
---|
205 | ;36111 Msg in bskt, but no M xref: xref created
|
---|
206 | ;36112 Msg in bskt, but no C xref: xref created
|
---|
207 | ;36113 New msg, but no N0 xref: xref created
|
---|
208 | ;36122 C xref, but msg not in bskt: put in bskt
|
---|
209 | ;36123 C xref, but no msg seq #: set seq # using
|
---|
210 | ;36124 C xref does not match msg seq #: xref kill
|
---|
211 | ;36125 C xref duplicate seq #s: bskt reseq'd
|
---|
212 | ;36126 N0 xref, but msg not in bskt: msg put in
|
---|
213 | ;36127 N0 xref, but msg not new: new flag set
|
---|
214 | ;36131 No bskt 0 node: created
|
---|
215 | ;36132 Bskt name null: created
|
---|
216 | ;36133 No msg multiple 0 node: created
|
---|
217 | ;36134 Bskt name '|1|' wrong: corrected
|
---|
218 | ;36141 Bskt name, but no B xref: xref created
|
---|
219 | ;36151 B xref, but bskt name null: name set using
|
---|
220 | ;36152 B xref, but no bskt node: node set using
|
---|
221 | ;36153 B xref does not match bskt name: xref kill
|
---|