[641] | 1 | XBKD ; IHS/ADC/GTH - KILLS DICs and GLOBALS ; [ 02/07/97 3:02 PM ]
|
---|
| 2 | ;;4.0;XB;;Jul 20, 2009;Build 2
|
---|
| 3 | ;
|
---|
| 4 | ; This routine deletes FileMan dictionaries, and optionally
|
---|
| 5 | ; their globals, TEMPLATES and AUTHORITIES, by a range of
|
---|
| 6 | ; dictionary numbers, or if called from another routine, by
|
---|
| 7 | ; a predefined set of dictionaries. The assumptions made
|
---|
| 8 | ; by this routine are that ^UTILITY, ^DIC, and ^DD are not
|
---|
| 9 | ; UCI TRANSLATED. Any other globals may be translated, but
|
---|
| 10 | ; the KILLs will take place in the current UCI only.
|
---|
| 11 | ;
|
---|
| 12 | ; This routine can be called from another routine by setting
|
---|
| 13 | ; the variables XBKDLO, XBKDHI, XBKDDEL, XBKDTMP and then
|
---|
| 14 | ; D EN1^XBKD, or by creating the array ^UTILITY("XBDSET",$J)
|
---|
| 15 | ; and then D EN2^XBKD.
|
---|
| 16 | ;
|
---|
| 17 | ; The array ^UTILITY("XBDSET",$J) is subscripted by the file
|
---|
| 18 | ; numbers and has a value of 'v1^v2' where v1 applies to the
|
---|
| 19 | ; data global, and v2 applies to the TEMPLATES attached to
|
---|
| 20 | ; the file. The allowable values of v1 and v2 are 'S' for
|
---|
| 21 | ; save, 'D' for delete, 'A' for ask.
|
---|
| 22 | ;
|
---|
| 23 | ; This routine will execute ^XBRESID to delete any residual
|
---|
| 24 | ; entries in ^DD if dictionaries are deleted by a range of
|
---|
| 25 | ; numbers.
|
---|
| 26 | ;
|
---|
| 27 | BEGIN ;
|
---|
| 28 | D ^XBKVAR
|
---|
| 29 | W !!,"This program deletes FileMan dictionaries, and optionally their"
|
---|
| 30 | W !,"globals, TEMPLATES and AUTHORITIES, by a range of dictionary numbers.",!!
|
---|
| 31 | ;
|
---|
| 32 | LO ;
|
---|
| 33 | R !,"Enter first dictionary number to be deleted: ",XBKDLO:$G(DTIME,999)
|
---|
| 34 | G:XBKDLO'=+XBKDLO EOJ
|
---|
| 35 | HI ;
|
---|
| 36 | W !,"Enter last dictionary number to be deleted: ",XBKDLO,"//"
|
---|
| 37 | R XBKDHI:$G(DTIME,999)
|
---|
| 38 | S:XBKDHI="" XBKDHI=XBKDLO
|
---|
| 39 | G:XBKDHI'=+XBKDHI!(XBKDHI<XBKDLO) EOJ
|
---|
| 40 | DEL ;
|
---|
| 41 | R !!,"Data globals? [D]elete, [A]sk, [S]ave S//",XBKDDEL:$G(DTIME,999)
|
---|
| 42 | G:"DAS"'[XBKDDEL DEL
|
---|
| 43 | S:XBKDDEL="" XBKDDEL="S"
|
---|
| 44 | ;
|
---|
| 45 | TMP ;
|
---|
| 46 | W !!,"TEMPLATES and AUTHORITIES? [D]elete, [A]sk, [S]ave ",XBKDDEL,"//"
|
---|
| 47 | R XBKDTMP:$G(DTIME,999)
|
---|
| 48 | G:"DAS"'[XBKDTMP TMP
|
---|
| 49 | S:XBKDTMP="" XBKDTMP=XBKDDEL
|
---|
| 50 | ;
|
---|
| 51 | EN1 ;PEP - Variables XBKDLO, XBKDHI, XBKDDEL, XBKDTMP must be set when entering here.
|
---|
| 52 | I '$D(XBKDLO)!('$D(XBKDHI)) W !!,"XBKDLO and/or XBKDHI does not exist!" G EOJ
|
---|
| 53 | D ^XBKVAR
|
---|
| 54 | S:'$D(XBKDDEL) XBKDDEL="A"
|
---|
| 55 | S:XBKDDEL="K" XBKDDEL="S" ;***** BACKWARD COMPATABLE *****
|
---|
| 56 | I "DAS"'[XBKDDEL W !!,"Invalid XBKDDEL --->",XBKDDEL,"<---" G EOJ
|
---|
| 57 | S:'$D(XBKDTMP) XBKDTMP="A"
|
---|
| 58 | S:XBKDTMP="K" XBKDTMP="S" ;***** UPWARD COMPATABLE *****
|
---|
| 59 | I "DAS"'[XBKDTMP W !!,"Invalid XBKDTMP --->",XBKDTMP,"<---" G EOJ
|
---|
| 60 | S XBDSLO=XBKDLO,XBDSHI=XBKDHI
|
---|
| 61 | D EN1^XBDSET
|
---|
| 62 | S XBKDFILE=(XBKDLO-.00000001)
|
---|
| 63 | F XBKDL=0:0 S XBKDFILE=$O(^DD(XBKDFILE)) Q:XBKDFILE>XBKDHI!(XBKDFILE'=+XBKDFILE) I '$D(^UTILITY("XBDSET",$J,XBKDFILE)) D CHECKDD
|
---|
| 64 | I '$D(^UTILITY("XBDSET",$J)) W !!,"No dictionaries were selected." G EOJ
|
---|
| 65 | S XBKDFILE=0
|
---|
| 66 | F XBKDL=0:0 S XBKDFILE=$O(^UTILITY("XBDSET",$J,XBKDFILE)) Q:XBKDFILE="" S ^(XBKDFILE)=XBKDDEL_U_XBKDTMP
|
---|
| 67 | G EN2
|
---|
| 68 | ;
|
---|
| 69 | CHECKDD ; CHECK ^DD FOR DANGLING ENTRIES
|
---|
| 70 | Q:$D(^DD(XBKDFILE,0,"UP"))
|
---|
| 71 | W "."
|
---|
| 72 | S ^UTILITY("XBDSET",$J,XBKDFILE)=""
|
---|
| 73 | Q
|
---|
| 74 | ;
|
---|
| 75 | EN2 ;PEP - Array ^UTILITY("XBDSET",$J) must exist when entering here.
|
---|
| 76 | I '$D(^UTILITY("XBDSET",$J)) W !!,"^UTILITY(""XBDSET"",$J) is not defined!" G EOJ
|
---|
| 77 | I $O(^UTILITY("XBDSET",$J,""))<2 W !!,"*** Don't mess with files less than 2!! ***",*7 KILL XBKDLO,XBKDHI G EOJ
|
---|
| 78 | D ^XBKVAR
|
---|
| 79 | S (XBKDFILE,XBKDFLG)=0
|
---|
| 80 | F XBKDL=0:0 S XBKDFILE=$O(^UTILITY("XBDSET",$J,XBKDFILE)) Q:XBKDFILE="" S XBKDX=^(XBKDFILE) D CHKVAL
|
---|
| 81 | I XBKDFLG W !!,"One or more invalid GLOBAL^TEMPLATE disposition values encountered!" G EOJ
|
---|
| 82 | KILL XBKDDEL,XBKDERR,XBKDFLG,XBKDTMP,XBKDX
|
---|
| 83 | D ^XBKD2
|
---|
| 84 | S XBKDFLG=0
|
---|
| 85 | D CONFIRM
|
---|
| 86 | G:XBKDFLG EOJ
|
---|
| 87 | KILL XBKDASK,XBKDFLG,XBKDX,XBKDY
|
---|
| 88 | D ^XBKD3
|
---|
| 89 | W !!,"Resetting ^DIC(0) <WAIT>"
|
---|
| 90 | S (XBKDC,XBKDFILE)=0,XBKDLAST=""
|
---|
| 91 | F XBKDL=0:0 S XBKDFILE=$O(^DIC(XBKDFILE)) Q:XBKDFILE'=+XBKDFILE S XBKDC=XBKDC+1,XBKDLAST=XBKDFILE
|
---|
| 92 | S $P(^DIC(0),"^",3)=XBKDLAST,$P(^DIC(0),"^",4)=XBKDC
|
---|
| 93 | G EOJ
|
---|
| 94 | ;
|
---|
| 95 | CHKVAL ; CHECK G^T VALUES
|
---|
| 96 | S XBKDERR=0
|
---|
| 97 | I XBKDX'?1U1"^"1U S XBKDERR=1
|
---|
| 98 | ;***** "K" TO "S" ADDED TO FOLLOWING LINE FOR UPWARD COMPABILITY *****
|
---|
| 99 | I 'XBKDERR S XBKDDEL=$P(XBKDX,U,1),XBKDTMP=$P(XBKDX,U,2) S:XBKDDEL="K" XBKDDEL="S" S:XBKDTMP="K" XBKDTMP="S" S:"ADS"'[XBKDDEL XBKDERR=1 S:"ADS"'[XBKDTMP XBKDERR=1
|
---|
| 100 | I XBKDERR S XBKDFLG=1 W !,"Invalid value ",XBKDFILE,"=",XBKDX
|
---|
| 101 | Q
|
---|
| 102 | ;
|
---|
| 103 | CONFIRM ; SHOW AND ASK
|
---|
| 104 | I '$D(^UTILITY("XBDSET",$J)) S XBKDFLG=1 Q
|
---|
| 105 | W !!," NUMBER",?14,"NAME",?45,"G^T",?50,"DATA GLOBAL",!
|
---|
| 106 | S (XBKDFILE,XBKDASK)=0
|
---|
| 107 | F XBKDL=0:0 S XBKDFILE=$O(^UTILITY("XBDSET",$J,XBKDFILE)) Q:XBKDFILE="" S XBKDX=^(XBKDFILE) S:$E(XBKDX,1,3)["A" XBKDASK=1 D LIST
|
---|
| 108 | W !!,"The above list of dictionaries will be deleted in UCI ",XBKDUCI,". Data"
|
---|
| 109 | W !,"globals, TEMPLATES and AUTHORITIES, will be kept, deleted, or asked depending"
|
---|
| 110 | W !,"on flag. '?' in G position indicates invalid data global."
|
---|
| 111 | W !!,"[S]ave, [D]elete, [A]sk. Globals to be deleted are also marked"
|
---|
| 112 | W !," by '*' in position 1."
|
---|
| 113 | I $D(ADIFROM("IHS")) S XBKDX=""
|
---|
| 114 | E R !!,"[C]ontinue, [S]top, [M]odify? C//",XBKDX:$G(DTIME,999) S:XBKDX="^" XBKDX="S"
|
---|
| 115 | I $E(XBKDX)="S" S XBKDFLG=1 Q
|
---|
| 116 | I $E(XBKDX)="M" D MODIFY G CONFIRM
|
---|
| 117 | Q:'XBKDASK
|
---|
| 118 | W !
|
---|
| 119 | S XBKDFILE=""
|
---|
| 120 | F XBKDL=0:0 S XBKDFILE=$O(^UTILITY("XBDSET",$J,XBKDFILE)) Q:XBKDFILE="" S XBKDX=^(XBKDFILE) D:$E(XBKDX,1,3)["A" ASK
|
---|
| 121 | G CONFIRM
|
---|
| 122 | ;
|
---|
| 123 | LIST ; LIST FILE INFO
|
---|
| 124 | W !,$S($P(XBKDX,U,1)="D":"*",1:" "),XBKDFILE,?14,$E($P(^DIC(XBKDFILE,0),U,1),1,30),?45,$E(XBKDX,1,3),?50,$S($P(XBKDX,U,3)="":"<NONE>",1:$P(XBKDX,U,3))
|
---|
| 125 | Q
|
---|
| 126 | ;
|
---|
| 127 | MODIFY ;
|
---|
| 128 | R !!,"Which file? ",XBKDFILE:$G(DTIME,999)
|
---|
| 129 | Q:XBKDFILE'=+XBKDFILE
|
---|
| 130 | I '$D(^UTILITY("XBDSET",$J,XBKDFILE)) W *7 G MODIFY
|
---|
| 131 | R !," Delete file from list of files to be deleted (Y/N) N//",XBKDY:$G(DTIME,999)
|
---|
| 132 | I $E(XBKDY)="Y" KILL ^UTILITY("XBDSET",$J,XBKDFILE) Q
|
---|
| 133 | S $P(^UTILITY("XBDSET",$J,XBKDFILE),U,2)="A",$P(^(XBKDFILE),U,1)=$S($P(^(XBKDFILE),U,1)="?":"?",1:"A"),XBKDX=^(XBKDFILE)
|
---|
| 134 | W !
|
---|
| 135 | D ASK
|
---|
| 136 | Q
|
---|
| 137 | ;
|
---|
| 138 | ASK ;
|
---|
| 139 | G:$P(XBKDX,U,1)'="A" ASK2
|
---|
| 140 | W !,"Do you want to delete the data global for ",XBKDFILE," ",$P(^DIC(XBKDFILE,0),U,1)," (Y/N) N//"
|
---|
| 141 | R XBKDY:$G(DTIME,999)
|
---|
| 142 | I $E(XBKDY)="Y" S $P(^UTILITY("XBDSET",$J,XBKDFILE),U,1)="D"
|
---|
| 143 | E S $P(^UTILITY("XBDSET",$J,XBKDFILE),U,1)="S"
|
---|
| 144 | ASK2 ;
|
---|
| 145 | Q:$P(XBKDX,U,2)'="A"
|
---|
| 146 | W !,"Do you want to delete the TEMPLATES and AUTHORITIES for ",XBKDFILE," ",$P(^DIC(XBKDFILE,0),U,1)," (Y/N) N//"
|
---|
| 147 | R XBKDY:$G(DTIME,999)
|
---|
| 148 | I $E(XBKDY)="Y" S $P(^UTILITY("XBDSET",$J,XBKDFILE),U,2)="D"
|
---|
| 149 | E S $P(^UTILITY("XBDSET",$J,XBKDFILE),U,2)="S"
|
---|
| 150 | Q
|
---|
| 151 | ;
|
---|
| 152 | EOJ ;
|
---|
| 153 | I $D(XBKDLO),$D(XBKDHI),XBKDLO=+XBKDLO,XBKDHI=+XBKDHI,XBKDHI>XBKDLO S XBRLO=XBKDLO,XBRHI=XBKDHI D EN1^XBRESID
|
---|
| 154 | I $D(^UTILITY("XBKD",$J)) W !,"Restoring saved ^DD nodes. <WAIT>" S FROM="^UTILITY(""XBKD"",$J,",TO="^DD(" D ^XBGXFR
|
---|
| 155 | KILL ^UTILITY("XBDSET",$J),^UTILITY("XBKD",$J)
|
---|
| 156 | KILL %,DA,DIK,Y
|
---|
| 157 | KILL XBKDASK,XBKDC,XBKDDEL,XBKDERR,XBKDFILE,XBKDFLD,XBKDFLG,XBKDG,XBKDHI,XBKDL,XBKDLAST,XBKDLO,XBKDNDIC,XBKDTMP,XBKDUCI,XBKDX,XBKDY
|
---|
| 158 | KILL FROM,TO
|
---|
| 159 | W !!,"DONE",!!
|
---|
| 160 | Q
|
---|
| 161 | ;
|
---|