cQVGCON ;Controle gelijkheid globals ;cQVGCON; Q ; ; IMPORTANT NOTICE ; ; The security for the c:\temp directory on the 'slave' ; should be set to 'Full Access' for the Caché User !! ; ST2(S) ;Compare, 2 (s&c) ;Clean up Global Compare & send alert S S=$G(S) Q:'$L(S) S D="\",QT=$G(QT),Q=$G(Q,"SYS"),Q1=$G(Q1) S LOG="^|home|ZZLOG(""CHECK"",""G"",S)",%LOG="^cLOG("""_$ZU(5)_""",""CHECK"",""G"")" I '$D(@%LOG) G YZ S home=$G(@%LOG@(S,"HOME")),G=$G(@%LOG@(S,"GLOBALS"),"*") S DB=$G(@%LOG@(S,"DATABASE")) I $L(DB) D . S S1=$P(DB,"\",1) . F I=1:1 S DBS=$P(DB,"\",I) Q:'$L(DBS) I ($P(DBS,"^",2)=$ZCVT($ZU(110),"U"))!($P(DBS,"^",2)=$S($ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")):$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER","ALIAS"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER","ALIAS")),1:""),$ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE")),1:$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U"))):$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE","ALIAS"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE","ALIAS")),1:""),1:"")) S S2=DBS Q I '$L($G(S1))!'$L($G(S2)) Q D CALC(S1),CALC(S2),CLEAN K UCS ; remove directory, if error remove all files in directory S FILE=$$FILE(0,S),E=$$DELD^cQFILE(FILE) I E D DFID^cQFILE(FILE) ; create directory S E=$$CRED^cQFILE(FILE) ; write file checksum.txt S FILE=$$FILE(1,S),E=$$OW^cQFILE(FILE) I E G YZ S (K,L)=$NA(@LOG),TAB=$C(9) K A,R F S K=$Q(@K) Q:K="" Q:$NA(@K,$QL(L))'=L D Q:E . S R($O(R(""),-1)+1)=$QS(K,5)_TAB_$QS(K,4)_TAB_"= "_@K . S E=$$WF^cQFILE(FILE,R($O(R(""),-1))_$C(13,10)) . I $QS(K,4)'=0 S A($QS(K,5),$QS(K,4))=1 S E=$$CF^cQFILE(FILE) ; write file compare.txt S (K,L)="",FILE=$$FILE(2,S),E=$$OW^cQFILE(FILE) I E G YZ F S K=$O(A(K)) Q:K="" F S L=$O(A(K,L)) Q:L="" S E=$$WF^cQFILE(FILE,K_TAB_L_$C(13,10)) Q:E S E=$$CF^cQFILE(FILE),CH=0 I $D(R(1)) D K R . S VAR("B1")="" S:'$D(R(2)) R(2)="" . I $P(R(1),TAB,2)=0,$P(R(2),TAB,2)=0 D .. I $P($P(R(1),TAB,3),D,3)'=$P($P(R(2),TAB,3),D,3) S CH=1,VAR("B1")="Checksums are from different dates",R(.1)="",R(.2)=VAR("B1")_": NO further checking will be done!" Q .. I $P($P($P(R(1),TAB,3),"= ",2),D,1)'=$P($P($P(R(2),TAB,3),"= ",2),D,1) S CH=2,VAR("B1")="Total Checksums" .. I $P($P(R(1),TAB,3),D,2)'=$P($P(R(2),TAB,3),D,2) S CH=2,VAR("B1")=$G(VAR("B1"))_$S($L($G(VAR("B1"))):" & ",1:"")_"Number of globals" .. I CH=2 S VAR("B1")=VAR("B1")_" don't match!",R(.1)="",R(.2)=VAR("B1") . I ($P(R(1),TAB,2)'=0)!($P(R(2),TAB,2)'=0) S CH=1,VAR("B1")="Checksum calculation did not finish on one or both systems",R(.1)="",R(.2)=VAR("B1")_": NO further checking will be done!" . I CH=1 S R(3)=" ...",R(4)="Irrelevant data has been removed." D .. K K S J="",K=$G(R) F S J=$O(R(J)) Q:(J="")!(J>4) S K(J)=R(J) .. K R M R=K K K . I 'CH,$O(A(S1,""))="",$O(A(S2,""))="" S R(.3)="",VAR("B1")="No differences !",R(.4)=VAR("B1") . D SAL ST2Z Q ; ST22(T) ;Check globals I +$G(CH)=1 Q I '$L($G(S1))!'$L($G(S2)) Q S T=$G(T,0),L="" K SWV F S L=$O(A(S1,L)) Q:L="" D . F H=1,2 D C($S(H=1:S1,1:S2),$S(H=1:S2,1:S1),L,$S(+T:$S(H=1:2,1:1),1:0)) I $D(R) D .. S R(.3)="",VAR("B1")=L_" in namespaces "_$S(H=1:S1,1:S2)_" & "_$S(H=1:S2,1:S1),R(.4)="Compare of "_VAR("B1") .. I 'T S R(.5)="",R(.6)="Report only !!" .. D SAL K R K R F I=1:1 S L=$O(A(S1,L)) Q:L="" S R(I)=L,R=I I $D(R) S VAR("B1")="Compare finished"_$S($G(SWV):"",1:", No differences."),R(.1)="",R(.2)=VAR("B1") D SAL ST22Z Q ; C(X,Y,G,O) ;compare global G between X & Y, correct if O > 0 ; O = 1 -> X is the reference, if non-existant or different on Y set @G2=@G1 ; O = 2 -> Y is the reference, if non-existant on Y kill on X, if different on X set @G1=@G2 N G1,G2 K R S MAXR=500,$ZT="ERRC" S X=$G(X),Y=$G(Y),G=$G(G),O=+$G(O) I '$L(X)!'$L(Y)!'$L(G) Q S G1="^["""_X_"""]"_$S($E(G)="^":$E(G,2,$L(G)),1:G),GX=G1 F S G1=$Q(@G1) Q:G1="" Q:$NA(@G1,$QL(GX))'=GX D I $O(R(""),-1)>MAXR,'$D(R(.2)) S R(.1)="",R(.2)=" !!! partial listing !!! " . S G2="^["""_Y_"""]"_$P(G1,"]",2,$L(G1,"]")) . I '$D(@G2) D Q .. I $O(R(""),-1)" D Q . S R($O(R(""),-1)+1)=$G(G1),R($O(R(""),-1)+1)=$G(G2),R($O(R(""),-1)+1)="" . S R($O(R(""),-1)+1)="One of them generated "_$ZE,R($O(R(""),-1)+1)="" . S R($O(R(""),-1)+1)="Please correct this global manually!",R($O(R(""),-1)+1)="" . S R(.1)="",VAR("B1")=$G(L)_" in namespaces "_$S($G(H)=1:$G(S1),1:$G(S2))_" & "_$S($G(H)=1:$G(S2),1:$G(S1)),R(.2)="Compare of "_VAR("B1") . I 'T S R(.5)="",R(.6)="Report only !!" . D SAL S R($O(R(""),-1)+1)=$G(G1),R($O(R(""),-1)+1)=$G(G2),R($O(R(""),-1)+1)=$ZE,R($O(R(""),-1)+1)="" ERRCZ Q ; ST222(S,T) ;Compare, 2 (s&c) ;Clean up Global Compare & send alert & repair if T >0 S S=$G(S) Q:'$L(S) S T=$G(T,0) D ST2(S) H 15 ; wait some time to let changes come back to us D ST22(T) ST222Z Q ; ST3(S) ;Compare, 3 (m&s&c) ;Send alert & save mismatched globals S S=$G(S) Q:'$L(S) S D="\",QT=$G(QT),Q=$G(Q,"SYS"),Q1=$G(Q1) ; read file checksum.txt and count lines S EXP=1,L=0,FILE=$$FILE(1,S) K R I $$TST^cQFILE(FILE) S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" does not exist!" G ST3Y S E=$$FMD^cQFILE(FILE,.K) Q:E S K=+K I K<($H-1) S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" dates from "_$$HD^cAFD1(K),L=L+1,R(L)="Compare has not run!" G ST3Y S E=$$OR^cQFILE(FILE) Q:E F S E=$$RF^cQFILE(FILE,.K) Q:E S L=L+1,R(L)=K S E=$$CF^cQFILE(FILE) I $P(R(1),D,3)'=$P(R(2),D,3) S EXP=0,R(0)="Checksums are from different dates: NO globals will be exported !" ; delete compare.bat I $ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE")),1:$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U"))) S FILE=$$FILE(3,S),E=$$DELD^cQFILE(FILE) I L D . ; read file compare.txt . S FILE=$$FILE(2,S),L=0 K ^TEMP($ZCVT($ZU(110),"U"),$J) I '$$TST^cQFILE(FILE) D S E=$$CF^cQFILE(FILE) .. S E=$$OR^cQFILE(FILE) Q:E F S E=$$RF^cQFILE(FILE,.K) Q:E S L=L+1,^TEMP($ZCVT($ZU(110),"U"),$J,L)=K . I L,EXP K R,RR D .. ; export globals into globalname.system.namespace .. ; with system being 1 = Master, 2 = Shadow .. F I=1:1:L S K=^TEMP($ZCVT($ZU(110),"U"),$J,I),NSPC=$P(K,$C(9)),G=$P(K,$C(9),2) I $L(G) D ... D EXP(G,NSPC) I 'E S R(I)=K_" exported to "_FILE ... I $ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) D .... S E=$$JW^cQFILE("copy "_FILE_" "_FILEZ_"> "_$$INFO^cQ14) .... I 'E S R(I)=R(I)_" and copied to "_FILEZ,E=$$DEL^cQFILE(FILE) ... I $ZCVT($ZU(110),"U")='$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) S K=$P(FILE,"\",$L(FILE,"\")),J=K,$P(K,".",2)=1,RR(I)="FC "_K_" "_J_" >>result.txt" .. ; create file compare.bat .. I $ZCVT($ZU(110),"U")='$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) S FILE=$$FILE(3,S),E=$$OW^cQFILE(FILE) Q:E D S E=$$CF^cQFILE(FILE),VAR("B1")="" D SAL ... S E=$$WF^cQFILE(FILE,"@echo off"_$C(13,10)_"C:"_$C(13,10)) Q:E ... S E=$$WF^cQFILE(FILE,"cd \"_$P(FILE,"\",5,6)_$C(13,10)) Q:E ... S E=$$WF^cQFILE(FILE,"del "_$P($$FILE(4,S),"\",$L($$FILE(4,S),"\"))_$C(13,10)) Q:E ... S I="" F S I=$O(RR(I)) Q:I="" S E=$$WF^cQFILE(FILE,RR(I)_$C(13,10)) Q:E ST3Y I L,EXP,$ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) S VAR("B1")="" D SAL ST3Z Q ; ST4 ;Compare, 4 (s) ;Start File Compare at OS level I $ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE")),1:$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U"))) S FILE=$$FILE(3,S) I '$$TST^cQFILE(FILE) S K="C:\"_$P(FILE,"\",5,$L(FILE,"\")),E=$$JNW^cQFILE(K) Q ; ST5(S) ;Compare, 5 (m) ;Alert if File Compare < 512 KB D INI^cQ6 I $ZCVT($ZU(110),"U")'=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) Q S L=0,FILE=$$FILE(2,S) K R S E=$$FS^cQFILE(FILE,.K) I E S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" does not exist!" G ST5Y S K=+K I 'K S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" is empty.",L=L+1,R(L)="No differences found!" G ST5Y S E=$$FMD^cQFILE(FILE,.K) Q:E S K=+K I K<($H-1) S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" dates from "_$$HD^cAFD1(K),L=L+1,R(L)="Compare has not run!" G ST5Y S FILE=$$FILE(4,S),E=$$FMD^cQFILE(FILE,.K) I E S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" does not exist!" G ST5Y S K=+K I K<($H-1) S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" dates from "_$$HD^cAFD1(K),L=L+1,R(L)="Global Compare Failed!" G ST5Y S E=$$FS^cQFILE(FILE,.K) Q:E I K>(512*1024) S L=L+1,R(L)="Global Compare File "_$TR(FILE,"\","/")_" is too big.",L=L+1,R(L)=$FN(K,".")_" bytes" G ST5Y I '$$TST^cQFILE(FILE) D S E=$$CF^cQFILE(FILE) . S E=$$OR^cQFILE(FILE) Q:E F S E=$$RF^cQFILE(FILE,.K) Q:E S L=L+1,R(L)=K ST5Y I L S VAR("B1")="" D SAL ST5Z Q ; YZ Q ; EXP(G,NSPC) ; Export global G N K S E=0,G=$G(G) I '$L(G) Q "1, No global defined" S NSPC=$G(NSPC,$ZU(5)) I '$ZU(90,10,NSPC) Q "2, Namespace undefined" S FILE=$$FILE($S($E(G)="^":$E(G,2,$L(G)),1:G),S)_"."_NSPC I $ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")) S FILEZ=FILE,FILE="c:\temp\"_$P(FILEZ,"\",$L(FILEZ,"\")),E=$$DEL^cQFILE(FILE) S E=$$OW^cQFILE(FILE) I E S E=E_", Cannot open "_FILE_" to export "_G Q E S %NSPC=$ZU(5) ZN NSPC F S G=$Q(@G) Q:G="" S E=$$WF^cQFILE(FILE,G_$C(13,10)_@G_$C(13,10)) Q:E ZN %NSPC I E S E=E_", Error during export of "_G_" to "_FILE S K=$$CF^cQFILE(FILE) EXPZ Q E ; FILE(X,S) ;File-name type X for Schema S N K S X=$G(X),S=$G(S) I '$L(S) G FILEZ S K="\\"_$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE")),1:$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U"))) S K=K_"\C$\temp\compare\"_S_"\" I X=0 Q K I X=1 Q K_"checksum.txt" I X=2 Q K_"compare.txt" I X=3 Q K_"compare.bat" I X=4 Q K_"result.txt" I X'?.N Q K_X_"."_$S($ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U")):1,$ZCVT($ZU(110),"U")=$S($L($G(^cLOG($ZU(5),"SYSTEM","SLAVE"))):$G(^cLOG($ZU(5),"SYSTEM","SLAVE")),1:$S($L($G(^cLOG($ZU(5),"SYSTEM","MASTER"))):$G(^cLOG($ZU(5),"SYSTEM","MASTER")),1:$ZCVT($ZU(110),"U"))):2,1:0) FILEZ Q K_"watte.txt" ; CALC(X) N N,T,%G S (%G,N,T)=0 Q:'$L(X) Q:'($D(@LOG@(0,X))#2) Q:$P(@LOG@(0,X),"\",7) F S %G=$O(@LOG@(%G)) Q:%G="" I $D(@LOG@(%G,X)) S N=N+1,T=T+@LOG@(%G,X) S $P(@LOG@(0,X),"\",1)=T,$P(@LOG@(0,X),"\",2)=N,$P(@LOG@(0,X),"\",7)=1 CALCZ Q ; CLEAN N A,I,N,%G S %G=0 F S %G=$O(@LOG@(%G)) Q:%G="" K A S N="",A=0,SW=1 D . F S N=$O(@LOG@(%G,N)) Q:N="" S A=A+1,A(A)=$P(@LOG@(%G,N),D,1,2) . I A=1 S SW=0 . E F I=2:1:A I $G(A(I))'=A(1) S SW=0 . I SW K @LOG@(%G) CLEANZ Q ; SAL ; Send Alert S R(0)="Scheme "_S,R(.9)="",VAR("B1")=S_" "_VAR("B1") N A,H,I,K,L S I="" F S I=$O(R(I)) Q:I="" S R(I)=$TR(R(I),D,"/") S PG=$T(+0),PN=$P($T(+1),";",2) D D1015^cANEM0(PG,PN,.R) SALZ Q ; ZZ ; 17.01.2012 - 15:58 * Cache-r6.4.9