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

XPDIB.m

Go to the documentation of this file.
  1. XPDIB ;SFISC/RSD - Backup installed Package ; Mar 20, 2023@14:49:13
  1. ;;8.0;KERNEL;**10,58,108,178,713,738,750,755,768,778,785,796**;Jul 10, 1995;Build 4
  1. ;Per VHA Directive 2004-038, this routine should not be modified.
  1. EN ;
  1. ;p713 - added support to create Build from Transport Global to create a backup
  1. N DIR,DIRUT,DUOUT,XPDA,XPDBLD,XPDTCNT,XPDH,XPDH1,XPDHD,XPDFMSG,XPDI,XPDIDVT,XPDMP,XPDNM,XPDPKG,XPDQUIT,XPDST
  1. N XPDT,XPDTB,XPDSBJ,XPDTYP,XPDVER,X,Y,Y0,%,XPDIB
  1. ;S %="I '$P(^(0),U,9),$D(^XPD(9.7,""ASP"",Y,1,Y)),$D(^XTMP(""XPDI"",Y))",XPDST=$$LOOK^XPDI1(%)
  1. S %="I $E($P(^(0),U),$L($P(^(0),U)))'=""b"",'$P(^(0),U,9),$D(^XPD(9.7,""ASP"",Y,1,Y)),$D(^XTMP(""XPDI"",Y))",XPDST=$$LOOK^XPDI1(%) ;p755 can't backup a backup
  1. Q:'XPDST!$D(XPDQUIT)
  1. ;XPDST=starting install ien, XPDNM=install name, XPDBLD=build #, XPDPKG=package file pointer, XPDT(#)=Install file #^Install file name XPDIB=flag to not write errors
  1. S XPDIB=1 D BLDV(XPDST)
  1. S XPDTCNT=$O(XPDT("DA"),-1) ;XPDTCNT=# of installs
  1. I XPDTYP>1 W !!,"This is a Global Package and cannot be backed up.",!! Q ;p738
  1. ;multi-package reset name to include all builds
  1. I XPDTCNT>1 S XPDNM="" F XPDT=1:1:XPDTCNT S XPDNM=XPDNM_$P(XPDT(XPDT),U,2)_$S(XPDT'=XPDTCNT:", ",1:"")
  1. S DIR(0)="F^3:65",DIR("A")="Subject"
  1. S DIR("?")="characters and must not contain embedded up-arrows."
  1. S DIR("?",1)="Enter the subject for this Backup Message"
  1. S DIR("?",2)="This response must have at least 3 characters and no more than 63"
  1. S DIR("B")=$E(("Backup of "_XPDNM_" on "_$$FMTE^XLFDT(DT)),1,63)
  1. W ! D ^DIR I $D(DIRUT) G QUIT
  1. S XPDSBJ=Y
  1. K DIR
  1. ;Build or Routines
  1. S DIR(0)="S^B:Build (including Routines);R:Routines Only",DIR("A")="Backup Type",DIR("B")="B"
  1. S DIR("?")="Backup the entire Build(routines, files, options, protocols, templates, etc.) or just the Routines." ;p738
  1. S DIR("??")="^D HELP^XPDIB" ;p750
  1. D ^DIR G:$D(DIRUT) QUIT
  1. ;R=routine Packman msg
  1. I Y="R" D ROUTINE G QUIT
  1. ;XPDTCNT: 1=single, >1=multi-package ;p738
  1. I XPDTCNT=1 S (XPDT,XPDTB)=1,XPDA=$$BLD(XPDST),XPDNM=$P(XPDTB(1),U,2) D PM(XPDA),DELBLD(XPDA) G QUIT ;p778 delete backup build
  1. I XPDTCNT>1 D G QUIT
  1. . N XPDSEQ,XPDSIZ,XPDSIZA,POP ;used in GO^XPDT
  1. . S XPDH=XPDSBJ ;XPDH is HF header needed in DEV^XPDT
  1. . D DEV^XPDT Q:POP
  1. . S XPDTB=0
  1. . ;loop thru installs, XPDT(#)=install file #^name, XPDTB(#)=build file #^name
  1. . F XPDT=1:1:XPDTCNT S XPDTB=XPDTB+1,XPDA=+XPDT(XPDT),XPDA=$$BLD(XPDA,XPDST) ;p738
  1. . ;move XPDTB to XPDT
  1. . K XPDT M XPDT=XPDTB
  1. . S XPDFMSG=0 ;open Host File, XPDFMSG=1 is flag to send HF to Forum
  1. . D GO^XPDT ;write ^XTMP("XPDT" to HF
  1. . ;loop thru backup builds and delete the builds ;p778
  1. . F XPDT=1:1:XPDTCNT S XPDA=+XPDT(XPDT) D DELBLD(XPDA)
  1. . Q
  1. Q
  1. BLD(XPDST,XPDMP) ;XPDST=Install #,XPDMP=master build or first Install # of multi-package; returns XPDA=new Build #
  1. N XPDA,XPDBLD,XPD,XPDERR,XPDFILE,XPDFL,XPDFLD,XPDGREF,XPDI,XPDNM,XPDOLDA,XPDREST,I,J,X,Y,Y0
  1. N XPDSD,XPDSUBDD
  1. D BLDV(XPDST)
  1. ;create new build, add "b" to mark as backup & change ^XTMP(
  1. S XPDI=XPDNM,XPDNM=XPDNM_"b",$P(^XTMP("XPDI",XPDST,"BLD",XPDBLD,0),U)=XPDNM
  1. ;$$BLD^XPDIP needs: XPDA, XPDBLD, XPDNM, XPDPKG
  1. S XPDA=XPDST,XPDA=$$BLD^XPDIP(XPDBLD) Q:'XPDA 0
  1. ;reset ^XTMP back to original value
  1. S $P(^XTMP("XPDI",XPDST,"BLD",XPDBLD,0),U)=XPDI,XPDTB(XPDTB)=XPDA_"^"_XPDNM
  1. ;change TRACK NATIONALLY(5)=no, ALPHA/BETA TESTING(20),INSTALLATION MSG(21),ADDRESS(22),Build number(63)
  1. S %=XPDA_",",XPD(9.6,%,5)="n",XPD(9.6,%,20)="n",XPD(9.6,%,21)="n",XPD(9.6,%,22)="n",XPD(9.6,%,63)=0
  1. S XPD(9.6,%,3)="XPDI",XPDI(1,0)=XPDSBJ,XPDI(2,0)=" " ;DESCRIPTION(3)
  1. ;add warning msg and file Description
  1. D WARN("XPDI",3),FILE^DIE("","XPD")
  1. ;delete multiples: REQUIRED BUILD(11), PACKAGE NAMESPACE(23), INSTALL QUESTIONS(50), XPFn(51.01-51.13), TEST/SEQ/TRANS(61-62)
  1. K ^XPD(9.6,XPDA,"REQB"),^("ABNS"),^("QUES"),^("QDEF"),^(6)
  1. ;Restore Routine ;p768
  1. I $G(^XPD(9.6,XPDA,"REST"))]"" M XPDREST=^XTMP("XPDI",XPDST,"REST")
  1. ;delete PRE-T(900), ENVIR(913), POST(914), PRE-IN(916), DELETE routine, RESTORE(917)
  1. K ^XPD(9.6,XPDA,"PRET"),^("PRE"),^("INIT"),^("INI"),^("INID"),^("REST")
  1. ;scan BUILD COMPONENTS(7) and reset actions
  1. S XPDFILE=0
  1. F S XPDFILE=$O(^XPD(9.6,XPDA,"KRN",XPDFILE)),XPDOLDA=0 Q:'XPDFILE D
  1. . F S XPDOLDA=$O(^XPD(9.6,XPDA,"KRN",XPDFILE,"NM",XPDOLDA)) Q:'XPDOLDA S Y0=$G(^(XPDOLDA,0)) D
  1. .. S Y=$P(Y0,U,3) ; action
  1. .. I XPDFILE=19!(XPDFILE=101),Y>1 D:Y'=3 DELKRN(Y0) Q ;link=2,attach=4,disable=5:delete component;merge=3:leave as merge ;p778
  1. .. D KRN(XPDFILE,Y0)
  1. .. Q
  1. . Q
  1. ;scan FILE(#6) ^XPD(file#,222)=update DD^Security^f=full,p=partial DD^^resolve pointers^data list^data comes^site data^may override
  1. S XPDFILE=0
  1. F S XPDFILE=$O(^XPD(9.6,XPDA,4,XPDFILE)) Q:'XPDFILE S XPDFL=$G(^(XPDFILE,222)) D
  1. . I $P(XPDFL,U,3)="f" D Q ;full DD
  1. .. I '$D(^DD(XPDFILE)) D DELF(XPDFILE) Q ;delete if new
  1. .. ;can't backup data in file, set to 'no', kill 'select data screen' p738
  1. .. I $P(XPDFL,U,7)="y" S $P(XPDFL,U,7)="n",^XPD(9.6,XPDA,4,XPDFILE,222)=XPDFL K ^(223)
  1. .. Q
  1. . ;Partial DD, loop thru subDD (XPDSUBDD) to find the fields (XPDFLD). subDD with no fields=send all fields.
  1. . S (XPDSD,XPDSUBDD)=0
  1. . F S XPDSUBDD=$O(^XPD(9.6,XPDA,4,XPDFILE,2,XPDSUBDD)),XPDFLD=0 Q:'XPDSUBDD D
  1. .. I $O(^XPD(9.6,XPDA,4,XPDFILE,2,XPDSUBDD,1,0)) D Q ;fields are specified
  1. ... F S XPDFLD=$O(^XPD(9.6,XPDA,4,XPDFILE,2,XPDSUBDD,1,XPDFLD)) Q:'XPDFLD D FLD(XPDSUBDD,XPDFLD) ;loop thru fields
  1. ... D:'$O(^XPD(9.6,XPDA,4,XPDFILE,2,XPDSUBDD,1,0)) DEL(XPDFILE,XPDSUBDD) ;if all fields were removed, remove subDD
  1. ... Q
  1. .. D:'($D(^DD(XPDSUBDD,0))#10) DEL(XPDFILE,XPDSUBDD) ;fields not specified & subDD is new - remove subDD
  1. .. Q
  1. . D:'$O(^XPD(9.6,XPDA,4,XPDFILE,2,0)) DEL(XPDFILE) ;if all subDDs removed, remove file ;p768
  1. . Q
  1. ;kill transport global before we rebuild it
  1. K ^XTMP("XPDT",XPDA)
  1. ;XPDFREF is a documented variable for use in PRE-TRANSPORTATION routine
  1. S XPDVER="",XPDGREF="^XTMP(""XPDT"","_+XPDA_",""TEMP"")"
  1. ;from XPDT, transport build
  1. F X="DD^XPDTC","KRN^XPDTC","QUES^XPDTC","INT^XPDTC","BLD^XPDTC" D @X ;p755 don't check for errors $D(XPDERR)
  1. ;Load RESTORE routine ;p768
  1. I $D(XPDREST) D
  1. . S I=+$O(^XTMP("XPDT",XPDA,"BLD",0)) S:I ^XTMP("XPDT",XPDA,"BLD",I,"INIT")=XPDREST ;save RESTORE as POST-INIT in Build
  1. . S ^XTMP("XPDT",XPDA,"INIT")=XPDREST,Y=$P(XPDREST,"("),Y=$P(Y,U,$L(Y,U)) Q:$D(^("RTN",Y))
  1. . M ^XTMP("XPDT",XPDA,"RTN",Y)=XPDREST(Y) ;save RESTORE routine
  1. . ;^XTMP("XPDT",XPDA,"RTN",Y)=action^ien in Build^checksum
  1. . S X="B"_$$SUMB^XPDRSUM($NA(^XTMP("XPDT",XPDA,"RTN",Y))),^XTMP("XPDT",XPDA,"RTN",Y)="0^^"_X
  1. . ;update count node
  1. . S ^("RTN")=$G(^XTMP("XPDT",XPDA,"RTN"))+1
  1. . Q
  1. Q XPDA
  1. ;
  1. BLDV(XPDA) ;variable setup for BLD, XPDA=Install #
  1. N Y0
  1. ;XPDNM=install name, XPDBLD=build #, Y0=zero node of build, XPDPKG=package file name
  1. S XPDBLD=+$O(^XTMP("XPDI",XPDA,"BLD",0)),Y0=$G(^(XPDBLD,0)),XPDNM=$P(Y0,U),XPDPKG=$P(Y0,U,2),XPDTYP=+$P(Y0,U,3)
  1. S:XPDPKG]"" XPDPKG=$$LKPKG^XPDUTL(XPDPKG) ;XPDPKG=package file #
  1. Q
  1. ;XPDTP to build Packman message
  1. PM(XPDA) ;build MailMan message
  1. N DIFROM,XCNP,DIF,XMSUB,XMDUZ,XMDISPI,XMZ
  1. S DIFROM=1,XMDUZ=+DUZ,XMSUB=XPDSBJ ;p738
  1. W !!," **This Backup mail message should be sent to a Mail Group. This will allow" ;p768
  1. W !," anyone in the Mail Group to back out the changes.**"
  1. K ^TMP("XMP",$J) ;create message text for Packman
  1. D WARN("^TMP(""XMP"",$J)",1),KD^XPDTP
  1. Q:$D(DTOUT)!$D(DUOUT)
  1. W !!,"Message sent",!
  1. Q
  1. ;
  1. ROUTINE ;Packman msg
  1. N XCNP,DIF,XMSUB,XMDUZ,XMDISPI,XMZ
  1. S XMSUB=XPDSBJ_". Routines Only",XMDUZ=+DUZ
  1. D XMZ^XMA2 I XMZ<1 D QUIT^XPDI1(XPDST) Q
  1. S Y=$$NOW^XLFDT,%=$$DOW^XLFDT(Y),Y=$$FMTE^XLFDT(Y,2)
  1. S X="PACKMAN BACKUP Created on "_%_", "_$P(Y,"@")_" at "_$P(Y,"@",2)
  1. I $D(^VA(200,DUZ,0)) S X=X_" by "_$P(^(0),U)_" "
  1. S:$D(^XMB("NAME")) X=X_"at "_$P(^("NAME"),U)_" "
  1. S ^XMB(3.9,XMZ,2,0)="^3.92A^^^"_DT,^(1,0)="$TXT "_X,XCNP=1
  1. S XPDT=0
  1. F S XPDT=$O(XPDT(XPDT)) Q:'XPDT D
  1. . S XPDA=+XPDT(XPDT),XPDNM=$P(XPDT(XPDT),U,2),X=""
  1. . I '$D(^XTMP("XPDI",XPDA,"RTN")) W !,"No routines for ",XPDNM,! Q
  1. . W !,"Loading Routines for ",XPDNM
  1. . F S X=$O(^XTMP("XPDI",XPDA,"RTN",X)) Q:X="" D W "."
  1. .. N %N,DIF
  1. .. X ^%ZOSF("TEST") E W !,X,?10,"Doesn't Exist" Q ;p713
  1. .. S XCNP=XCNP+1,^XMB(3.9,XMZ,2,XCNP,0)="$ROU "_X_" (PACKMAN_BACKUP)",DIF="^XMB(3.9,XMZ,2,"
  1. .. X ^%ZOSF("LOAD")
  1. .. S $P(^XMB(3.9,XMZ,2,0),U,3,4)=XCNP_U_XCNP,^(XCNP,0)="$END ROU "_X_" (PACKMAN-BACKUP)"
  1. .. Q
  1. . Q
  1. D EN3^XMD
  1. Q
  1. ;
  1. KRN(FILE,XPDY) ;FILE=file #, XPDY=^XPD(9.6,XPDA,"KRN",XPDFILE,"NM",XPDOLDA,0)
  1. N DA,FGR,X
  1. S X=$P(XPDY,U)
  1. ;$P(XPDY,U,2) is file # for FileMan templates, reset name in XPDY before getting DA
  1. S:$P(XPDY,U,2) $P(XPDY,U)=$P(XPDY," FILE #") ;p785
  1. ;Routine file, just check if routine exists, don't call FILE or ENTRY
  1. I FILE=9.8 S DA=($T(^@X)]"") ;p796
  1. E S FGR=$$FILE^XPDV(FILE),DA=$$ENTRY^XPDV(XPDY) ;DA=ien or 0 if doesn't exists
  1. ;If X exists, set to 0 - send, else set to 1 - delete
  1. S $P(XPDY,U,3)='DA
  1. ;save component
  1. S ^XPD(9.6,XPDA,"KRN",FILE,"NM",XPDOLDA,0)=XPDY ;p778
  1. Q
  1. ;
  1. DELKRN(XPDY) ;delete BUILD COMPONENTS(7) & "B" index for XPDY ;p778
  1. K ^XPD(9.6,XPDA,"KRN",XPDFILE,"NM",XPDOLDA,0),^XPD(9.6,XPDA,"KRN",XPDFILE,"NM","B",$P(XPDY,U),XPDOLDA)
  1. Q
  1. ;
  1. FLD(DD,FIELD) ;check FIELD exists
  1. D:'($D(^DD(DD,FIELD,0))#10) DEL(XPDFILE,DD,FIELD) ;field is new, delete
  1. Q
  1. ;
  1. DEL(FILE,SUBDD,FIELD) ;deletes partials: FILE=file#, SUBDD=sub dictionary#, FIELD=field#, XPDA=ien in Build file
  1. I $G(FIELD) K ^XPD(9.6,XPDA,4,FILE,2,SUBDD,1,FIELD),^XPD(9.6,XPDA,4,"APDD",FILE,SUBDD,FIELD) Q ;delete FIELD & index
  1. I $G(SUBDD) K ^XPD(9.6,XPDA,4,FILE,2,SUBDD),^XPD(9.6,XPDA,4,"APDD",FILE,SUBDD) Q ;delete SUBDD & index
  1. I $G(FILE) K ^XPD(9.6,XPDA,4,FILE),^XPD(9.6,XPDA,4,"APDD",FILE),^XPD(9.6,XPDA,4,"B",FILE) ;delete FILE & index
  1. Q
  1. ;
  1. DELF(FILE) ;delete full file DD
  1. N DIK,DA
  1. S DIK="^XPD(9.6,"_XPDA_",4,",DA=FILE,DA(1)=XPDA
  1. D ^DIK
  1. Q
  1. ;
  1. DELBLD(DA) ;delete backup build ;p778
  1. Q:'$G(DA)
  1. N DIK
  1. S DIK="^XPD(9.6,"
  1. D ^DIK
  1. Q
  1. ;
  1. WARN(X,Y) ;create warning message in array X starting at Y ;p738
  1. S @X@(Y,0)="Warning: Installing this backup patch message will install older versions"
  1. S @X@(Y+1,0)="of routines and Build Components (options, protocols, templates, etc.)."
  1. S @X@(Y+2,0)="Please verify with the Development Team that it is safe to install."
  1. Q
  1. ;
  1. QUIT ;unlock Install # XPDST
  1. D QUIT^XPDI1(XPDST)
  1. Q
  1. ;
  1. HELP ;Help (DIR("??")) for DIR (Build/Routine) read ;p750
  1. W !," Enter 'B' to create a backup of this Build. A new Build will be created using",!,"the same Build name with a 'b' appended to the end. This new Build will be used"
  1. W !,"to create a KIDS backup of routines, files, options, protocols, templates, etc.",!,"If this backup is a single build, a Packman email is created. If it is a multi-package a Host File is created."
  1. W !," Enter 'R' to create a Packman email of only the routines."
  1. Q