- XMUT4C ;ISC-SF/GMB-Integrity Checker for file 3.9 ;04/19/2002 13:00
- ;;8.0;MailMan;;Jun 28, 2002
- ; Was (WASH ISC)/CAP
- MESSAGE(XMABORT) ;
- N XMZ,XMCNT,XMZREC,XMCRE8
- W !!,$$EZBLD^DIALOG(36094),! ; Checking MESSAGE file 3.9
- F S XMZ=$O(^XMB(3.9,":"),-1) Q:XMZ?1N.N D BOGUS(XMZ)
- S (XMZ,XMCNT)=0
- F S XMZ=$O(^XMB(3.9,XMZ)) Q:XMZ'>0 D Q:XMABORT
- . I XMZ'?1N.N D BOGUS(XMZ) Q
- . 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
- . S XMZREC=$G(^XMB(3.9,XMZ,0))
- . I "^^^^^^^^"[XMZREC D
- . . D ERR(XMZ,201) ; Msg has bad/no 0 node: not fixed
- . E D
- . . D SUBJ(XMZ,XMZREC)
- . . I $P(XMZREC,U,2)="" D
- . . . S $P(^XMB(3.9,XMZ,0),U,2)=$$EZBLD^DIALOG(34009) ;* No Name *
- . . . D ERR(XMZ,206) ; Msg has no sender: fixed
- . . I $P(XMZREC,U,3)="" D
- . . . S $P(^XMB(3.9,XMZ,0),U,3)=DT
- . . . D ERR(XMZ,207) ; Msg has no date/time: fixed
- . D CRE8DT(XMZ,$P(XMZREC,U,3))
- . D RESP(XMZ,XMZREC)
- . D:$D(^XMB(3.9,XMZ,1)) RECIP(XMZ)
- Q:XMABORT
- W !!,$$EZBLD^DIALOG(36093,XMCNT) ; |1| messages in the MESSAGE file 3.9
- I XMCNT=$P(^XMB(3.9,0),U,4) W !,$$EZBLD^DIALOG(36095) Q ; Zero node is OK
- L +^XMB(3.9,0):1
- S $P(^XMB(3.9,0),U,4)=XMCNT
- L -^XMB(3.9,0)
- W !,$$EZBLD^DIALOG(36096) ; I reset the zero node.
- Q
- BOGUS(XMZ) ;
- D ERR(XMZ,210) ; Msg IEN is corrupted: fixed
- I $L($P($G(^XMB(3.9,XMZ,0)),U,1)) K ^XMB(3.9,"B",$E($P(^XMB(3.9,XMZ,0),U,1),1,30),XMZ)
- K ^XMB(3.9,"C",+$P($G(^XMB(3.9,XMZ,.6)),U,1),XMZ)
- K ^XMB(3.9,XMZ)
- Q
- SUBJ(XMZ,XMZREC) ;
- N XMSUBJ
- S XMSUBJ=$P(XMZREC,U)
- I XMSUBJ="" D
- . S XMSUBJ=$$EZBLD^DIALOG(34012) ;* No Subject *
- . S $P(^XMB(3.9,XMZ,0),U,1)=XMSUBJ
- . S ^XMB(3.9,"B",XMSUBJ,XMZ)=""
- . D ERR(XMZ,202) ; Msg has no subject: fixed
- I '$D(^XMB(3.9,"B",$E(XMSUBJ,1,30),XMZ)) D
- . I $L(XMSUBJ)>30,$D(^XMB(3.9,"B",XMSUBJ,XMZ)) D
- . . K ^XMB(3.9,"B",XMSUBJ,XMZ)
- . . D ERR(XMZ,205) ; Subject B xref too long: xref shortened
- . E D ERR(XMZ,204) ; Subject has no B xref: xref created
- . S ^XMB(3.9,"B",$E(XMSUBJ,1,30),XMZ)=""
- I $L(XMSUBJ)<3!($L(XMSUBJ)>65) D
- . D ERR(XMZ,203) ; Msg subject <3 or >65: fixed
- . S XMSUBJ=$S($L(XMSUBJ)<3:XMSUBJ_"...",1:$E(XMSUBJ,1,65))
- . N XMFDA
- . S XMFDA(3.9,XMZ_",",.01)=XMSUBJ
- . D FILE^DIE("","XMFDA")
- Q
- RESP(XMZ,XMZREC) ;
- N XMZO
- I $P(XMZREC,U,8) D Q
- . S XMZO=$P(XMZREC,U,8)
- . I XMZO=XMZ D Q
- . . D ERR(XMZ,211) ; Message thinks it's a response to itself: fixed
- . . S $P(^XMB(3.9,XMZ,0),U,8)=""
- . I '$D(^XMB(3.9,XMZO,0)) D Q
- . . D ERR(XMZ,212,XMZO) ; No original message |1| for this response: fixed
- . . S $P(^XMB(3.9,XMZ,0),U,8)=""
- . I $$ATTACHED(XMZO,XMZ) Q
- . D ERR(XMZ,213,XMZO) ; Not in response chain of |1|: fixed
- . S $P(^XMB(3.9,XMZ,0),U,8)=""
- N XMSUBJ
- S XMSUBJ=$P(XMZREC,U)
- Q:XMSUBJ'?1"R"1.N
- Q:$P(XMZREC,U,2)["@"
- S XMZO=+$E(XMSUBJ,2,99)
- I '$D(^XMB(3.9,XMZO,0)) D Q
- . D ERR(XMZ,216,XMZO) ; No original message |1| for this response: not fixed
- I '$$ATTACHED(XMZO,XMZ) D Q
- . D ERR(XMZ,217,XMZO) ; Not in response chain of |1|: not fixed
- D ERR(XMZ,218,XMZO) ; Piece 8 didn't point to original message |1|: fixed
- S $P(^XMB(3.9,XMZ,0),U,8)=XMZO
- Q
- ATTACHED(XMZO,XMZ) ; Is XMZ in the response chain of XMZO?
- N I
- S I=0
- F S I=$O(^XMB(3.9,XMZO,3,I)) Q:'I Q:$P($G(^(I,0)),U)=XMZ
- Q +I
- CRE8DT(XMZ,XMDATE) ;
- S XMCRE8=$P($G(^XMB(3.9,XMZ,.6)),U,1)
- I 'XMCRE8 D Q
- . I $P(XMDATE,".",1)?7N S XMDATE=$P(XMDATE,".",1)
- . E I XMDATE="" S XMDATE=DT
- . E D
- . . S XMDATE=$$CONVERT^XMXUTIL1(XMDATE)
- . . S:XMDATE=-1 XMDATE=DT
- . S $P(^XMB(3.9,XMZ,.6),U,1)=XMDATE
- . S ^XMB(3.9,"C",XMDATE,XMZ)=""
- . D ERR(XMZ,208) ; Msg has no local create date: fixed
- I '$D(^XMB(3.9,"C",XMCRE8,XMZ)) D
- . S ^XMB(3.9,"C",XMCRE8,XMZ)=""
- . D ERR(XMZ,209) ; Local create date C xref missing: fixed
- Q
- RECIP(XMZ) ; Check recipient multiple
- N I,XMVAL,XMXREF,XMRECIPS
- D CXREF(XMZ)
- S (I,XMRECIPS)=0
- F S I=$O(^XMB(3.9,XMZ,1,I)) Q:'I D
- . S XMVAL=$P($G(^XMB(3.9,XMZ,1,I,0)),U)
- . I XMVAL="" D Q
- . . Q:$P(^XMB(3.9,XMZ,.6),U,1)=DT
- . . K ^XMB(3.9,XMZ,1,I)
- . . D ERR(XMZ,221,I) ; Recipient |1| null, no C xref: fixed
- . S XMRECIPS=XMRECIPS+1
- . Q:$D(^XMB(3.9,XMZ,1,"C",$E(XMVAL,1,30),I))
- . I $L(XMVAL)>30,$D(^XMB(3.9,XMZ,1,"C",XMVAL,I)) D Q
- . . ;K ^XMB(3.9,XMZ,1,"C",XMVAL,I)
- . . ;D ERR(XMZ,223,I) ; Recipient |1| C xref too long: xref shortened
- . . ;S ^XMB(3.9,XMZ,1,"C",$E(XMVAL,1,30),I)=""
- . D ERR(XMZ,222,I) ; Recipient |1| no C xref: xref created
- . S ^XMB(3.9,XMZ,1,"C",$E(XMVAL,1,30),I)=""
- I $D(^XMB(3.9,XMZ,1,0)) S:$P(^XMB(3.9,XMZ,1,0),U,4)'=XMRECIPS $P(^(0),U,4)=XMRECIPS Q
- S ^XMB(3.9,XMZ,1,0)="^3.91A^"_I_U_XMRECIPS
- Q
- CXREF(XMZ) ; Check C xref for Recipient multiple
- N I,XMVAL,XMXREF
- S (I,XMXREF)=""
- F S XMXREF=$O(^XMB(3.9,XMZ,1,"C",XMXREF)) Q:XMXREF="" D
- . F S I=$O(^XMB(3.9,XMZ,1,"C",XMXREF,I)) Q:'I D
- . . S XMVAL=$P($G(^XMB(3.9,XMZ,1,I,0)),U)
- . . Q:$E(XMVAL,1,30)=$E(XMXREF,1,30)
- . . I XMVAL="" D Q
- . . . S $P(^XMB(3.9,XMZ,1,I,0),U)=XMXREF
- . . . I $L(XMXREF)<30 D ERR(XMZ,231,I) Q ; C xref, but recip |1| null: fixed using xref
- . . . D ERR(XMZ,232,I) ; C xref, but recip |1| null: fixed, but CHECK
- . . K ^XMB(3.9,XMZ,1,"C",XMXREF,I)
- . . D ERR(XMZ,233,I) ; C xref for recip |1| doesn't match recip: xref killed
- Q
- ERR(XMZ,XMERRNUM,XMDPARM) ;
- N XMPARM
- S XMERROR(XMERRNUM)=$G(XMERROR(XMERRNUM))+1
- S XMPARM(1)=XMZ,XMPARM(2)=$J(XMERRNUM,3)
- S XMPARM(3)=$$EZBLD^DIALOG(36300+XMERRNUM,.XMDPARM)
- W !,$$EZBLD^DIALOG(36097,.XMPARM) ;Msg=|1|, Err=|2| |3|
- Q
- XMUT4C ;ISC-SF/GMB-Integrity Checker for file 3.9 ;04/19/2002 13:00
- +1 ;;8.0;MailMan;;Jun 28, 2002
- +2 ; Was (WASH ISC)/CAP
- MESSAGE(XMABORT) ;
- +1 NEW XMZ,XMCNT,XMZREC,XMCRE8
- +2 ; Checking MESSAGE file 3.9
- WRITE !!,$$EZBLD^DIALOG(36094),!
- +3 FOR
- SET XMZ=$ORDER(^XMB(3.9,":"),-1)
- IF XMZ?1N.N
- QUIT
- DO BOGUS(XMZ)
- +4 SET (XMZ,XMCNT)=0
- +5 FOR
- SET XMZ=$ORDER(^XMB(3.9,XMZ))
- IF XMZ'>0
- QUIT
- Begin DoDot:1
- +6 IF XMZ'?1N.N
- DO BOGUS(XMZ)
- QUIT
- +7 SET XMCNT=XMCNT+1
- IF XMCNT#5000=0
- Begin DoDot:2
- +8 IF '$DATA(ZTQUEUED)
- IF $X>40
- WRITE !
- WRITE XMCNT,"."
- QUIT
- +9 ; User asked the task to stop
- IF $$S^%ZTLOAD
- SET (XMABORT,ZTSTOP)=1
- End DoDot:2
- IF XMABORT
- QUIT
- +10 SET XMZREC=$GET(^XMB(3.9,XMZ,0))
- +11 IF "^^^^^^^^"[XMZREC
- Begin DoDot:2
- +12 ; Msg has bad/no 0 node: not fixed
- DO ERR(XMZ,201)
- End DoDot:2
- +13 IF '$TEST
- Begin DoDot:2
- +14 DO SUBJ(XMZ,XMZREC)
- +15 IF $PIECE(XMZREC,U,2)=""
- Begin DoDot:3
- +16 ;* No Name *
- SET $PIECE(^XMB(3.9,XMZ,0),U,2)=$$EZBLD^DIALOG(34009)
- +17 ; Msg has no sender: fixed
- DO ERR(XMZ,206)
- End DoDot:3
- +18 IF $PIECE(XMZREC,U,3)=""
- Begin DoDot:3
- +19 SET $PIECE(^XMB(3.9,XMZ,0),U,3)=DT
- +20 ; Msg has no date/time: fixed
- DO ERR(XMZ,207)
- End DoDot:3
- End DoDot:2
- +21 DO CRE8DT(XMZ,$PIECE(XMZREC,U,3))
- +22 DO RESP(XMZ,XMZREC)
- +23 IF $DATA(^XMB(3.9,XMZ,1))
- DO RECIP(XMZ)
- End DoDot:1
- IF XMABORT
- QUIT
- +24 IF XMABORT
- QUIT
- +25 ; |1| messages in the MESSAGE file 3.9
- WRITE !!,$$EZBLD^DIALOG(36093,XMCNT)
- +26 ; Zero node is OK
- IF XMCNT=$PIECE(^XMB(3.9,0),U,4)
- WRITE !,$$EZBLD^DIALOG(36095)
- QUIT
- +27 LOCK +^XMB(3.9,0):1
- +28 SET $PIECE(^XMB(3.9,0),U,4)=XMCNT
- +29 LOCK -^XMB(3.9,0)
- +30 ; I reset the zero node.
- WRITE !,$$EZBLD^DIALOG(36096)
- +31 QUIT
- BOGUS(XMZ) ;
- +1 ; Msg IEN is corrupted: fixed
- DO ERR(XMZ,210)
- +2 IF $LENGTH($PIECE($GET(^XMB(3.9,XMZ,0)),U,1))
- KILL ^XMB(3.9,"B",$EXTRACT($PIECE(^XMB(3.9,XMZ,0),U,1),1,30),XMZ)
- +3 KILL ^XMB(3.9,"C",+$PIECE($GET(^XMB(3.9,XMZ,.6)),U,1),XMZ)
- +4 KILL ^XMB(3.9,XMZ)
- +5 QUIT
- SUBJ(XMZ,XMZREC) ;
- +1 NEW XMSUBJ
- +2 SET XMSUBJ=$PIECE(XMZREC,U)
- +3 IF XMSUBJ=""
- Begin DoDot:1
- +4 ;* No Subject *
- SET XMSUBJ=$$EZBLD^DIALOG(34012)
- +5 SET $PIECE(^XMB(3.9,XMZ,0),U,1)=XMSUBJ
- +6 SET ^XMB(3.9,"B",XMSUBJ,XMZ)=""
- +7 ; Msg has no subject: fixed
- DO ERR(XMZ,202)
- End DoDot:1
- +8 IF '$DATA(^XMB(3.9,"B",$EXTRACT(XMSUBJ,1,30),XMZ))
- Begin DoDot:1
- +9 IF $LENGTH(XMSUBJ)>30
- IF $DATA(^XMB(3.9,"B",XMSUBJ,XMZ))
- Begin DoDot:2
- +10 KILL ^XMB(3.9,"B",XMSUBJ,XMZ)
- +11 ; Subject B xref too long: xref shortened
- DO ERR(XMZ,205)
- End DoDot:2
- +12 ; Subject has no B xref: xref created
- IF '$TEST
- DO ERR(XMZ,204)
- +13 SET ^XMB(3.9,"B",$EXTRACT(XMSUBJ,1,30),XMZ)=""
- End DoDot:1
- +14 IF $LENGTH(XMSUBJ)<3!($LENGTH(XMSUBJ)>65)
- Begin DoDot:1
- +15 ; Msg subject <3 or >65: fixed
- DO ERR(XMZ,203)
- +16 SET XMSUBJ=$SELECT($LENGTH(XMSUBJ)<3:XMSUBJ_"...",1:$EXTRACT(XMSUBJ,1,65))
- +17 NEW XMFDA
- +18 SET XMFDA(3.9,XMZ_",",.01)=XMSUBJ
- +19 DO FILE^DIE("","XMFDA")
- End DoDot:1
- +20 QUIT
- RESP(XMZ,XMZREC) ;
- +1 NEW XMZO
- +2 IF $PIECE(XMZREC,U,8)
- Begin DoDot:1
- +3 SET XMZO=$PIECE(XMZREC,U,8)
- +4 IF XMZO=XMZ
- Begin DoDot:2
- +5 ; Message thinks it's a response to itself: fixed
- DO ERR(XMZ,211)
- +6 SET $PIECE(^XMB(3.9,XMZ,0),U,8)=""
- End DoDot:2
- QUIT
- +7 IF '$DATA(^XMB(3.9,XMZO,0))
- Begin DoDot:2
- +8 ; No original message |1| for this response: fixed
- DO ERR(XMZ,212,XMZO)
- +9 SET $PIECE(^XMB(3.9,XMZ,0),U,8)=""
- End DoDot:2
- QUIT
- +10 IF $$ATTACHED(XMZO,XMZ)
- QUIT
- +11 ; Not in response chain of |1|: fixed
- DO ERR(XMZ,213,XMZO)
- +12 SET $PIECE(^XMB(3.9,XMZ,0),U,8)=""
- End DoDot:1
- QUIT
- +13 NEW XMSUBJ
- +14 SET XMSUBJ=$PIECE(XMZREC,U)
- +15 IF XMSUBJ'?1"R"1.N
- QUIT
- +16 IF $PIECE(XMZREC,U,2)["@"
- QUIT
- +17 SET XMZO=+$EXTRACT(XMSUBJ,2,99)
- +18 IF '$DATA(^XMB(3.9,XMZO,0))
- Begin DoDot:1
- +19 ; No original message |1| for this response: not fixed
- DO ERR(XMZ,216,XMZO)
- End DoDot:1
- QUIT
- +20 IF '$$ATTACHED(XMZO,XMZ)
- Begin DoDot:1
- +21 ; Not in response chain of |1|: not fixed
- DO ERR(XMZ,217,XMZO)
- End DoDot:1
- QUIT
- +22 ; Piece 8 didn't point to original message |1|: fixed
- DO ERR(XMZ,218,XMZO)
- +23 SET $PIECE(^XMB(3.9,XMZ,0),U,8)=XMZO
- +24 QUIT
- ATTACHED(XMZO,XMZ) ; Is XMZ in the response chain of XMZO?
- +1 NEW I
- +2 SET I=0
- +3 FOR
- SET I=$ORDER(^XMB(3.9,XMZO,3,I))
- IF 'I
- QUIT
- IF $PIECE($GET(^(I,0)),U)=XMZ
- QUIT
- +4 QUIT +I
- CRE8DT(XMZ,XMDATE) ;
- +1 SET XMCRE8=$PIECE($GET(^XMB(3.9,XMZ,.6)),U,1)
- +2 IF 'XMCRE8
- Begin DoDot:1
- +3 IF $PIECE(XMDATE,".",1)?7N
- SET XMDATE=$PIECE(XMDATE,".",1)
- +4 IF '$TEST
- IF XMDATE=""
- SET XMDATE=DT
- +5 IF '$TEST
- Begin DoDot:2
- +6 SET XMDATE=$$CONVERT^XMXUTIL1(XMDATE)
- +7 IF XMDATE=-1
- SET XMDATE=DT
- End DoDot:2
- +8 SET $PIECE(^XMB(3.9,XMZ,.6),U,1)=XMDATE
- +9 SET ^XMB(3.9,"C",XMDATE,XMZ)=""
- +10 ; Msg has no local create date: fixed
- DO ERR(XMZ,208)
- End DoDot:1
- QUIT
- +11 IF '$DATA(^XMB(3.9,"C",XMCRE8,XMZ))
- Begin DoDot:1
- +12 SET ^XMB(3.9,"C",XMCRE8,XMZ)=""
- +13 ; Local create date C xref missing: fixed
- DO ERR(XMZ,209)
- End DoDot:1
- +14 QUIT
- RECIP(XMZ) ; Check recipient multiple
- +1 NEW I,XMVAL,XMXREF,XMRECIPS
- +2 DO CXREF(XMZ)
- +3 SET (I,XMRECIPS)=0
- +4 FOR
- SET I=$ORDER(^XMB(3.9,XMZ,1,I))
- IF 'I
- QUIT
- Begin DoDot:1
- +5 SET XMVAL=$PIECE($GET(^XMB(3.9,XMZ,1,I,0)),U)
- +6 IF XMVAL=""
- Begin DoDot:2
- +7 IF $PIECE(^XMB(3.9,XMZ,.6),U,1)=DT
- QUIT
- +8 KILL ^XMB(3.9,XMZ,1,I)
- +9 ; Recipient |1| null, no C xref: fixed
- DO ERR(XMZ,221,I)
- End DoDot:2
- QUIT
- +10 SET XMRECIPS=XMRECIPS+1
- +11 IF $DATA(^XMB(3.9,XMZ,1,"C",$EXTRACT(XMVAL,1,30),I))
- QUIT
- +12 IF $LENGTH(XMVAL)>30
- IF $DATA(^XMB(3.9,XMZ,1,"C",XMVAL,I))
- Begin DoDot:2
- +13 ;K ^XMB(3.9,XMZ,1,"C",XMVAL,I)
- +14 ;D ERR(XMZ,223,I) ; Recipient |1| C xref too long: xref shortened
- +15 ;S ^XMB(3.9,XMZ,1,"C",$E(XMVAL,1,30),I)=""
- End DoDot:2
- QUIT
- +16 ; Recipient |1| no C xref: xref created
- DO ERR(XMZ,222,I)
- +17 SET ^XMB(3.9,XMZ,1,"C",$EXTRACT(XMVAL,1,30),I)=""
- End DoDot:1
- +18 IF $DATA(^XMB(3.9,XMZ,1,0))
- IF $PIECE(^XMB(3.9,XMZ,1,0),U,4)'=XMRECIPS
- SET $PIECE(^(0),U,4)=XMRECIPS
- QUIT
- +19 SET ^XMB(3.9,XMZ,1,0)="^3.91A^"_I_U_XMRECIPS
- +20 QUIT
- CXREF(XMZ) ; Check C xref for Recipient multiple
- +1 NEW I,XMVAL,XMXREF
- +2 SET (I,XMXREF)=""
- +3 FOR
- SET XMXREF=$ORDER(^XMB(3.9,XMZ,1,"C",XMXREF))
- IF XMXREF=""
- QUIT
- Begin DoDot:1
- +4 FOR
- SET I=$ORDER(^XMB(3.9,XMZ,1,"C",XMXREF,I))
- IF 'I
- QUIT
- Begin DoDot:2
- +5 SET XMVAL=$PIECE($GET(^XMB(3.9,XMZ,1,I,0)),U)
- +6 IF $EXTRACT(XMVAL,1,30)=$EXTRACT(XMXREF,1,30)
- QUIT
- +7 IF XMVAL=""
- Begin DoDot:3
- +8 SET $PIECE(^XMB(3.9,XMZ,1,I,0),U)=XMXREF
- +9 ; C xref, but recip |1| null: fixed using xref
- IF $LENGTH(XMXREF)<30
- DO ERR(XMZ,231,I)
- QUIT
- +10 ; C xref, but recip |1| null: fixed, but CHECK
- DO ERR(XMZ,232,I)
- End DoDot:3
- QUIT
- +11 KILL ^XMB(3.9,XMZ,1,"C",XMXREF,I)
- +12 ; C xref for recip |1| doesn't match recip: xref killed
- DO ERR(XMZ,233,I)
- End DoDot:2
- End DoDot:1
- +13 QUIT
- ERR(XMZ,XMERRNUM,XMDPARM) ;
- +1 NEW XMPARM
- +2 SET XMERROR(XMERRNUM)=$GET(XMERROR(XMERRNUM))+1
- +3 SET XMPARM(1)=XMZ
- SET XMPARM(2)=$JUSTIFY(XMERRNUM,3)
- +4 SET XMPARM(3)=$$EZBLD^DIALOG(36300+XMERRNUM,.XMDPARM)
- +5 ;Msg=|1|, Err=|2| |3|
- WRITE !,$$EZBLD^DIALOG(36097,.XMPARM)
- +6 QUIT