Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XMUT4

XMUT4.m

Go to the documentation of this file.
  1. XMUT4 ;ISC-SF/GMB-Integrity Checker for files 3.7, 3.9 ;07/15/2002 07:25
  1. ;;8.0;MailMan;;Jun 28, 2002
  1. ; Was (WASH ISC)/CAP
  1. ;
  1. ; Entry points used by MailMan options (not covered by DBIA):
  1. ; CHKFILES XMUT-CHKFIL
  1. Q
  1. CHKFILES ;
  1. I $D(ZTQUEUED) D PROCESS Q
  1. N XMABORT
  1. S XMABORT=0
  1. D WARNING^XMUT41(.XMABORT) Q:XMABORT
  1. D EN^XUTMDEVQ("PROCESS^XMUT4",$$EZBLD^DIALOG(36080)) ; MailMan: Global Integrity Checker
  1. Q
  1. PROCESS ;
  1. I $D(ZTQUEUED) S ZTREQ="@"
  1. N XMABORT
  1. S XMABORT=0
  1. D MAILBOX(.XMABORT)
  1. D:'XMABORT MESSAGE^XMUT4C(.XMABORT)
  1. D SUMMARY^XMUT41(XMABORT)
  1. Q
  1. MAILBOX(XMABORT) ;
  1. W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36081) ; Checking MAILBOX file 3.7
  1. D USERS(.XMABORT) Q:XMABORT
  1. D MXREF^XMUT41(.XMABORT) Q:XMABORT
  1. D POSTBSKT^XMUT41
  1. Q
  1. USERS(XMABORT) ;
  1. ; XMUCNT # users
  1. ; XMUKCNT # bskts for a particular user
  1. ; XMUECNT # msg entries for a particular user
  1. ; XMKCNT # bskts
  1. ; XMECNT # msg entries
  1. N XMUSER,XMECNT,XMUCNT,XMKCNT,XMUKCNT,XMUECNT
  1. W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36082),! ; Checking each user mailbox
  1. S (XMUSER,XMECNT,XMUCNT,XMKCNT)=0
  1. F S XMUSER=$O(^XMB(3.7,XMUSER)) Q:XMUSER'>0 D Q:XMABORT
  1. . S XMUCNT=XMUCNT+1 I XMUCNT#20=0 D Q:XMABORT
  1. . . I '$D(ZTQUEUED) W:$X>40 ! W XMUCNT,"." Q
  1. . . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop
  1. . D USER(XMUSER,.XMUKCNT,.XMUECNT)
  1. . S XMKCNT=XMKCNT+XMUKCNT
  1. . S XMECNT=XMECNT+XMUECNT
  1. Q:XMABORT
  1. I '$D(ZTQUEUED) D
  1. . N XMPARM,XMTEXT
  1. . S XMPARM(1)=XMUCNT,XMPARM(2)=XMKCNT,XMPARM(3)=XMECNT
  1. . W !
  1. . D BLD^DIALOG(36083,.XMPARM,"","XMTEXT","F")
  1. . D MSG^DIALOG("WM","","","","XMTEXT")
  1. . ;|1| Users, |2| Baskets, |3| Msg Entries"
  1. I $D(^XMB(3.7,0)) S:$P(^XMB(3.7,0),U,4)'=XMUCNT $P(^(0),U,4)=XMUCNT Q
  1. S ^XMB(3.7,0)="MAILBOX^3.7P^3^"_XMUCNT
  1. Q
  1. USER(XMUSER,XMUKCNT,XMUECNT) ;
  1. ; XMUNCNT # new msgs for a user
  1. ; XMUKECNT # msgs in a user's bskt
  1. ; XMUKNCNT # new msgs in a user's bskt
  1. N XMK,XMUKNCNT,XMUKECNT,XMUNCNT
  1. D BXREF(XMUSER)
  1. D N0XREF(XMUSER)
  1. S (XMK,XMUKCNT,XMUNCNT,XMUECNT)=0
  1. F S XMK=$O(^XMB(3.7,XMUSER,2,XMK)) Q:XMK'>0 D
  1. . Q:XMK=.95
  1. . S XMUKCNT=XMUKCNT+1
  1. . D BSKT(XMUSER,XMK,.XMUKNCNT,.XMUKECNT)
  1. . S XMUNCNT=XMUNCNT+XMUKNCNT
  1. . S XMUECNT=XMUECNT+XMUKECNT
  1. S:$P($G(^XMB(3.7,XMUSER,0)),U,1)'=XMUSER $P(^(0),U,1)=XMUSER
  1. S:$P(^XMB(3.7,XMUSER,0),U,6)'=XMUNCNT $P(^(0),U,6)=XMUNCNT
  1. S:'$D(^XMB(3.7,"B",XMUSER,XMUSER)) ^XMB(3.7,"B",XMUSER,XMUSER)=""
  1. 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
  1. S ^XMB(3.7,XMUSER,2,0)="^3.701^"_$O(^XMB(3.7,XMUSER,2,"B"),-1)_U_XMUKCNT
  1. Q
  1. BSKT(XMUSER,XMK,XMUKNCNT,XMUKECNT) ;
  1. N XMKN,XMKZ,XMZ,XMREC,XMRESEQ,XMKNAME
  1. S XMKNAME(1)=$$EZBLD^DIALOG(37005) ; IN
  1. S XMKNAME(.5)=$$EZBLD^DIALOG(37004) ; WASTE
  1. S XMKNAME("?")=$$EZBLD^DIALOG(34009) ; * No Name *
  1. D CXREF(XMUSER,XMK,.XMRESEQ)
  1. S (XMZ,XMUKNCNT,XMUKECNT)=0
  1. F S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,XMZ)) Q:XMZ'>0 D
  1. . S XMREC=^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)
  1. . I $P(XMREC,U,1)'=XMZ D
  1. . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,1)=XMZ
  1. . . D ERR(103,XMUSER,XMK,XMZ) ; Msg in bskt, but no .01 field: .01 field created
  1. . I '$D(^XMB(3.9,XMZ,0)) D Q
  1. . . D ERR(101,XMUSER,XMK,XMZ) ; Msg in bskt, but no msg: removed from bskt
  1. . . D ZAPIT^XMXMSGS2(XMUSER,XMK,XMZ)
  1. . S XMUKECNT=XMUKECNT+1
  1. . S XMKZ=$P(XMREC,U,2)
  1. . I XMKZ D
  1. . . 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
  1. . E D
  1. . . S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",""),-1)+1
  1. . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ
  1. . . S ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)=""
  1. . . D ERR(102,XMUSER,XMK,XMZ) ; Msg in bskt, but no seq #: seq # created
  1. . 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
  1. . ;I XMUSER=.5,XMK>999 Q
  1. . I $P(XMREC,U,3) D
  1. . . I XMK=.5 D Q
  1. . . . D ERR(104,XMUSER,XMK,XMZ) ; New msg in WASTE bskt: msg made not new
  1. . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)=""
  1. . . . K ^XMB(3.7,XMUSER,"N0",XMK,XMZ)
  1. . . S XMUKNCNT=XMUKNCNT+1
  1. . . 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
  1. I '$D(^XMB(3.7,XMUSER,2,XMK,0)) D
  1. . S XMKN=$G(XMKNAME(XMK),XMKNAME("?"))
  1. . S ^XMB(3.7,XMUSER,2,XMK,0)=XMKN
  1. . D ERR(131,XMUSER,XMK) ; No bskt 0 node: created
  1. E D
  1. . S XMKN=$P(^XMB(3.7,XMUSER,2,XMK,0),U)
  1. . I XMKN="" D Q
  1. . . S XMKN=$G(XMKNAME(XMK),XMKNAME("?"))
  1. . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
  1. . . D ERR(132,XMUSER,XMK) ; Bskt name null: created
  1. . Q:XMK>1
  1. . Q:'$D(XMKNAME(XMK))
  1. . Q:XMKN=XMKNAME(XMK)
  1. . N XMKNBAD
  1. . S XMKNBAD=XMKN
  1. . S XMKN=XMKNAME(XMK)
  1. . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
  1. . K ^XMB(3.7,XMUSER,2,"B",XMKNBAD,XMK)
  1. . D ERR(134,XMUSER,XMK,"",XMKNBAD) ; Bskt name '|1|' wrong: corrected
  1. 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
  1. S:$P(^XMB(3.7,XMUSER,2,XMK,0),U,2)'=XMUKNCNT $P(^(0),U,2)=XMUKNCNT
  1. I $D(^XMB(3.7,XMUSER,2,XMK,1,0)) D
  1. . S:$P(^XMB(3.7,XMUSER,2,XMK,1,0),U,4)'=XMUKECNT $P(^(0),U,4)=XMUKECNT
  1. E I XMUKECNT D
  1. . S ^XMB(3.7,XMUSER,2,XMK,1,0)="^3.702P^"_$O(^XMB(3.7,XMUSER,2,XMK,1,"C"),-1)_U_XMUKECNT
  1. . D ERR(133,XMUSER,XMK) ; No msg multiple 0 node: created
  1. Q:'$G(XMRESEQ)
  1. D RSEQ^XMXBSKT(XMUSER,XMK)
  1. D ERR(125,XMUSER,XMK) ; C xref duplicate seq #s: bskt reseq'd
  1. Q
  1. CXREF(XMUSER,XMK,XMRESEQ) ; Check the bskt's C xref (msg seq numbers in bskt)
  1. N XMKZ,XMZ,XMCNT
  1. S XMKZ=0
  1. F S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ)) Q:'XMKZ D
  1. . S (XMZ,XMCNT)=0
  1. . F S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)) Q:'XMZ D
  1. . . S XMCNT=XMCNT+1
  1. . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,2)=XMKZ
  1. . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D Q
  1. . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_U_XMKZ
  1. . . . D ERR(122,XMUSER,XMK,XMZ) ; C xref, but msg not in bskt: put in bskt
  1. . . I $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)="" D Q
  1. . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ
  1. . . . D ERR(123,XMUSER,XMK,XMZ) ; C xref, but no msg seq #: set seq # using xref
  1. . . K ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)
  1. . . D ERR(124,XMUSER,XMK,XMZ) ; C xref does not match msg seq #: xref killed
  1. . S:XMCNT>1 XMRESEQ=1
  1. Q
  1. N0XREF(XMUSER) ; Check the user's N0 xref (new msgs)
  1. N XMK,XMZ
  1. S XMK=0
  1. F S XMK=$O(^XMB(3.7,XMUSER,"N0",XMK)) Q:'XMK D
  1. . S XMZ=0
  1. . F S XMZ=$O(^XMB(3.7,XMUSER,"N0",XMK,XMZ)) Q:'XMZ D
  1. . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,3)=1
  1. . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D Q
  1. . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_"^^1"
  1. . . . D ERR(126,XMUSER,XMK,XMZ) ; N0 xref, but msg not in bskt: msg put in bskt
  1. . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)=1
  1. . . D ERR(127,XMUSER,XMK,XMZ) ; N0 xref, but msg not new: new flag set
  1. Q
  1. BXREF(XMUSER) ; Check the user's B xref (bskt names)
  1. N XMK,XMKN
  1. S XMKN=""
  1. F S XMKN=$O(^XMB(3.7,XMUSER,2,"B",XMKN)) Q:XMKN="" D
  1. . S XMK=0
  1. . F S XMK=$O(^XMB(3.7,XMUSER,2,"B",XMKN,XMK)) Q:'XMK D
  1. . . Q:$E($P($G(^XMB(3.7,XMUSER,2,XMK,0)),U),1,30)=XMKN
  1. . . I $D(^XMB(3.7,XMUSER,2,XMK,0)) D Q
  1. . . . I $P($G(^XMB(3.7,XMUSER,2,XMK,0)),U)="" D Q
  1. . . . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
  1. . . . . D ERR(151,XMUSER,XMK) ; B xref, but bskt name null: name set using xref
  1. . . . D ERR(153,XMUSER,XMK) ; B xref does not match bskt name: xref killed
  1. . . . K ^XMB(3.7,XMUSER,2,"B",XMKN,XMK)
  1. . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN
  1. . . D ERR(152,XMUSER,XMK) ; B xref, but no bskt node: node set using xref
  1. Q
  1. ERR(XMERRNUM,XMUSER,XMK,XMZ,XMDPARM) ;
  1. S XMERROR(XMERRNUM)=$G(XMERROR(XMERRNUM))+1
  1. Q:$D(ZTQUEUED)
  1. N XMPARM
  1. S XMPARM(1)=XMUSER,XMPARM(2)=XMK,XMPARM(3)=XMERRNUM
  1. S XMPARM(4)=$$EZBLD^DIALOG(36000+XMERRNUM,.XMDPARM)
  1. ;DUZ=|1|, Bskt=|2|$S($G(XMZ):", Msg=|5|",1:""), Err=|3| |4|
  1. I $G(XMZ) S XMPARM(5)=XMZ W !,$$EZBLD^DIALOG(36099,.XMPARM) Q
  1. W !,$$EZBLD^DIALOG(36098,.XMPARM)
  1. Q
  1. ;34009 * No Name *
  1. ;37004 WASTE
  1. ;37005 IN
  1. ;36098 DUZ=|1|, Bskt=|2|, Err=|3| |4|
  1. ;36099 DUZ=|1|, Bskt=|2|, Msg=|5|, Err=|3| |4|
  1. ;36101 Msg in bskt, but no msg: removed from bskt
  1. ;36102 Msg in bskt, but no seq #: seq # created
  1. ;36103 Msg in bskt, but no .01 field: .01 field
  1. ;36104 New msg in WASTE bskt: msg made not new
  1. ;36111 Msg in bskt, but no M xref: xref created
  1. ;36112 Msg in bskt, but no C xref: xref created
  1. ;36113 New msg, but no N0 xref: xref created
  1. ;36122 C xref, but msg not in bskt: put in bskt
  1. ;36123 C xref, but no msg seq #: set seq # using
  1. ;36124 C xref does not match msg seq #: xref kill
  1. ;36125 C xref duplicate seq #s: bskt reseq'd
  1. ;36126 N0 xref, but msg not in bskt: msg put in
  1. ;36127 N0 xref, but msg not new: new flag set
  1. ;36131 No bskt 0 node: created
  1. ;36132 Bskt name null: created
  1. ;36133 No msg multiple 0 node: created
  1. ;36134 Bskt name '|1|' wrong: corrected
  1. ;36141 Bskt name, but no B xref: xref created
  1. ;36151 B xref, but bskt name null: name set using
  1. ;36152 B xref, but no bskt node: node set using
  1. ;36153 B xref does not match bskt name: xref kill