cQUS ;Software updates ;cQUS; D RST() ; T0 ;Wijzigen software ; ; T0F ;Modification du logiciel; ; T0E ;Software Updates ; ; T0D ;Software Updates ; ; YZ Q ; ACT(R) ;Read from file R ; file-extention determines action ; .rsa = restore routine ; .gsa = restore globals ; .rka = kill routines ; .gka = kill globals ; .cdl & .xml = objects N A S R=$G(R) Q:'$L(R) S A=$ZCONVERT($P(R,".",$L(R,".")),"U") Q:'$L(A) I "\RSA\GSA\RKA\GKA\CDL\XML\"'[("\"_A_"\") Q I (A="CDL")!(A="XML") D Q . D $SYSTEM.OBJ.Load(R,"cf") I $E(A,2)="K" D Q . S ER=$$OR^cQFILE(R) I ER S QUIT=1 Q . U 0 W !,$S($E(A,1)="R":"Removing Routines",1:"Killing globals"),! . S ER=$$RF^cQFILE(R,.K) Q:ER I $L(K) U 0 W K,! . F S ER=$$RF^cQFILE(R,.K) Q:ER I $L(K) U 0 D .. I $E(A,1)="R" S:$E(K)="^" K=$E(K,2,$L(K)) X "ZR ZS @K" W:$X+$L(K)>79 ! W K,@$S($X>63:"!",1:"?$X\16+1*16") .. E S:$E(K)'="^" K="^"_K K @K W !,K . S ER=$$CF^cQFILE(R) . U 0 W ! I $E(A,2)="S" D Q . S %ABIE("FILE")=R,%ABIE("GLRO")=$E(A),%ABIE("PORT")="I",%ABIE("TO")="C" . D @(%ABIE("GLRO")_"I^cABIE") ACTZ Q ; AN(B) ;Restore in ALL namespaces, B = file S B=$G(B) Q:'$L(B) D NSPC^cQ21(.N) S I="" F S I=$O(N(I)) Q:I="" I $L(I) D . I "\%SYS\CACHELIB\DOCBOOK\SAMPLES\USER\"[("\"_I_"\") Q . I I'?.A1.N Q . W !,I ZN I D ACT(B) ANZ Q ; BLD(R,S) ;Build update from file R, If S=1 then from routine UPD N %ABIE,ER,I,J,K,QUIT,X,RSA,GSA,EGSA,RKA,GKA,CDL,XML,BEFORE,AFTER S S=$G(S,1),R=$$R($TR($G(R,"Update"),"/","\"),S) D RU(R) F I="RSA","GSA","EGSA","RKA","GKA","CDL","XML" D . S %ABIE("FILE")=$P(R,".",1,$L(R,".")-1)_$S(I="EGSA":"E",1:"")_"."_$S(I="EGSA":"GSA",1:I) . D DEL^cQFILE(%ABIE("FILE")) . I '$D(@I) Q . I "\RSA\GSA\EGSA\"[("\"_I_"\") D Q .. S J="" F S J=$O(@I@(J)) Q:J="" I $E(J)="^" S @I@($E(J,2,$L(J)))="" K @I@(J) .. S %ABIE("COM")=COM,%ABIE("SEL")=I .. I I="RSA" D RE^cABIE Q .. I I="GSA" D GE^cABIE Q .. I I="EGSA" D GEE^cABIE Q . I I="RKA" D Q .. S J="" F S J=$O(@I@(J)) Q:J="" I $E(J)="^" S @I@($E(J,2,$L(J)))="" K @I@(J) .. D MF(%ABIE("FILE"),I) . I I="GKA" D Q .. S J="" F S J=$O(@I@(J)) Q:J="" I $E(J)'="^" S @I@("^"_J)="" K @I@(J) .. D MF(%ABIE("FILE"),I) . I I="CDL"&'(($P($P($ZV,")",2),"(",1)[" 2008")!($P($P($ZV,")",2),"(",1)[" 2010")) D Q .. S (J,K)="" .. F S J=$O(@I@(J)) Q:J="" S K=K_$S($L(K):",",1:"")_$S($ZCONVERT($P(J,".",$L(J,".")),"U")="CLS":$P(J,".",1,$L(J,".")-1),1:J) .. D $System.OBJ.ExportCDL(K,%ABIE("FILE")) . I (I="XML")!(I="CDL"&(($P($P($ZV,")",2),"(",1)[" 2008")!($P($P($ZV,")",2),"(",1)[" 2010"))) D Q .. S (J,K)="" .. F S J=$O(@I@(J)) Q:J="" S K=K_$S($L(K):",",1:"")_$S($ZCONVERT($P(J,".",$L(J,".")),"U")'="CLS":J_".cls",1:J) .. D $System.OBJ.Export(K,%ABIE("FILE")) BLDZ Q ; MF(R,T) ; make kill files N ER,K,L S R=$G(R),T=$G(T) Q:'$L(R) Q:'$L(T) S (K,L)="",ER=$$OW^cQFILE(R) Q:ER S ER=$$WF^cQFILE(R,COM_$C(13,10)) Q:ER F S K=$O(@T@(K)) Q:K="" S ER=$$WF^cQFILE(R,K_$C(13,10)) Q:ER S ER=$$CF^cQFILE(R) MFZ Q ; RST(R,S) ;Restore update from file R, if S=1 then from UPD routine N AFTER,B,C,COM,ER,I,J,K,LOGFILE,X,QUIT,RSA,GSA,EGSA,RKA,GKA,CDL,XML,BEFORE,AFTER S $ZT="ERR^"_$T(+0),S=$G(S,1),R=$$R($TR($G(R,"Update"),"/","\"),S),Q("R")=R D QQM^cQ6 S R=Q("R") K Q("R") D RU(R) I $D(QUIT) R K:5 Q ;set record in logfile S LOGFILE=$$S() S I="BEFORE" I $D(@I) S J="" F S J=$O(@I@(J)) Q:J="" X @I@(J) S I="RSA" I $D(@I) D . ;Make backup of routines . S J="" F S J=$O(@I@(J)) Q:J="" I $E(J)="^" S @I@($E(J,2,$L(J)))="" K @I@(J) . S C=$P(R,"\",1,$L(R,"\")-1)_"\Backups\" . S B=C_$P($P(R,".",1,$L(R,".")-1),"\",$L(R,"\"))_"_bu_"_$ZCVT($ZU(110),"U")_"_"_$ZU(5)_".rsa" . S %ABIE("FILE")=B,%ABIE("COM")=COM,%ABIE("SEL")=I . S ER=$$TST^cQFILE(C) I ER S ER=$$CRED^cQFILE(C) . I 'ER D .. ;export routines that are going to be replaced .. S EXTDEF="INT" .. I $D(^cLOG($ZU(5),"cABIE","EXTDEF")) S K=^cLOG($ZU(5),"cABIE","EXTDEF") .. I '$L(K),$D(^cLOG($ZCVT($ZU(110),"U"),"cABIE","EXTDEF")) S K=^cLOG($ZCVT($ZU(110),"U"),"cABIE","EXTDEF") .. I (K="INT")!(K="MAC") S EXTDEF=K .. I EXTDEF="MAC" D ... S J="" F S J=$O(@I@(J)) Q:J="" S K=@I@(J) D .... I $L(K,".")=1 S @I@(J)=K_".MAC" Q .... I $P(K,".",$L(K,"."))="*" Q .... I $P(K,".",$L(K,"."))="INT" S @I@(J)=$P(K,".",1,$L(K,".")-1)_".MAC" Q .... I $P(K,".",$L(K,"."))="" S @I@(J)=K_"MAC" Q .... I $P(K,".",$L(K,"."))'="MAC" S @I@(J)=K_".MAC" Q .. D RE^cABIE .. ;rename update-bu.rsa to update-bu_JJJJMMDD_x.rsa .. S K=$$FSEQ^cQFILE(B),K=$$REN^cQFILE(B,K) . ; Process .RSA separate to catch the possible ^cQUS error . D ACT($P(R,".",1,$L(R,".")-1)_".RSA") RSTE F I="GSA","EGSA","RKA","GKA","CDL","XML" I $D(@I) D ACT($P(R,".",1,$L(R,".")-1)_$S(I="EGSA":"E",1:"")_"."_$S(I="EGSA":"GSA",1:I)) S I="AFTER" I $D(@I) S J="" F S J=$O(@I@(J)) Q:J="" X "N "_@I@(J) ;update-file successfully processed S $P(@LOGFILE,"~",1)=1 RSTZ Q ; R(R,S) ;Construct R N DIR S R=$G(R),S=+$G(S),DIR="" Q:'$L(R) I $ZCONVERT($P(R,".",$L(R,".")),"L")'="upd" S R=R_".upd" S DIR=$$UDIR(S) I R'["\" S R=DIR_R RZ Q R ; UDIR(R) ;Return Update-Directory N X S X="" I $G(R),'$L(X),$D(^cLOG($ZU(5),"cABIE","UPD","DIR")) S X=^cLOG($ZU(5),"cABIE","UPD","DIR") I $G(R),'$L(X),$D(^cLOG($ZCVT($ZU(110),"U"),"cABIE","UPD","DIR")) S X=^cLOG($ZCVT($ZU(110),"U"),"cABIE","UPD","DIR") I '$L(X),$D(^cLOG($ZU(5),"cABIE","DIR")) S X=^cLOG($ZU(5),"cABIE","DIR") I '$L(X),$D(^cLOG($ZCVT($ZU(110),"U"),"cABIE","DIR")) S X=^cLOG($ZCVT($ZU(110),"U"),"cABIE","DIR") S X=$TR(X,"/","\") I $L(X),$E(X,$L(X))'="\" S X=X_"\" UDIRZ Q X ; RU(R) ;Read update file R S R=$G(R) Q:'$L(R) I $ZCONVERT($P(R,".",$L(R,".")),"L")'="upd" S R=R_".upd" S ER=$$TST^cQFILE(R) I ER S QUIT=1 U 0 W !,"Update file ",R," not found." Q S ER=$$OR^cQFILE(R) I ER S QUIT=2 U 0 W !,"Cannot open update file ",R Q U 0 W !,"Reading update file ",R S K=$P(R,"\",$L(R,"\")),COM=$P(K,".",1,$L(K,".")-1) F I=1:1 S ER=$$RF^cQFILE(R,.K) Q:ER I $L(K) D . I I=1 S:$L(K) COM=K Q . I $E(K)=";" Q ;ignore commentlines . I $E(K)="#" S X=$E(K,2,$L(K)) . E I $D(X) D .. I (X="AFTER")!(X="BEFORE")!(X="RSA") S @X@($O(@X@(""),-1)+1)=K .. E S @X@(K)="" S ER=$$CF^cQFILE W !,"Processing update file ",R,!!,"Header: ",COM,! RUZ Q ; S() ;Add entry to logbook N I,%TIM,%TN,%TS D ^cA106 S %TN=$P($H,",",2) D 300^%TO S I=$P($H,",",2)#3600#60,%TIM=$E(%TS,1,2)_":"_$E(%TS,3,4) S ^cLOG($ZU(5),"UPDATE",+$H,+$P($H,",",2))="0~"_DT_"~"_TD_"~"_$G(COM),X=$ZR D CLEAN^cQ13("^cLOG("""_$ZU(5)_""",""UPDATE"")",40) SZ Q X ; ERR I $ZE["^cQUS" S $ZT="ERRZ^"_$T(+0) G RSTE I $D(LOGFILE) S $P(@LOGFILE,"~",5)=$ZE ERRZ ZQ ; ZZ ; 17.01.2012 - 15:58 * Cache-r6.4.9