XDRMERG1 ;SF-IRMFO.SEA/JLI - TENATIVE UPDATE POINTER NODES ;06/02/2005 09:01
;;7.3;TOOLKIT;**23,34,38,44,47,95**;Apr 25, 1995
;;
;;
CHASE(XVAL,RVAL,XDRIENS) ;
N XDRYT,XDRYTT,NODE,X,PC,Y,XDRTO,XDRIEN,XV,XN,XXV,XTYPE,X
N DA,XV,XXV,XDRFILE,OLDH
S OLDH=$P($H,",",2)
F DA=SENTRY:0 Q:$D(ZTSTOP) S DA=$O(@(XVAL_DA_")")) Q:DA'>0 D
. I (($P($H,",",2)-OLDH>XDRTIME)!($P($H,",",2)<OLDH)) S OLDH=$P($H,",",2) I $$S^%ZTLOAD S ZTSTOP=1 D Q
. . I '$D(XDRFDA) Q
. . I $P(^VA(15.2,XDRFDA,0),U,9)="" S $P(^(0),U,9)=1
. I $D(XDRFDA),$P(^VA(15.2,XDRFDA,0),U,9)=1 S ZTSTOP=1 Q
. I XDRIENS="" D
. . S XDRYT=$$NOW^XLFDT()
. . I $$FMDIFF^XLFDT(XDRYT,XDRXT,2)>5 D ;60 D
. . . I $D(XDRFDA) D I 1
. . . . S ^VA(15.2,XDRFDA,3,XDRFDA1,1)=XDRYT_U_CURRTYPE_U_CURRFIL_U_DA
. . . E D
. . . . S ^XTMP("XDRSTAT",XDRGID,"TIME",$J)=XDRYT_U_CURRTYPE_U_CURRFIL_U_DA
. . . S XDRXT=XDRYT
. I $D(^TMP($J,"XGLOB",RVAL)) D
. . S NODE="" F S NODE=$O(^TMP($J,"XGLOB",RVAL,NODE)) Q:NODE="" D
. . . S X=$G(@(XVAL_DA_","_NODE_")")) Q:X=""
. . . F PC=0:0 S PC=$O(^TMP($J,"XGLOB",RVAL,NODE,PC)) Q:PC'>0 D
. . . . S Y=$P(X,U,PC),XDRFR=Y
. . . . I Y>0,$D(XDRXFLG),$D(@FROM@(+Y))=1 S @FROM@(+Y,"R",CURRFIL)=$G(@FROM@(+Y,"R",CURRFIL))+1 Q ; USED TO DETERMINE WHICH ENTRIES AREN'T POINTED TO.
. . . . I Y>0 S XDRTO=$O(@FROM@(+Y,"")) I XDRTO>0 D
. . . . . I +Y'=Y D Q:Y'>0
. . . . . . I $P(Y,";",2)'=$E(XDRFGLOB,2,99) S Y=0 Q
. . . . . . S XDRTO=XDRTO_";"_$E(XDRFGLOB,2,99)
. . . . . I $P(^TMP($J,"XGLOB",RVAL,NODE,PC),U,3)="DINUM" D Q
. . . . . . D DINUM^XDRMERG2(XVAL,RVAL,XDRIENS)
. . . . . I ^TMP($J,"XGLOB",RVAL,NODE,PC)>0 D Q
. . . . . . S XDRIEN=DA_","_XDRIENS
. . . . . . N DA,XDRFILE,XDRFLD,XDR
. . . . . . S XDRFILE=+^TMP($J,"XGLOB",RVAL,NODE,PC)
. . . . . . S XDRFLD=+$P(^TMP($J,"XGLOB",RVAL,NODE,PC),U,2)
. . . . . . S XDR(XDRFILE,XDRIEN,XDRFLD)=XDRTO
. . . . . . ; S ^XDRM(+XDRFR,"P",XDRFILE,XDRIEN,XDRFLD)=XDRFR ; ORIGINAL VERSION SIMPLY STORE DATA ON POINTER CHANGE
. . . . . . D SAVEPNTR^XDRMERGB(+XDRFR,+XDRTO,XDRFILE,XDRIEN,XDRFLD,XDRFR) ; REVISED TO STORE POINTER CHANGE IN FM COMPATIBLE STRUCTURE
. . . . . . D FILE^DIE("","XDR")
. . . . . S $P(@(XVAL_DA_","_NODE_")"),U,PC)=XDRTO
. . . . . S XDRFILE=+$P(@(XVAL_"0)"),U,2)
. . . . . S XDRFLD=$O(@("^DD("_XDRFILE_",""GL"","_NODE_","_PC_",0)"))
. . . . . S XDRIEN=DA_","_XDRIENS
. . . . . ; S ^XDRM(+XDRFR,"P",XDRFILE,XDRIEN,XDRFLD)=XDRFR ; ORIGINAL VERSION SIMPLY STORE DATA ON POINTER CHANGE
. . . . . D SAVEPNTR^XDRMERGB(+XDRFR,+XDRTO,XDRFILE,XDRIEN,XDRFLD,XDRFR)
. S XV=RVAL
. F S XV=$O(^TMP($J,"XGLO",XV)) Q:XV'[RVAL D
. . S XN=$P(XV,RVAL,2),XN=DA_","_$P(XN,"DA,",2)
. . S XXV=XVAL_XN
. . S XTYPE=$$TYPE(XV)
. . I XTYPE="DINUM" D DINUM^XDRMERG2(XXV,XV,DA_","_XDRIENS) Q
. . I XTYPE'="" D XREFS^XDRMERG2(XXV,XV,DA_","_XDRIENS) Q
. . D CHASE(XXV,XV,DA_","_XDRIENS)
S SENTRY=0
Q
;
TYPE(GLOB) ;
N I,J
S I=$O(^TMP($J,"XGLOB",GLOB,"")) Q:I="" ""
S J=$O(^TMP($J,"XGLOB",GLOB,I,"")) Q:J="" ""
Q $P(^TMP($J,"XGLOB",GLOB,I,J),U,3)
;
XREFS ; CONTINUATION FROM XDRMERG2 DUE TO SPACE LIMITS
N IENOLD,IENNEW,IENVAL,FILEI,FLDJ,XREF,XDRXX,VREF,NMAX,GLOBPCS
N NODE,PIECE
N XDRZZ,XDRAA ; DEBUG STATEMENT
S XDRXX=$NA(^TMP($J,"XDRXX"))
K @XDRXX
S NMAX=$L(XR,"DA,") F J=1:1:NMAX S GLOBPCS(J)=$P(XR,"DA,",J)
S NODE="" F S NODE=$O(^TMP($J,"XGLOB",XR,NODE)) Q:NODE="" F PIECE=0:0 S PIECE=$O(^TMP($J,"XGLOB",XR,NODE,PIECE)) Q:PIECE'>0 S FILEI=^(PIECE) D
. S FLDJ=$P(FILEI,U,2),XREF=$P(FILEI,U,3),FILEI=+FILEI,VREF="" I $P(^DD(FILEI,FLDJ,0),U,2)["V" S VREF=";"_$E(XDRFGLOB,2,99)
. I XREF="DINUM" Q
. F IENOLD=0:0 S IENOLD=$O(@FROM@(IENOLD)) Q:IENOLD'>0 D
. . N KVALUE,YGLOB,NCNT,DAIENS,ZGLOB
. . S IENNEW=$O(@FROM@(IENOLD,"")) Q:IENNEW'>0&'$D(XDRXFLG)
. . S KVALUE=$S(VREF'="":IENOLD_VREF,1:IENOLD),ZGLOB=GLOBPCS(1)_XREF_","_""""_KVALUE_""""_")" I $D(@ZGLOB) S DAIENS="",YGLOB=GLOBPCS(1),NCNT=0 D FINDXREF(NMAX,XDRXX,ZGLOB,NCNT,DAIENS,YGLOB)
. . Q
. Q
K XDRAA,XDRZZ I $D(XDRTESTK) M XDRAA=@XDRXX ; DEBUG STATEMENT
I $D(@XDRXX) D FILE^DIE("",XDRXX)
I $D(XDRZZ),$D(XDRTESTK) S XDRTESTK=XDRTESTK+1 M ^XTMP("XDRTESTK",$$NOW^XLFDT(),XDRTESTK,"XX")=XDRAA,^("ZZ")=XDRZZ K XDRAA,XDRZZ ; DEBUG STATEMENT
Q
;
FINDXREF(NMAX,XDRXX,ZGLOB,NCNT,DAIENS,YGLOB) ;
N LVAL,NVAL
S NVAL=NCNT+1
I NVAL=NMAX D Q
. F LVAL=0:0 S LVAL=$O(@ZGLOB@(LVAL)) Q:LVAL'>0!(LVAL'=+LVAL) D SETXREF((YGLOB_LVAL_","),(LVAL_","_DAIENS))
. Q
F LVAL=0:0 S LVAL=$O(@ZGLOB@(LVAL)) Q:LVAL'>0!(LVAL'=+LVAL) D FINDXREF(NMAX,XDRXX,$NA(@ZGLOB@(LVAL)),NVAL,(LVAL_","_DAIENS),(YGLOB_LVAL_","_GLOBPCS(NVAL+1)))
Q
;
SETXREF(YGLOB,DAIENS) ;
I $E($P($G(@(YGLOB_NODE_")")),U,PIECE),1,30)'=KVALUE Q
I $D(XDRXFLG) S @FROM@(IENOLD,"R",FILEI)=$G(@FROM@(IENOLD,"R",FILEI))+1 Q ; POINTER WAS FOUND, MARK ENTRY FOR FILE
S @XDRXX@(FILEI,DAIENS,FLDJ)=IENNEW_VREF
D SAVEPNTR^XDRMERGB(+IENOLD,+IENNEW,FILEI,DAIENS,FLDJ,(IENOLD_VREF))
Q
XDRMERG1 ;SF-IRMFO.SEA/JLI - TENATIVE UPDATE POINTER NODES ;06/02/2005 09:01
+1 ;;7.3;TOOLKIT;**23,34,38,44,47,95**;Apr 25, 1995
+2 ;;
+3 ;;
CHASE(XVAL,RVAL,XDRIENS) ;
+1 NEW XDRYT,XDRYTT,NODE,X,PC,Y,XDRTO,XDRIEN,XV,XN,XXV,XTYPE,X
+2 NEW DA,XV,XXV,XDRFILE,OLDH
+3 SET OLDH=$PIECE($HOROLOG,",",2)
+4 FOR DA=SENTRY:0
IF $DATA(ZTSTOP)
QUIT
SET DA=$ORDER(@(XVAL_DA_")"))
IF DA'>0
QUIT
Begin DoDot:1
+5 IF (($PIECE($HOROLOG,",",2)-OLDH>XDRTIME)!($PIECE($HOROLOG,",",2)<OLDH))
SET OLDH=$PIECE($HOROLOG,",",2)
IF $$S^%ZTLOAD
SET ZTSTOP=1
Begin DoDot:2
+6 IF '$DATA(XDRFDA)
QUIT
+7 IF $PIECE(^VA(15.2,XDRFDA,0),U,9)=""
SET $PIECE(^(0),U,9)=1
End DoDot:2
QUIT
+8 IF $DATA(XDRFDA)
IF $PIECE(^VA(15.2,XDRFDA,0),U,9)=1
SET ZTSTOP=1
QUIT
+9 IF XDRIENS=""
Begin DoDot:2
+10 SET XDRYT=$$NOW^XLFDT()
+11 ;60 D
IF $$FMDIFF^XLFDT(XDRYT,XDRXT,2)>5
Begin DoDot:3
+12 IF $DATA(XDRFDA)
Begin DoDot:4
+13 SET ^VA(15.2,XDRFDA,3,XDRFDA1,1)=XDRYT_U_CURRTYPE_U_CURRFIL_U_DA
End DoDot:4
IF 1
+14 IF '$TEST
Begin DoDot:4
+15 SET ^XTMP("XDRSTAT",XDRGID,"TIME",$JOB)=XDRYT_U_CURRTYPE_U_CURRFIL_U_DA
End DoDot:4
+16 SET XDRXT=XDRYT
End DoDot:3
End DoDot:2
+17 IF $DATA(^TMP($JOB,"XGLOB",RVAL))
Begin DoDot:2
+18 SET NODE=""
FOR
SET NODE=$ORDER(^TMP($JOB,"XGLOB",RVAL,NODE))
IF NODE=""
QUIT
Begin DoDot:3
+19 SET X=$GET(@(XVAL_DA_","_NODE_")"))
IF X=""
QUIT
+20 FOR PC=0:0
SET PC=$ORDER(^TMP($JOB,"XGLOB",RVAL,NODE,PC))
IF PC'>0
QUIT
Begin DoDot:4
+21 SET Y=$PIECE(X,U,PC)
SET XDRFR=Y
+22 ; USED TO DETERMINE WHICH ENTRIES AREN'T POINTED TO.
IF Y>0
IF $DATA(XDRXFLG)
IF $DATA(@FROM@(+Y))=1
SET @FROM@(+Y,"R",CURRFIL)=$GET(@FROM@(+Y,"R",CURRFIL))+1
QUIT
+23 IF Y>0
SET XDRTO=$ORDER(@FROM@(+Y,""))
IF XDRTO>0
Begin DoDot:5
+24 IF +Y'=Y
Begin DoDot:6
+25 IF $PIECE(Y,";",2)'=$EXTRACT(XDRFGLOB,2,99)
SET Y=0
QUIT
+26 SET XDRTO=XDRTO_";"_$EXTRACT(XDRFGLOB,2,99)
End DoDot:6
IF Y'>0
QUIT
+27 IF $PIECE(^TMP($JOB,"XGLOB",RVAL,NODE,PC),U,3)="DINUM"
Begin DoDot:6
+28 DO DINUM^XDRMERG2(XVAL,RVAL,XDRIENS)
End DoDot:6
QUIT
+29 IF ^TMP($JOB,"XGLOB",RVAL,NODE,PC)>0
Begin DoDot:6
+30 SET XDRIEN=DA_","_XDRIENS
+31 NEW DA,XDRFILE,XDRFLD,XDR
+32 SET XDRFILE=+^TMP($JOB,"XGLOB",RVAL,NODE,PC)
+33 SET XDRFLD=+$PIECE(^TMP($JOB,"XGLOB",RVAL,NODE,PC),U,2)
+34 SET XDR(XDRFILE,XDRIEN,XDRFLD)=XDRTO
+35 ; S ^XDRM(+XDRFR,"P",XDRFILE,XDRIEN,XDRFLD)=XDRFR ; ORIGINAL VERSION SIMPLY STORE DATA ON POINTER CHANGE
+36 ; REVISED TO STORE POINTER CHANGE IN FM COMPATIBLE STRUCTURE
DO SAVEPNTR^XDRMERGB(+XDRFR,+XDRTO,XDRFILE,XDRIEN,XDRFLD,XDRFR)
+37 DO FILE^DIE("","XDR")
End DoDot:6
QUIT
+38 SET $PIECE(@(XVAL_DA_","_NODE_")"),U,PC)=XDRTO
+39 SET XDRFILE=+$PIECE(@(XVAL_"0)"),U,2)
+40 SET XDRFLD=$ORDER(@("^DD("_XDRFILE_",""GL"","_NODE_","_PC_",0)"))
+41 SET XDRIEN=DA_","_XDRIENS
+42 ; S ^XDRM(+XDRFR,"P",XDRFILE,XDRIEN,XDRFLD)=XDRFR ; ORIGINAL VERSION SIMPLY STORE DATA ON POINTER CHANGE
+43 DO SAVEPNTR^XDRMERGB(+XDRFR,+XDRTO,XDRFILE,XDRIEN,XDRFLD,XDRFR)
End DoDot:5
End DoDot:4
End DoDot:3
End DoDot:2
+44 SET XV=RVAL
+45 FOR
SET XV=$ORDER(^TMP($JOB,"XGLO",XV))
IF XV'[RVAL
QUIT
Begin DoDot:2
+46 SET XN=$PIECE(XV,RVAL,2)
SET XN=DA_","_$PIECE(XN,"DA,",2)
+47 SET XXV=XVAL_XN
+48 SET XTYPE=$$TYPE(XV)
+49 IF XTYPE="DINUM"
DO DINUM^XDRMERG2(XXV,XV,DA_","_XDRIENS)
QUIT
+50 IF XTYPE'=""
DO XREFS^XDRMERG2(XXV,XV,DA_","_XDRIENS)
QUIT
+51 DO CHASE(XXV,XV,DA_","_XDRIENS)
End DoDot:2
End DoDot:1
+52 SET SENTRY=0
+53 QUIT
+54 ;
TYPE(GLOB) ;
+1 NEW I,J
+2 SET I=$ORDER(^TMP($JOB,"XGLOB",GLOB,""))
IF I=""
QUIT ""
+3 SET J=$ORDER(^TMP($JOB,"XGLOB",GLOB,I,""))
IF J=""
QUIT ""
+4 QUIT $PIECE(^TMP($JOB,"XGLOB",GLOB,I,J),U,3)
+5 ;
XREFS ; CONTINUATION FROM XDRMERG2 DUE TO SPACE LIMITS
+1 NEW IENOLD,IENNEW,IENVAL,FILEI,FLDJ,XREF,XDRXX,VREF,NMAX,GLOBPCS
+2 NEW NODE,PIECE
+3 ; DEBUG STATEMENT
NEW XDRZZ,XDRAA
+4 SET XDRXX=$NAME(^TMP($JOB,"XDRXX"))
+5 KILL @XDRXX
+6 SET NMAX=$LENGTH(XR,"DA,")
FOR J=1:1:NMAX
SET GLOBPCS(J)=$PIECE(XR,"DA,",J)
+7 SET NODE=""
FOR
SET NODE=$ORDER(^TMP($JOB,"XGLOB",XR,NODE))
IF NODE=""
QUIT
FOR PIECE=0:0
SET PIECE=$ORDER(^TMP($JOB,"XGLOB",XR,NODE,PIECE))
IF PIECE'>0
QUIT
SET FILEI=^(PIECE)
Begin DoDot:1
+8 SET FLDJ=$PIECE(FILEI,U,2)
SET XREF=$PIECE(FILEI,U,3)
SET FILEI=+FILEI
SET VREF=""
IF $PIECE(^DD(FILEI,FLDJ,0),U,2)["V"
SET VREF=";"_$EXTRACT(XDRFGLOB,2,99)
+9 IF XREF="DINUM"
QUIT
+10 FOR IENOLD=0:0
SET IENOLD=$ORDER(@FROM@(IENOLD))
IF IENOLD'>0
QUIT
Begin DoDot:2
+11 NEW KVALUE,YGLOB,NCNT,DAIENS,ZGLOB
+12 SET IENNEW=$ORDER(@FROM@(IENOLD,""))
IF IENNEW'>0&'$DATA(XDRXFLG)
QUIT
+13 SET KVALUE=$SELECT(VREF'="":IENOLD_VREF,1:IENOLD)
SET ZGLOB=GLOBPCS(1)_XREF_","_""""_KVALUE_""""_")"
IF $DATA(@ZGLOB)
SET DAIENS=""
SET YGLOB=GLOBPCS(1)
SET NCNT=0
DO FINDXREF(NMAX,XDRXX,ZGLOB,NCNT,DAIENS,YGLOB)
+14 QUIT
End DoDot:2
+15 QUIT
End DoDot:1
+16 ; DEBUG STATEMENT
KILL XDRAA,XDRZZ
IF $DATA(XDRTESTK)
MERGE XDRAA=@XDRXX
+17 IF $DATA(@XDRXX)
DO FILE^DIE("",XDRXX)
+18 ; DEBUG STATEMENT
IF $DATA(XDRZZ)
IF $DATA(XDRTESTK)
SET XDRTESTK=XDRTESTK+1
MERGE ^XTMP("XDRTESTK",$$NOW^XLFDT(),XDRTESTK,"XX")=XDRAA,^("ZZ")=XDRZZ
KILL XDRAA,XDRZZ
+19 QUIT
+20 ;
FINDXREF(NMAX,XDRXX,ZGLOB,NCNT,DAIENS,YGLOB) ;
+1 NEW LVAL,NVAL
+2 SET NVAL=NCNT+1
+3 IF NVAL=NMAX
Begin DoDot:1
+4 FOR LVAL=0:0
SET LVAL=$ORDER(@ZGLOB@(LVAL))
IF LVAL'>0!(LVAL'=+LVAL)
QUIT
DO SETXREF((YGLOB_LVAL_","),(LVAL_","_DAIENS))
+5 QUIT
End DoDot:1
QUIT
+6 FOR LVAL=0:0
SET LVAL=$ORDER(@ZGLOB@(LVAL))
IF LVAL'>0!(LVAL'=+LVAL)
QUIT
DO FINDXREF(NMAX,XDRXX,$NAME(@ZGLOB@(LVAL)),NVAL,(LVAL_","_DAIENS),(YGLOB_LVAL_","_GLOBPCS(NVAL+1)))
+7 QUIT
+8 ;
SETXREF(YGLOB,DAIENS) ;
+1 IF $EXTRACT($PIECE($GET(@(YGLOB_NODE_")")),U,PIECE),1,30)'=KVALUE
QUIT
+2 ; POINTER WAS FOUND, MARK ENTRY FOR FILE
IF $DATA(XDRXFLG)
SET @FROM@(IENOLD,"R",FILEI)=$GET(@FROM@(IENOLD,"R",FILEI))+1
QUIT
+3 SET @XDRXX@(FILEI,DAIENS,FLDJ)=IENNEW_VREF
+4 DO SAVEPNTR^XDRMERGB(+IENOLD,+IENNEW,FILEI,DAIENS,FLDJ,(IENOLD_VREF))
+5 QUIT