1 | TMGPAT1 ;TMG/kst/Patching tools ;09/17/08
|
---|
2 | ;;1.0;TMG-LIB;**1**;09/17/08
|
---|
3 | ;
|
---|
4 | ;"Kevin Toppenberg MD
|
---|
5 | ;"GNU General Public License (GPL) applies
|
---|
6 | ;"9/17/08
|
---|
7 |
|
---|
8 | ;"=======================================================================
|
---|
9 | ;" API -- Public Functions.
|
---|
10 | ;"=======================================================================
|
---|
11 | ;"DONEXT -- Ask for package, and install next appropriate patch
|
---|
12 | ;"DONEXTPJ -- do next patch within the same project
|
---|
13 | ;"FIXMISEQ -- allow fixing a missing patch, based on sequence order
|
---|
14 | ;"FIXMISPT -- allow fixing a missing patch, based on patch number
|
---|
15 | ;"DONEXTPK(PckInit,Ver)-- a common entry point
|
---|
16 | ;"GO(Option,Info,Msg) -- Entry point to allow automatic loading and installation of a patch.
|
---|
17 | ;"LOAD -- Entry point to allow manual loading of a patch (like old way, but using new code)
|
---|
18 |
|
---|
19 | ;"=======================================================================
|
---|
20 | ;"Private Functions
|
---|
21 | ;"=======================================================================
|
---|
22 | ;"Logo
|
---|
23 | ;"FixMissing(Mode) allow fixing a missing patch, even if it is out of sequence order
|
---|
24 | ;"FixMisInit(PckInit,Ver,Mode) -- Based on PckInit, and Version, allow fixing a missing patch, even if it is out of sequence order
|
---|
25 | ;"DoFixMissing(IENS,Mode) -- fix a missing patch, even if it is out of sequence order
|
---|
26 | ;"DoIENS(NextIENS,NextPatch,PckDirFName) -- install patch, given IENS to it's entry in 22709.11
|
---|
27 | ;"GetPckVer(PckInit,Ver) -- query user for package, and desired version
|
---|
28 | ;"GetLastPackage(PckInit,Ver) -- for given package initials, return the last patch applied
|
---|
29 | ;"GetPVIEN(PckInit,Ver,IEN9d4,IEN9d49) -- convert PckInit and Ver into IEN's for file 9.4 ad 9.49
|
---|
30 | ;"GetLastInst(PckInit,Ver,InstIEN) -- for given package initials, return the last patch applied in INSTALL file
|
---|
31 | ;"GetVers(PckInit,VerArray) --for given package initials, return possible versions
|
---|
32 | ;"PickFile(pArray) -- Pick a filename from a list, in a menu
|
---|
33 |
|
---|
34 | ;"=======================================================================
|
---|
35 |
|
---|
36 | Logo write !!,"===================",!
|
---|
37 | write "TMG Patcher Helper",!
|
---|
38 | write "===================",!
|
---|
39 | quit
|
---|
40 |
|
---|
41 | DONEXT
|
---|
42 | ;"Purpose: Ask for package, and install next appropriate patch
|
---|
43 | do Logo
|
---|
44 | new PckInit,Ver
|
---|
45 | do GetPckVer(.PckInit,.Ver)
|
---|
46 | if Ver="^" goto DNDone
|
---|
47 | do DONEXTPK(PckInit,Ver)
|
---|
48 | goto DONEXT
|
---|
49 | DNDone
|
---|
50 | quit
|
---|
51 |
|
---|
52 | DONEXTPJ
|
---|
53 | ;"Purpose: to do next patch within the same project
|
---|
54 | do Logo
|
---|
55 | new PckInit,Ver
|
---|
56 | new s set s=$get(^TMG("KIDS","PROJECT"))
|
---|
57 | if s'="" do
|
---|
58 | . set PckInit=$piece(s,"^",1)
|
---|
59 | . set Ver=$piece(s,"^",2)
|
---|
60 | else do
|
---|
61 | . do GetPckVer(.PckInit,.Ver)
|
---|
62 | . set s=PckInit_"^"_Ver
|
---|
63 | . set ^TMG("KIDS","PROJECT")=s
|
---|
64 | if Ver="^" goto DNDone
|
---|
65 | do DONEXTPK(PckInit,Ver)
|
---|
66 | DNPJDone
|
---|
67 | quit
|
---|
68 |
|
---|
69 |
|
---|
70 | FIXMISEQ
|
---|
71 | ;"Purpose: to allow fixing a missing patch, based on sequence order
|
---|
72 | do FixMissing(1)
|
---|
73 | quit
|
---|
74 |
|
---|
75 |
|
---|
76 | FIXMISPT
|
---|
77 | ;"Purpose: to allow fixing a missing patch, based on patch number
|
---|
78 | do FixMissing(2)
|
---|
79 | quit
|
---|
80 |
|
---|
81 |
|
---|
82 | FixMissing(Mode)
|
---|
83 | ;"Purpose: to allow fixing a missing patch, even if it is out of sequence order
|
---|
84 | ;" This will prepare, then call DoFixMissing()
|
---|
85 | ;"Input: Mode -- 1: search by SEQ#, 2: search by Patch#
|
---|
86 | do Logo
|
---|
87 | write "Fix missing patches, regardless of order",!
|
---|
88 | new PckInit,Ver
|
---|
89 | do GetPckVer(.PckInit,.Ver) goto:(Ver="^") FMIDone
|
---|
90 | ;"set IENS=$$AskIENS^TMGDBAPI(22709.01) goto:(IENS="") FMIDone
|
---|
91 | do FixMisInit(.PckInit,.Ver,.Mode)
|
---|
92 | FMDone quit
|
---|
93 |
|
---|
94 |
|
---|
95 | FixMisInit(PckInit,Ver,Mode)
|
---|
96 | ;"Purpose: Based on PckInit, and Version, allow fixing a missing patch, even if it is out of sequence order
|
---|
97 | ;" This will prepare, then call DoFixMissing()
|
---|
98 | ;"Input: Mode -- 1: search by SEQ#, 2: search by Patch#
|
---|
99 | set PckInit=$get(PckInit) goto:(PckInit="") FMIDone
|
---|
100 | set Ver=$get(Ver) goto:(Ver="") FMIDone
|
---|
101 | new IENS set IENS=$$GetIENS2^TMGPAT2(PckInit_"*"_Ver) goto:(IENS="") FMIDone
|
---|
102 | do DoFixMissing(IENS,.Mode)
|
---|
103 | FMIDone quit
|
---|
104 |
|
---|
105 |
|
---|
106 | DoFixMissing(IENS,Mode)
|
---|
107 | ;"Purpose: fix a missing patch, even if it is out of sequence order
|
---|
108 | ;"Input: IENS -- should be IENS from file 27709.01
|
---|
109 | ;" i.e. 'IEN22709d01,IEN22709,'
|
---|
110 | ;" Mode -- 1: search by SEQ#, 2: search by Patch#
|
---|
111 |
|
---|
112 | new PckInit,Ver,Y,PatchName,Msg,PckDirFName
|
---|
113 | new IEN1 set IEN1=+$piece(IENS,",",2) goto:(IEN1'>0) FMSDone
|
---|
114 | new IEN2 set IEN2=+$piece(IENS,",",1) goto:(IEN2'>0) FMSDone
|
---|
115 | new IEN9d4 set IEN9d4=$piece($get(^TMG(22709,IEN1,0)),"^",1) goto:(IEN9d4'>0) FMSDone
|
---|
116 | set PckInit=$piece($get(^DIC(9.4,IEN9d4,0)),"^",2)
|
---|
117 | set Ver=$piece($get(^TMG(22709,IEN1,1,IEN2,0)),"^",1) goto:(Ver="") FMSDone
|
---|
118 | new saveIENS set saveIENS=IENS
|
---|
119 | set Mode=+$get(Mode,1)
|
---|
120 |
|
---|
121 | do MAKFRESH^TMGPAT2(PckInit,.Msg,.PckDirFName)
|
---|
122 | FMLoop new SrchNum,DIR
|
---|
123 | set DIR(0)="N^1:9999:0"
|
---|
124 | if Mode=1 set DIR("A")="Enter missing patch SEQUENCE NUMBER"
|
---|
125 | else set DIR("A")="Enter missing PATCH NUMBER"
|
---|
126 | do ^DIR write !
|
---|
127 | if $get(DIRUT) goto FMSDone
|
---|
128 | set SrchNum=+Y
|
---|
129 |
|
---|
130 | ;"Search for specified Patch/Seq #
|
---|
131 | new found set found=0
|
---|
132 | new IEN3 set IEN3=0
|
---|
133 | new PatchNum set PatchNum=0
|
---|
134 | new SeqNum set SeqNum=0
|
---|
135 | for set IEN3=$order(^TMG(22709,IEN1,1,IEN2,1,IEN3)) quit:(IEN3'>0)!found do
|
---|
136 | . set PatchNum=$piece($get(^TMG(22709,IEN1,1,IEN2,1,IEN3,0)),"^",1)
|
---|
137 | . set SeqNum=$piece($get(^TMG(22709,IEN1,1,IEN2,1,IEN3,0)),"^",2)
|
---|
138 | . if (Mode=1),(SeqNum=SrchNum) set found=IEN3
|
---|
139 | . else if (Mode=2),(PatchNum=SrchNum) set found=IEN3
|
---|
140 | . if found do
|
---|
141 | . . set IENS=IEN3_","_IENS
|
---|
142 | . . set PatchName=PckInit_"*"_Ver_"*"_PatchNum_" SEQ #"_SeqNum
|
---|
143 |
|
---|
144 | if found=0 do goto FMSDone
|
---|
145 | . write "Sorry. Can't find that Patch/Seq Number in downloaded info from ftp.va.gov",!
|
---|
146 |
|
---|
147 | write "Found: ",PatchName," on ftp.va.gov server.",!
|
---|
148 |
|
---|
149 | ;"Now see if already installed
|
---|
150 | new DIC,X,Y,IEN9d49
|
---|
151 | ;"set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
152 | set DIC="^DIC(9.4,"_IEN9d4_",22,"
|
---|
153 | set DIC(0)="M"
|
---|
154 | set X=Ver
|
---|
155 | do ^DIC
|
---|
156 | set IEN9d49=+Y
|
---|
157 | if IEN9d49'>0 do goto FMSDone
|
---|
158 | . write "?? Can't find that version in the PACKAGE file",!
|
---|
159 |
|
---|
160 | set found=0
|
---|
161 | new i set i=""
|
---|
162 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="")!found do
|
---|
163 | . new onePatchNum set onePatchNum=$piece(i," ",1)
|
---|
164 | . ;"write onePatchNum,!
|
---|
165 | . if onePatchNum=PatchNum set found=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i,""))
|
---|
166 |
|
---|
167 | if found do goto FMSMore
|
---|
168 | . new newIENS set newIENS=found_","_IEN9d49_","_IEN9d4
|
---|
169 | . write "Sorry, that patch is already installed. IENS='",newIENS,"'",!
|
---|
170 | . do ForceP2^TMGPAT2(PckInit,Ver,PatchNum,SeqNum)
|
---|
171 |
|
---|
172 |
|
---|
173 | new % set %=1
|
---|
174 | write "Do you want to work on this patch now (out of sequence order)" do YN^DICN write !
|
---|
175 | if %'=1 goto FMSDone
|
---|
176 |
|
---|
177 | if $$DoIENS(IENS,PatchName,.PckDirFName) ;"actually process patch
|
---|
178 |
|
---|
179 | FMSMore set %=1
|
---|
180 | write "Fix others in this same Package-Version" do YN^DICN write !
|
---|
181 | if %=1 do goto FMLoop
|
---|
182 | . set IENS=saveIENS
|
---|
183 |
|
---|
184 | FMSDone
|
---|
185 | quit
|
---|
186 |
|
---|
187 |
|
---|
188 | DONEXTPK(PckInit,Ver)
|
---|
189 | ;"Purpose: a common entry point
|
---|
190 | ;"Input: PckInit -- package initials
|
---|
191 | ;" Ver -- version e.g. '22.0'
|
---|
192 | ;"Result: None
|
---|
193 |
|
---|
194 | new LastPck,NextIENS,NextPatch,LastInst,PckDirFName
|
---|
195 | new Info,Msg,Option,result,restart,InstIEN,abort,chgVer
|
---|
196 |
|
---|
197 | set (abort,restart,chgVer)=0
|
---|
198 | do MAKFRESH^TMGPAT2(PckInit,.Msg,.PckDirFName)
|
---|
199 | DNP1 set LastPck=$$GetLastPackage(PckInit,Ver)
|
---|
200 | if LastPck="" do goto AllDone
|
---|
201 | . write "Sorry, can't find any installed packges in that version.",!
|
---|
202 | set LastInst=$$GetLastInst(PckInit,Ver,.InstIEN)
|
---|
203 | write "The last patch installed into PACKAGE file was: ",?50,LastPck,!
|
---|
204 | if LastInst="" goto DNP2
|
---|
205 | write "The last patch loaded into the INSTALL file was: ",?50,LastInst," (FYI)",!
|
---|
206 | if +$piece(LastPck,"SEQ #",2)<+$piece(LastInst,"SEQ #",2) do goto:(restart) AllDone
|
---|
207 | . new % set %=2
|
---|
208 | . write !,"Undelete entry in INSTALL FILE" do YN^DICN write !
|
---|
209 | . if %=1 do quit
|
---|
210 | . . do EN1^TMGXPDIU(InstIEN)
|
---|
211 | . . set restart=1
|
---|
212 | . set %=1
|
---|
213 | . write "Try to continue with existing files" do YN^DICN write !
|
---|
214 | . if %'=1 set restart=1 quit
|
---|
215 | if restart goto AllDone
|
---|
216 | DNP2 set NextIENS=$$GetNextIENS^TMGPAT2(LastPck,.NextPatch)
|
---|
217 | new pendingCt set pendingCt=$$Rpt1Avail^TMGPAT3(LastPck)
|
---|
218 | if pendingCt>0 write "Number of pending patches for this package:",?50,pendingCt,!
|
---|
219 | else do goto:(chgVer) DNP1
|
---|
220 | . if $$RptAvail^TMGPAT3(PckInit)=0 set chgVer=0 quit
|
---|
221 | . do AskVer(PckInit,.Ver)
|
---|
222 | . set chgVer=1
|
---|
223 |
|
---|
224 | if $$DoIENS(NextIENS,NextPatch,.PckDirFName)=0 goto AllDone
|
---|
225 |
|
---|
226 | More set %=1
|
---|
227 | write "Do more patch installations in this package" do YN^DICN write !!
|
---|
228 | if %=1 goto DNP1
|
---|
229 | AllDone
|
---|
230 | quit
|
---|
231 |
|
---|
232 | DoIENS(NextIENS,NextPatch,PckDirFName)
|
---|
233 | ;"Purpose: install patch, given IENS to it's entry in 22709.11
|
---|
234 | ;"Input: NextIENS -- IENS for entry in 22709.11
|
---|
235 | ;" NextPatch -- Patch Name of patch to be applied.
|
---|
236 | ;"Results: 1 if OK, 0 if problem.
|
---|
237 |
|
---|
238 | new abort set abort=0
|
---|
239 | if NextPatch'="" do
|
---|
240 | . write "Next patch to install is: ",?50,NextPatch,!
|
---|
241 | else do goto DNPDone
|
---|
242 | . write "No more patches available for this package.",!
|
---|
243 | . set abort=1
|
---|
244 | . quit; ;"//kt fix below later...
|
---|
245 | . write "View list of all patches for this package on ftp server"
|
---|
246 | . set %=2
|
---|
247 | . do YN^DICN write !
|
---|
248 | . if %=1 if $$EditHFSFile^TMGKERNL(PckDirFName)
|
---|
249 | . if %=-1 set restart=1 quit
|
---|
250 | new Option set Option("VERBOSE")=1
|
---|
251 | set result=$$EnsureLocal^TMGPAT2(NextIENS,.Info,.Msg,.Option)
|
---|
252 | if result=0 do goto DNPDone
|
---|
253 | . do AddMsg^TMGPAT2("Unable to find patch on local file system.",1,Msg)
|
---|
254 | . if $$ShowMsg^TMGPAT2(.Msg)
|
---|
255 |
|
---|
256 | new % set %=1
|
---|
257 | if $get(Info("KID FILE"))'="" do PAnalyze^TMGPAT4(.Info,.Option)
|
---|
258 | if $get(Info("TEXT FILE"))'="" do goto:(abort=1) DNPDone
|
---|
259 | . do Analyze^TMGPAT4(.Info,.Option)
|
---|
260 | . new tempMsg
|
---|
261 | . do ShowAnalysis^TMGPAT4(.Info,.tempMsg)
|
---|
262 | . if $$ShowMsg^TMGPAT2(.tempMsg,1)
|
---|
263 | . kill tempMsg
|
---|
264 | . new FilePathName set FilePathName=$get(Info("PATH"))_$get(Info("TEXT FILE"))
|
---|
265 | . set %=1
|
---|
266 | . write "View INFO FILE for patch" do YN^DICN write !
|
---|
267 | . if %=-1 quit
|
---|
268 | . if %=1 if $$EditHFSFile^TMGKERNL(FilePathName)
|
---|
269 | . if $get(Info("KID FILE"))="" do
|
---|
270 | . . new FName set FName=""
|
---|
271 | . . if $get(Info("MULTI-PATCH","FILENAME"))'="" do
|
---|
272 | . . . set Info("KID FILE")=Info("MULTI-PATCH","FILENAME")
|
---|
273 | . . else if ($$ListCt^TMGMISC($name(Info("PATCH CATEGORY")))=1)&($data(Info("PATCH CATEGORY","Informational"))) quit
|
---|
274 | . . else if $data(Info("MISC KID FILES")) do
|
---|
275 | . . . write !,"No typical KIDS file found for this patch. However, one or more filenames",!
|
---|
276 | . . . write "were scraped from the TEXT file. Having read the TEXT file, see if one of these",!
|
---|
277 | . . . write "names is correct.",!!
|
---|
278 | . . . set Info("KID FILE")=$$PickFile($name(Info("MISC KID FILES")))
|
---|
279 | . . if $get(Info("KID FILE"))'="" set Info("TEXT ONLY")=0
|
---|
280 | . . set FName=$get(Info("KID FILE"))
|
---|
281 | . . if FName="" quit
|
---|
282 | . . set %=2
|
---|
283 | . . write !,"Attempt to download ",FName," from ftp.va.gov?",!
|
---|
284 | . . write "NOTE: if this file doesn't exist on the server, then the process will HANG.",!
|
---|
285 | . . write "If this happens, then use a utility to abort process #",$J," from OS prompt.",!
|
---|
286 | . . write "Download '",FName,"'" do YN^DICN write !
|
---|
287 | . . if %'=1 quit
|
---|
288 | . . if $$DownloadPatch^TMGPAT2(FName,"ftp://",.Option,.tempMsg,.Info)=0
|
---|
289 | . . . write "ERROR: Can't download file: ",Info("KID FILE")," from ftp server.",!
|
---|
290 | . . . do PressToCont^TMGUSRIF
|
---|
291 | . . . ;"handle error here...
|
---|
292 | . . if $$ShowMsg^TMGPAT2(.tempMsg,1)
|
---|
293 | if %=-1 goto DNPDone
|
---|
294 |
|
---|
295 | if $data(Info("STILL NEEDED")) do goto:(abort=1) DNPDone
|
---|
296 | . new pArray set pArray=$name(Info("STILL NEEDED"))
|
---|
297 | . do StoreMissing^TMGPAT3(PckInit,pArray)
|
---|
298 | . write "It seems that the system is not ready for this patch.",!
|
---|
299 | . write "(However, sometimes this can be ignored and one can proceed anyway.)",!
|
---|
300 | . set %=1
|
---|
301 | . write "Quit this patch and try another" do YN^DICN write !
|
---|
302 | . if %'=2 set abort=1
|
---|
303 |
|
---|
304 | if $get(Info("TEXT ONLY"))=1 do goto DNPDone
|
---|
305 | . write "This 'patch' doesn't have a corresponding KID file.",!
|
---|
306 | . write "Perhaps it was informational only. I'm not smart enough to figure that out.",!
|
---|
307 | . write "If you didn't read the INFO FILE, then answer NO, and loop back and read it.",!
|
---|
308 | . set %=2
|
---|
309 | . write "Ready to consider the patch 'installed'" do YN^DICN write !
|
---|
310 | . if %'=1 quit
|
---|
311 | . if $$MakePatchEntry^TMGPAT2(NextPatch,.Msg)
|
---|
312 |
|
---|
313 | if $get(Info("KID FILE"))="" do goto DNPDone
|
---|
314 | . write "?? No name for KID file ??",!
|
---|
315 |
|
---|
316 | set %=1
|
---|
317 | write "Ready to load patch "_Info("KID FILE")_" into system" do YN^DICN write !
|
---|
318 | if %'=1 set %=-1 goto DNPDone
|
---|
319 | new result set result=$$GO(.Option,.Info,.Msg)
|
---|
320 |
|
---|
321 | quit result
|
---|
322 |
|
---|
323 |
|
---|
324 | GO(Option,Info,Msg)
|
---|
325 | ;"Purpose: Entry point to allow automatic loading and installation of a patch.
|
---|
326 | ;"Input: Option -- PASS BY REFERENCE. Can be an empty array.
|
---|
327 | ;" Info -- PASS BY REFERENCE.
|
---|
328 | ;" Msg -- PASS BY REFERNCE.
|
---|
329 | ;"Results: 1 if OK, 0 if problem.
|
---|
330 |
|
---|
331 | new abort set abort=0
|
---|
332 | set Option("HFSNAME")=$get(Info("PATH"))_Info("KID FILE")
|
---|
333 | set Option("FORCE CONT LOAD")=1
|
---|
334 | set Option("DO ENV CHECK")=1
|
---|
335 | do EN1^TMGXPDIL(.Option,.Msg)
|
---|
336 | new errorFound set errorFound=$$ShowMsg^TMGPAT2(.Msg,1)
|
---|
337 | if errorFound goto DNP3
|
---|
338 | new InstallName set InstallName=$get(Option("INSTALL NAME"))
|
---|
339 | if InstallName="" do goto DNPDone
|
---|
340 | . write "No installation name found. Aborting.",!
|
---|
341 | . set abort=1
|
---|
342 | new % set %=1
|
---|
343 | write "Proceed with installation" do YN^DICN write !
|
---|
344 | kill Msg
|
---|
345 | new Option ;"... FINISH..., add presets to avoid user interactivity later...
|
---|
346 | set Option("Want to DISABLE Scheduled Options, Menu Options, and Protocols","DEFAULT")="NO"
|
---|
347 | set Option("Want KIDS to INHIBIT LOGONs during the install","DEFAULT")="NO"
|
---|
348 | set Option("Want KIDS to Rebuild Menu Trees Upon Completion of Install","DEFAULT")="NO"
|
---|
349 | if %=1 do EN^TMGXPDI(InstallName,.Option,.Msg)
|
---|
350 | if $$ShowMsg^TMGPAT2(.Msg,1)
|
---|
351 | DNP3
|
---|
352 | new tempNull
|
---|
353 | if $data(PckInit) do
|
---|
354 | . do StoreMissing^TMGPAT3(PckInit,"tempNull") ;"clear out pending patches...
|
---|
355 | else goto DNPDone
|
---|
356 |
|
---|
357 | set %=1
|
---|
358 | write "Clean up local files for this patch" do YN^DICN write !
|
---|
359 | if %=-1 goto DNPDone
|
---|
360 | if %=1 do
|
---|
361 | . new path set path=$get(Info("PATH"))
|
---|
362 | . new fileName set fileName=$get(Info("KID FILE"))
|
---|
363 | . if fileName'="" if $$DelFile^TMGIOUTL(path_fileName)
|
---|
364 | . set fileName=$get(Info("TEXT FILE"))
|
---|
365 | . if fileName'="" if $$DelFile^TMGIOUTL(path_fileName)
|
---|
366 |
|
---|
367 | DNPDone quit (abort=0)
|
---|
368 |
|
---|
369 |
|
---|
370 | LOAD
|
---|
371 | ;"Purpose: Entry point to allow manual loading of a patch (like old way, but using new code)
|
---|
372 | do Logo^TMGPAT1 write !
|
---|
373 | new FPName,FPath,FName,Msg,Option,Info
|
---|
374 | set FPName=$$GetFName^TMGIOUTL("Select Patch to Load",,,,.FPath,.FName)
|
---|
375 | if (FPName'="")&(FPName'="^") do
|
---|
376 | . set Info("PATH")=FPath,Info("KID FILE")=FName
|
---|
377 | . new result set result=$$GO(.Option,.Info,.Msg)
|
---|
378 | quit
|
---|
379 |
|
---|
380 |
|
---|
381 | GetPckVer(PckInit,Ver)
|
---|
382 | ;"Purpose: query user for package, and desired version
|
---|
383 | ;"Input: PckInit - PASS BY REFERENCE. An OUT PARAMETER. The package initials, e.g. 'DI' in the case of filemant
|
---|
384 | ;" Ver -- PASS BY REFERENCE. An OUT PARAMETER. The version of the package to match.
|
---|
385 | ;"results: none; (if user aborted, Ver="^")
|
---|
386 |
|
---|
387 | set Ver="^"
|
---|
388 | new DIC,X,Y
|
---|
389 | set DIC=9.4,DIC(0)="MAEQ" ;"ask for package name
|
---|
390 | do ^DIC write !
|
---|
391 | if +Y'>0 goto GPVDone
|
---|
392 | new Package set Package=$piece(Y,"^",2)
|
---|
393 | set PckInit=$piece($get(^DIC(9.4,+Y,0)),"^",2)
|
---|
394 | if PckInit="" do goto GPVDone
|
---|
395 | . write "Error. Unable to obtain package prefix.",!
|
---|
396 | do AskVer(PckInit,.Ver)
|
---|
397 |
|
---|
398 | GPVDone quit
|
---|
399 |
|
---|
400 | AskVer(PckInit,Ver,Package)
|
---|
401 | ;"Purpose: query user for desired version from specified package
|
---|
402 | ;"Input: PckInit - The package initials, e.g. 'DI' in the case of filemant
|
---|
403 | ;" Ver -- PASS BY REFERENCE. An OUT PARAMETER. The version of the package to match.
|
---|
404 | ;" Package -- OPTIONAL. Name of Package. Default is same as PckInit
|
---|
405 | ;"results: none; (if user aborted, Ver="^")
|
---|
406 |
|
---|
407 | new VerArray
|
---|
408 | do GetVers(PckInit,.VerArray)
|
---|
409 | if $data(VerArray)=0 do goto AVrDone
|
---|
410 | . write "Error. No version number available.",!
|
---|
411 | if $get(Package)="" set Package=PckInit
|
---|
412 | ;
|
---|
413 | new Menu,i,Usr
|
---|
414 | set Menu(0)="Select Version of "_Package
|
---|
415 | set Ver="",i=0
|
---|
416 | for set Ver=$order(VerArray(Ver)) quit:(Ver="") do
|
---|
417 | . set i=i+1
|
---|
418 | . new tempPatch set tempPatch=PckInit_"*"_Ver_"*1"
|
---|
419 | . new count set count=+$$Rpt1Avail^TMGPAT3(tempPatch)
|
---|
420 | . set Menu(i)="Version "_Ver_" ("_count_" patches pending)"_$C(9)_Ver
|
---|
421 | if i=1 set Ver=$order(VerArray("")) ;"must be only one option, so skip menu
|
---|
422 | else do
|
---|
423 | . set Ver=$$Menu^TMGUSRIF(.Menu,"^")
|
---|
424 | ;
|
---|
425 | AVrDone quit
|
---|
426 |
|
---|
427 |
|
---|
428 | GetPVIEN(PckInit,Ver,IEN9d4,IEN9d49)
|
---|
429 | ;"Purpose: to convert PckInit and Ver into IEN's for file 9.4 ad 9.49
|
---|
430 | ;"Input: PckInit - . The package initials, e.g. 'DI' in the case of filemant
|
---|
431 | ;" Ver -- The version of the package to match.
|
---|
432 | ;" IEN9d4 - PASS BY REFERENCE. The IEN in 9.4 to return
|
---|
433 | ;" IEN9d49 -- PASS BY REFERENCE. The IEN in 9.49 to return
|
---|
434 | ;"result: 1 if OK, 0 if not found.
|
---|
435 |
|
---|
436 | new result set result=0
|
---|
437 | ;
|
---|
438 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
439 | if IEN9d4'>0 goto GPVIDne
|
---|
440 | new DIC,X,Y
|
---|
441 | set DIC="^DIC(9.4,"_IEN9d4_",22,"
|
---|
442 | set DIC(0)="M"
|
---|
443 | set X=Ver
|
---|
444 | do ^DIC
|
---|
445 | set IEN9d49=+Y
|
---|
446 | if IEN9d49'>0 goto GPVIDne
|
---|
447 | set result=1
|
---|
448 | ;
|
---|
449 | GPVIDne quit result
|
---|
450 |
|
---|
451 |
|
---|
452 | GetLastPackage(PckInit,Ver)
|
---|
453 | ;"Purpose: for given package initials, return the last patch applied
|
---|
454 | ;" This searches the PACKAGE file
|
---|
455 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
---|
456 | ;" Ver -- the version of the package to match.
|
---|
457 | ;"Results: returns e.g. 'DI*22.0*140 SEQ# 123'
|
---|
458 | ;" or "" if problem or not found.
|
---|
459 |
|
---|
460 | new result set result=""
|
---|
461 | set Ver=$get(Ver)
|
---|
462 | set PckInit=$get(PckInit)
|
---|
463 | if (PckInit="")!(Ver="") goto GLPDone
|
---|
464 | new IEN9d4,IEN9d49
|
---|
465 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
466 | if IEN9d4'>0 goto GLPDone
|
---|
467 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
468 | if IEN9d49'>0 goto GLPDone
|
---|
469 |
|
---|
470 | new i,array
|
---|
471 | set i=""
|
---|
472 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="") do
|
---|
473 | . new patchNum set patchNum=$piece(i," ",1)
|
---|
474 | . new seqNum set seqNum=$piece(i,"SEQ #",2)
|
---|
475 | . new tempName set tempName=i
|
---|
476 | . if seqNum="" do
|
---|
477 | . . set tempName=PckInit_"*"_Ver_"*"_patchNum
|
---|
478 | . . set tempName=$$GetSeq^TMGPAT4(tempName)
|
---|
479 | . . set seqNum=$piece(tempName,"SEQ #",2)
|
---|
480 | . . if seqNum="" quit
|
---|
481 | . . new IEN9d4901 set IEN9d4901=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i,""))
|
---|
482 | . . ;"write "The PACKAGE file entry for patch "_PckInit_"*"_Ver_"*"_patchNum_" doesn't have a SEQ #",!
|
---|
483 | . . ;"write "By comparing this to patch files available on ftp.va.gov network site, it",!
|
---|
484 | . . ;"write "appears that this patch should be SEQ #",tempName,!
|
---|
485 | . . ;"new % set %=1
|
---|
486 | . . ;"write "Shall I correct this in the PACKAGE file" do YN^DICN write !
|
---|
487 | . . ;"if %'=1 quit
|
---|
488 | . . new TMGFDA,TMGMSG
|
---|
489 | . . set TMGFDA(9.4901,IEN9d4901_","_IEN9d49_","_IEN9d4_",",.01)=patchNum_" SEQ #"_seqNum
|
---|
490 | . . do FILE^DIE("K","TMGFDA","TMGMSG")
|
---|
491 | . . ;"do ShowIfDIERR^TMGDEBUG(.TMGMSG)
|
---|
492 | . ;"if seqNum is still "" at this point, it won't find the patch, could be bug...
|
---|
493 | . set seqNum=$$RJ^XLFSTR(seqNum,6,"0")
|
---|
494 | . if tempName["*" set tempName=$piece(tempName,"*",3)
|
---|
495 | . set array(seqNum)=tempName
|
---|
496 |
|
---|
497 | set i=$order(array(""),-1)
|
---|
498 | if i'="" set result=PckInit_"*"_Ver_"*"_$get(array(i))
|
---|
499 | else set result=PckInit_"*"_Ver_"*0 SEQ #0"
|
---|
500 | ;"else set result=$piece($get(^DIC(9.4,IEN9d4,0)),"^",1)_" SEQ #0"
|
---|
501 |
|
---|
502 | GLPDone
|
---|
503 | quit result
|
---|
504 |
|
---|
505 | GetLastInst(PckInit,Ver,InstIEN)
|
---|
506 | ;"Purpose: for given package initials, return the last patch applied
|
---|
507 | ;" This searches the INSTALL file
|
---|
508 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
---|
509 | ;" Ver -- the version of the package to match.
|
---|
510 | ;" InstIEN -- Optional. Pass by Reference, an OUT PARAMETER.
|
---|
511 | ;"Results: returns last patch + 'SEQ# 123' (123 is example)
|
---|
512 | ;" or "" if problem or not found.
|
---|
513 |
|
---|
514 | new result set result=""
|
---|
515 | new array
|
---|
516 | set Ver=$get(Ver)
|
---|
517 | new i set i=$get(PckInit)
|
---|
518 | if (i="")!(Ver="") goto GLIDone
|
---|
519 | new done set done=0
|
---|
520 | for set i=$order(^XPD(9.7,"B",i)) quit:(i="")!done do
|
---|
521 | . if $piece(i,"*",1)'=PckInit set done=1 quit
|
---|
522 | . if $piece(i,"*",2)'=Ver quit
|
---|
523 | . new patch set patch=$piece(i,"*",3)
|
---|
524 | . set patch=$$RJ^XLFSTR(patch,6,"0")
|
---|
525 | . new IEN set IEN=$order(^XPD(9.7,"B",i,""))
|
---|
526 | . if IEN=0 quit
|
---|
527 | . new seq set seq=$$GET1^DIQ(9.7,IEN_",",42001)
|
---|
528 | . if seq="" quit
|
---|
529 | . ;"write "SEQ #"_seq_" "_i,!
|
---|
530 | . set array(seq)=i_" SEQ #"_seq_"^"_IEN
|
---|
531 |
|
---|
532 | set i=$order(array(""),-1)
|
---|
533 | set result=$get(array(i))
|
---|
534 | set InstIEN=$piece(result,"^",2)
|
---|
535 | set result=$piece(result,"^",1)
|
---|
536 |
|
---|
537 | if result'="" do
|
---|
538 | . new PatIEN set PatIEN=+$order(^XPD(9.7,"B",result,""))
|
---|
539 | . if PatIEN=0 quit
|
---|
540 | . new Seq set Seq=$$GET1^DIQ(9.7,PatIEN_",",42001)
|
---|
541 | . if Seq="" quit
|
---|
542 | . set result=result_" SEQ #"_Seq
|
---|
543 |
|
---|
544 | GLIDone
|
---|
545 | quit result
|
---|
546 |
|
---|
547 |
|
---|
548 |
|
---|
549 | GetVers(PckInit,VerArray)
|
---|
550 | ;"Purpose: for given package initials, return possible versions
|
---|
551 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
---|
552 | ;" VerArray -- PASS BY REFERENCE -- an OUT PARAMETER. Format
|
---|
553 | ;" VerArray("22")=""
|
---|
554 | ;" VerArray("23")=""
|
---|
555 | ;"Results: none
|
---|
556 |
|
---|
557 | new ver
|
---|
558 | kill VerArray
|
---|
559 | if $get(PckInit)="" goto GVDone
|
---|
560 | new done set done=0
|
---|
561 | new ien9d4 set ien9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(ien9d4'>0) GVDone
|
---|
562 | set ver=""
|
---|
563 | for set ver=$order(^DIC(9.4,ien9d4,22,"B",ver)) quit:(ver="")!done do
|
---|
564 | . if ver'="" set VerArray(ver)=""
|
---|
565 |
|
---|
566 | GVDone quit
|
---|
567 |
|
---|
568 | ;"Discard below later ============================================
|
---|
569 | for set i=$order(^XPD(9.7,"B",i)) quit:(i="")!done do
|
---|
570 | . if i["*" do
|
---|
571 | . . if $piece(i,"*",1)'=PckInit set done=1 quit
|
---|
572 | . . set ver=$piece(i,"*",2)
|
---|
573 | . else do
|
---|
574 | . . new ien set ien=+$order(^XPD(9.7,"B",i,""))
|
---|
575 | . . write i,!
|
---|
576 | . . write "From the above name, please enter version number"
|
---|
577 | . . new DIR set DIR(0)="N^0:999:2" do ^DIR write !
|
---|
578 | . . if $data(DIRUT) set ver="" quit
|
---|
579 | . . set ver=X ;"why doesn't Y return decimals???
|
---|
580 | . . set done=1
|
---|
581 | . if ver'="" set VerArray(ver)=""
|
---|
582 | ;"Discard above later ============================================
|
---|
583 |
|
---|
584 |
|
---|
585 | PickFile(pArray)
|
---|
586 | ;"Purpose: Pick a filename from a list, in a menu
|
---|
587 | ;"Input: pArray -- PASS BY NAME. format:
|
---|
588 | ;" @pArray@(name)=""
|
---|
589 | ;" @pArray@(name)=""
|
---|
590 | ;"Result: the chosen name, or "" if problem.
|
---|
591 |
|
---|
592 | new menu set menu(0)="Select IF one of the following files is the patch file."
|
---|
593 | new count set count=1
|
---|
594 | new name set name=""
|
---|
595 | for set name=$order(@pArray@(name)) quit:(name="") do
|
---|
596 | . set menu(count)=name_$C(9)_name
|
---|
597 | . set count=count+1
|
---|
598 | set menu(count)="(None of these / Cancel)"_$C(9)_"@"
|
---|
599 | set count=count+1
|
---|
600 |
|
---|
601 | set result=$$Menu^TMGUSRIF(.menu)
|
---|
602 | if "@^"[result set result=""
|
---|
603 | quit result |
---|