[796] | 1 | TMGPAT2 ;TMG/kst/Patching tools Suport;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 | ;"MAKFRESH(PckInit,Msg,PckDirFName) --ensure that the Package list of files avilable on server is fresh
|
---|
| 12 | ;"RefreshPackge(PckInit,.Msg,NeedsRefresh,PckDirFName) -- query server for one package, and refresh info stored in TMG REMOTE PATCH SOURCE file
|
---|
| 13 | ;"GetNextIENS(LastPatch,NextPatchName) -- return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
| 14 | ;"GetIENS(PatchName) -- Given patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
| 15 | ;"GetIENS2(PatchName) -- Given partial patch name, return IENS in file 22709.01
|
---|
| 16 | ;"FORCEPAT -- All user to enter a patch entry
|
---|
| 17 | ;"IsInstalled(PatchName) -- return if a given patch has already been installed.
|
---|
| 18 | ;"ParsePatchName(PatchName,PckInit,Ver,PatchNum,SeqNum) -- parse a patch name into it's composit parts.
|
---|
| 19 | ;"EnsureLocal(IENS,Info,Msg,Option) -- Ensure files downloaded from server and stored locally
|
---|
| 20 | ;"DownloadPatch(PatchName,protocol,Option,Msg,Info) -- Ensure that the Patch has been downloaded from server and stored locally
|
---|
| 21 | ;"MakePatchEntry(PatchName,Msg) -- make pseudo-entries to show that something was processed.
|
---|
| 22 | ;"AddMsg(s,IsError,Msg) -- add a message to Msg Array
|
---|
| 23 | ;"ShowMsg(Msg) -- display the message array
|
---|
| 24 |
|
---|
| 25 | ;"=======================================================================
|
---|
| 26 | ;"Private Functions
|
---|
| 27 | ;"=======================================================================
|
---|
| 28 | ;"EmptyPackage(IEN9d4,Msg) - delete info for Package in file TMG REMOTE PATCH SOURCE
|
---|
| 29 | ;"LoadPackage(IEN9d4,Array,protocol,Msg,SomeAdded) -- load info for Package info file TMG REMOTE PATCH SOURCE
|
---|
| 30 | ;"LoadOne(PckIEN,Ver,PatchNum,SeqNum,RemoteURL,Msg) -- file one entry info TMG REMOTE PATCH SOURCE
|
---|
| 31 |
|
---|
| 32 | ;"=======================================================================
|
---|
| 33 | ;"=======================================================================
|
---|
| 34 |
|
---|
| 35 | MAKFRESH(PckInit,Msg,PckDirFName)
|
---|
| 36 | ;"Purpose: to ensure that the Package list of files avilable on server is fresh
|
---|
| 37 | ;"Input: PckInit -- this is the namespace of the package to get patches for, e.g. 'DI' for fileman
|
---|
| 38 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 39 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 40 | ;" Msg("ERROR")=count of last error
|
---|
| 41 | ;" Message are store in Msg(x)=Message
|
---|
| 42 | ;" Msg=count of last message+1
|
---|
| 43 | ;" PckDirFName -- Optional. PASS BY REFERNCE, an OUT PARAMETER. Filled with HFS filename of file
|
---|
| 44 | ;"Results: none
|
---|
| 45 |
|
---|
| 46 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
| 47 | if IEN9d4'>0 do goto ENSFDone
|
---|
| 48 | . do AddMsg("Can't find PACKAGE named '"_PckInit_"'",1,.Msg)
|
---|
| 49 | new PckIEN,lastFMDate
|
---|
| 50 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
| 51 | if PckIEN>0 set lastFMDate=$piece($get(^TMG(22709,PckIEN,2)),"^",1)
|
---|
| 52 | else set lastFMDate=""
|
---|
| 53 | new %,X,X1,X2,NeedsRefresh
|
---|
| 54 | set NeedsRefresh=0
|
---|
| 55 | if lastFMDate'="" do
|
---|
| 56 | . do NOW^%DTC ;"returns date in X
|
---|
| 57 | . set X1=lastFMDate,X2=X
|
---|
| 58 | . do ^%DTC
|
---|
| 59 | . if X>7 set NeedsRefresh=1 ;"hard code in fresh if > 7 days since last scan.
|
---|
| 60 | else set NeedsRefresh=1
|
---|
| 61 | if $$RefreshPackge(PckInit,.Msg,NeedsRefresh,.PckDirFName)
|
---|
| 62 | ENSFDone
|
---|
| 63 | quit
|
---|
| 64 |
|
---|
| 65 | RefreshPackge(PckInit,Msg,NeedsRefresh,PckDirFName,Option)
|
---|
| 66 | ;"Purpose: To query server for one package, and refresh info stored in TMG REMOTE PATCH SOURCE file
|
---|
| 67 | ;"Input: PckInit -- this is the namespace of the package to get patches for, e.g. 'DI' for fileman
|
---|
| 68 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 69 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 70 | ;" Msg("ERROR")=count of last error
|
---|
| 71 | ;" Message are store in Msg(x)=Message
|
---|
| 72 | ;" Msg=count of last message+1
|
---|
| 73 | ;" NeedsRefresh -- 0 if refreshing not needed (just return PckDirFName, but ensure file exists)
|
---|
| 74 | ;" PckDirFName -- Optional. PASS BY REFERANCE, an OUT PARAMETER. Filled with HFS filename of file
|
---|
| 75 | ;" Option -- Optional. PASS BY REFERANCE.
|
---|
| 76 | ;" Option("VERBOSE")=1 puts out text to console. (1 is default value)
|
---|
| 77 | ;"Result : 1=success, 0=failure
|
---|
| 78 |
|
---|
| 79 | new Array,result
|
---|
| 80 | new verbose set verbose=+$get(Option("VERBOSE"),1)
|
---|
| 81 | set NeedsRefresh=+$get(NeedsRefresh)
|
---|
| 82 | if NeedsRefresh,verbose write "Fetching list of available "_PckInit_" patches from VA ftp server..."
|
---|
| 83 | set result=$$GetPckList^TMGKERNL(PckInit,.Array,.NeedsRefresh,.PckDirFName)
|
---|
| 84 | if NeedsRefresh,verbose write " Done.",!
|
---|
| 85 | if $get(NeedsRefresh)'>0 goto RPDone
|
---|
| 86 | if result=0 goto RPDone
|
---|
| 87 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
| 88 | if IEN9d4'>0 do goto RPDone
|
---|
| 89 | . do AddMsg("Can't find PACKAGE named '"_PckInit_"'",1,.Msg)
|
---|
| 90 | new SomeAdded
|
---|
| 91 | set result=$$LoadPackage(IEN9d4,.Array,"ftp://",.Msg,.SomeAdded)
|
---|
| 92 | RPDone
|
---|
| 93 | quit result
|
---|
| 94 |
|
---|
| 95 |
|
---|
| 96 | EmptyPackage(IEN9d4,Msg)
|
---|
| 97 | ;"Purpose: to delete info for Package in file TMG REMOTE PATCH SOURCE
|
---|
| 98 | ;"Input: IEN9d4 -- IEN in 9.4 to get patches for
|
---|
| 99 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 100 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 101 | ;" Msg("ERROR")=count of last error
|
---|
| 102 | ;" Message are store in Msg(x)=Message
|
---|
| 103 | ;" Msg=count of last message+1
|
---|
| 104 |
|
---|
| 105 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
| 106 | if PckIEN=0 goto EPDone
|
---|
| 107 | new TMGFDA,TMGMSG
|
---|
| 108 | set TMGFDA(22709,PckIEN_",",.01)="@"
|
---|
| 109 | do FILE^DIE("EK","TMGFDA","TMGMSG")
|
---|
| 110 | if $data(TMGMSG("DIERR")) do
|
---|
| 111 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 112 |
|
---|
| 113 | EPDone quit
|
---|
| 114 |
|
---|
| 115 |
|
---|
| 116 | LoadPackage(IEN9d4,Array,protocol,Msg,SomeAdded)
|
---|
| 117 | ;"Purpose: to load info for Package info file TMG REMOTE PATCH SOURCE
|
---|
| 118 | ;"Input: IEN9d4 -- IEN in 9.4 to get patches for
|
---|
| 119 | ;" Array -- This is file with available filepaths, as returned from GetPckList
|
---|
| 120 | ;" protocol -- OPTIONAL. Default is 'ftp://'
|
---|
| 121 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 122 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 123 | ;" Msg("ERROR")=count of last error
|
---|
| 124 | ;" Message are store in Msg(x)=Message
|
---|
| 125 | ;" Msg=count of last message+1
|
---|
| 126 | ;" SomeAdded -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
| 127 | ;" set to 1 if some added, otherwise 0
|
---|
| 128 | ;"Result : 2=patch added, 1=no problems, 0=failure or error occured
|
---|
| 129 |
|
---|
| 130 | new result set result=1
|
---|
| 131 | set SomeAdded=0
|
---|
| 132 | set protocol=$get(protocol,"ftp://")
|
---|
| 133 | set IEN9d4=+$get(IEN9d4)
|
---|
| 134 | if IEN9d4'>0 do goto LPDone
|
---|
| 135 | . do AddMsg("Can't find record #"_IEN9d4_" in INSTALL file.",1,.Msg)
|
---|
| 136 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
| 137 | new TMGFDA,TMGMSG,TMGIEN,X,%
|
---|
| 138 | do NOW^%DTC ;"output in %
|
---|
| 139 | if PckIEN>0 do
|
---|
| 140 | . set TMGFDA(22709,PckIEN_",",2)=%
|
---|
| 141 | . do FILE^DIE("K","TMGFDA","TMGMSG")
|
---|
| 142 | else do
|
---|
| 143 | . set TMGFDA(22709,"+1,",.01)=IEN9d4
|
---|
| 144 | . set TMGFDA(22709,"+1,",2)=% ;"the time downloaded
|
---|
| 145 | . do UPDATE^DIE("K","TMGFDA","TMGIEN","TMGMSG")
|
---|
| 146 | . set PckIEN=$get(TMGIEN(1))
|
---|
| 147 | if $data(TMGMSG("DIERR")) do
|
---|
| 148 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 149 | if PckIEN'>0 goto LPDone
|
---|
| 150 |
|
---|
| 151 | new i set i=0 ;"skip first line, a header line
|
---|
| 152 | for set i=$order(Array(i)) quit:(i="") do
|
---|
| 153 | . new Name,Path,FullNamePath,Ver,PatchNum,SeqNum
|
---|
| 154 | . set FullNamePath=$get(Array(i)) quit:FullNamePath=""
|
---|
| 155 | . do SplitFNamePath^TMGIOUTL(FullNamePath,.Path,.Name,"/")
|
---|
| 156 | . if (Path="")!(Name="") quit
|
---|
| 157 | . new UName set UName=$$UP^XLFSTR(Name)
|
---|
| 158 | . if UName?2.4A1"_"1.4N1"_"0.1"P"1.N1".KID" do ;"e.g. DG_53_P481.KID or EAS_1_47.KID
|
---|
| 159 | . . set Ver=$piece($piece(Name,"_",2),"_",1)
|
---|
| 160 | . . new verIEN set verIEN=+$order(^TMG(22709,PckIEN,1,"C",Ver,""))
|
---|
| 161 | . . if verIEN=0 set Ver="" quit
|
---|
| 162 | . . set Ver=$piece($get(^TMG(22709,PckIEN,1,verIEN,0)),"^",1)
|
---|
| 163 | . . if Ver="" quit
|
---|
| 164 | . . set PatchNum=$piece($piece(Name,"_",3),".",1)
|
---|
| 165 | . . if PatchNum?1A.N set PatchNum=$extract(PatchNum,2,99)
|
---|
| 166 | . . set SeqNum="" ;"signal for no seq number provided
|
---|
| 167 | . else do
|
---|
| 168 | . . set Ver=$piece($piece(Name,"_",1),"-",2) quit:(Ver="")
|
---|
| 169 | . . if Ver?.N1(1"p",1"P").N set Ver=$translate(Ver,"Pp","..")
|
---|
| 170 | . . set SeqNum=$piece($piece(Name,"_",2),"-",2) quit:(SeqNum="")
|
---|
| 171 | . . set PatchNum=$piece($piece(Name,"_",3),"-",2) quit:(PatchNum="")
|
---|
| 172 | . . set PatchNum=$piece(PatchNum,".",1) quit:(PatchNum="")
|
---|
| 173 | . if Ver="" do quit
|
---|
| 174 | . . do AddMsg("Unable to process file name: "_Name_". Couldn't determine version number.",1,.Msg)
|
---|
| 175 | . ;"if SeqNum="" do quit ;Removed because sometimes the sequence # comes from the TXT file, not the patch file.
|
---|
| 176 | . ;". do AddMsg("Unable to process file name: "_Name_". Couldn't determine sequence number.",1,.Msg)
|
---|
| 177 | . if PatchNum="" do quit
|
---|
| 178 | . . do AddMsg("Unable to process file name: "_Name_". Couldn't determine patch number.",1,.Msg)
|
---|
| 179 | . new tempResult
|
---|
| 180 | . set tempResult=$$LoadOne(PckIEN,Ver,PatchNum,SeqNum,protocol_FullNamePath)
|
---|
| 181 | . if tempResult=2 set SomeAdded=1
|
---|
| 182 |
|
---|
| 183 | LPDone
|
---|
| 184 | quit result
|
---|
| 185 |
|
---|
| 186 |
|
---|
| 187 | LoadOne(PckIEN,Ver,PatchNum,SeqNum,RemoteURL,Msg)
|
---|
| 188 | ;"Purpose: to file one entry info TMG REMOTE PATCH SOURCE
|
---|
| 189 | ;" This doesn't actually get the file from the server, just store
|
---|
| 190 | ;" the directory info, for later retrieval
|
---|
| 191 | ;"Input: PckIEN -- the IEN in TMG REMOTE PATCH SOURCE for Package
|
---|
| 192 | ;" Ver -- the version of the patch
|
---|
| 193 | ;" PatchNum -- the patch number
|
---|
| 194 | ;" SeqNum -- the patch sequence number (the release sequence number) (if provided)
|
---|
| 195 | ;" RemoteURL -- The protocol_remoteURL of the patch on the server
|
---|
| 196 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 197 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 198 | ;" Msg("ERROR")=count of last error
|
---|
| 199 | ;" Message are store in Msg(x)=Message
|
---|
| 200 | ;" Msg=count of last message+1
|
---|
| 201 | ;"Result : 1=success, 0=failure
|
---|
| 202 |
|
---|
| 203 | new result set result=0 ;"default to failure
|
---|
| 204 | set PckIEN=+$get(PckIEN) if PckIEN'>0 goto LODone
|
---|
| 205 | set Ver=$get(Ver) if Ver="" goto LODone
|
---|
| 206 | if Ver'["." set Ver=Ver_".0"
|
---|
| 207 | set PatchNum=$get(PatchNum) if PatchNum="" goto LODone
|
---|
| 208 | set SeqNum=$get(SeqNum) ;"OK if no sequence number
|
---|
| 209 | new VerIEN set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
| 210 | if VerIEN'>0 do
|
---|
| 211 | . new TMGFDA,TMGIEN,TMGMSG
|
---|
| 212 | . set TMGFDA(22709.01,"+1,"_PckIEN_",",".01")=Ver
|
---|
| 213 | . set TMGFDA(22709.01,"+1,"_PckIEN_",",".02")=$translate(Ver,".","") ;"synonym
|
---|
| 214 | . do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
| 215 | . if $data(TMGMSG("DIERR")) do
|
---|
| 216 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 217 | . set VerIEN=+$get(TMGIEN(1))
|
---|
| 218 | if VerIEN'>0 goto LODone
|
---|
| 219 | new patchIEN set patchIEN=+$order(^TMG(22709,PckIEN,1,VerIEN,1,"B",PatchNum,""))
|
---|
| 220 | if patchIEN'>0 do
|
---|
| 221 | . new TMGFDA,TMGIEN,TMGMSG
|
---|
| 222 | . set TMGFDA(22709.11,"+1,"_VerIEN_","_PckIEN_",",".01")=PatchNum
|
---|
| 223 | . do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
| 224 | . if $data(TMGMSG("DIERR")) do
|
---|
| 225 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 226 | . set patchIEN=+$get(TMGIEN(1))
|
---|
| 227 | . set result=2 ;"something added
|
---|
| 228 | if patchIEN'>0 goto LODone
|
---|
| 229 | new TMGFDA,TMGMSG
|
---|
| 230 | new Ext set Ext=$piece(RemoteURL,".",$length(RemoteURL,"."))
|
---|
| 231 |
|
---|
| 232 | new spec
|
---|
| 233 | set spec("'")="'\''",spec("*")="'\*'",spec("&")="'\&'",spec("?")="'\?'"
|
---|
| 234 | set spec("\ ")=" "
|
---|
| 235 | set RemoteURL=$$REPLACE^XLFSTR(RemoteURL,.spec)
|
---|
| 236 |
|
---|
| 237 | new field
|
---|
| 238 | if $$UP^XLFSTR(Ext)="TXT" set field=1.5
|
---|
| 239 | else set field=1
|
---|
| 240 | set TMGFDA(22709.11,patchIEN_","_VerIEN_","_PckIEN_",",field)=RemoteURL
|
---|
| 241 | if SeqNum'="" set TMGFDA(22709.11,patchIEN_","_VerIEN_","_PckIEN_",",".02")=SeqNum
|
---|
| 242 | do FILE^DIE("K","TMGFDA","TMGMSG")
|
---|
| 243 | if $data(TMGMSG("DIERR")) do
|
---|
| 244 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 245 | if $data(TMGMSG("DIERR"))=0 do
|
---|
| 246 | . if result>0 quit
|
---|
| 247 | . set result=1 ;"success
|
---|
| 248 | LODone
|
---|
| 249 | quit result
|
---|
| 250 |
|
---|
| 251 |
|
---|
| 252 | GetNextIENS(LastPatch,NextPatchName)
|
---|
| 253 | ;"Purpose: Given last patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
| 254 | ;" that points to record with information about next appropriate patch.
|
---|
| 255 | ;"Input: LastPatch -- expected Format: e.g. DI*22.0*100 SEQ #123
|
---|
| 256 | ;" NextPatchName -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
| 257 | ;" Will be filled with name of next patch.
|
---|
| 258 | ;"Output: returns IENS to record in 22709.11, or "" if problem.
|
---|
| 259 |
|
---|
| 260 | new result set result=""
|
---|
| 261 | set NextPatchName=""
|
---|
| 262 | if $get(LastPatch)="" goto GNPDone
|
---|
| 263 |
|
---|
| 264 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
| 265 | do ParsePatchName(LastPatch,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
| 266 | if seqNum="" goto GNPDone
|
---|
| 267 |
|
---|
| 268 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
| 269 | if IEN9d4'>0 goto GNPDone
|
---|
| 270 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
| 271 | if PckIEN'>0 goto GNPDone
|
---|
| 272 | new VerIEN set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
| 273 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
| 274 | if VerIEN'>0 goto GNPDone
|
---|
| 275 |
|
---|
| 276 | new patchIEN,nextSeq
|
---|
| 277 | set nextSeq=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",seqNum))
|
---|
| 278 | if nextSeq'>0 goto GNPDone
|
---|
| 279 | set patchIEN=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",nextSeq,""))
|
---|
| 280 | if patchIEN'>0 goto GNPDone
|
---|
| 281 | set result=patchIEN_","_VerIEN_","_PckIEN_","
|
---|
| 282 | set NextPatchName=$piece(LastPatch," ",1)
|
---|
| 283 | new node0 set node0=$get(^TMG(22709,PckIEN,1,VerIEN,1,patchIEN,0))
|
---|
| 284 | new nextPatchNum set nextPatchNum=$piece(node0,"^",1)
|
---|
| 285 | set $piece(NextPatchName,"*",3)=nextPatchNum
|
---|
| 286 | set NextPatchName=NextPatchName_" SEQ #"_nextSeq
|
---|
| 287 |
|
---|
| 288 | GNPDone
|
---|
| 289 | quit result
|
---|
| 290 |
|
---|
| 291 |
|
---|
| 292 | GetIENS(PatchName)
|
---|
| 293 | ;"Purpose: Given patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
| 294 | ;"Input: PatchName -- expected Format: e.g. DI*22.0*100 SEQ #123
|
---|
| 295 | ;"Output: returns IENS to record in 22709.11, or "" if problem.
|
---|
| 296 |
|
---|
| 297 | new result set result=""
|
---|
| 298 | if $get(PatchName)="" goto GIDone
|
---|
| 299 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
| 300 | new IEN9d4,PckIEN,VerIEN,patchIEN
|
---|
| 301 | do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum) goto:(seqNum="") GIDone
|
---|
| 302 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(IEN9d4'>0) GIDone
|
---|
| 303 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,"")) goto:(PckIEN'>0) GIDone
|
---|
| 304 | set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
| 305 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
| 306 | if VerIEN'>0 goto GIDone
|
---|
| 307 | set patchIEN=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",seqNum,"")) goto:(patchIEN'>0) GIDone
|
---|
| 308 | set result=patchIEN_","_VerIEN_","_PckIEN_","
|
---|
| 309 | GIDone
|
---|
| 310 | quit result
|
---|
| 311 |
|
---|
| 312 |
|
---|
| 313 | GetIENS2(PatchName)
|
---|
| 314 | ;"Purpose: Given partial patch name, return IENS in file 22709.01
|
---|
| 315 | ;" (i.e. just patch*ver)
|
---|
| 316 | ;"Input: PatchName -- expected Format: e.g. DI*22.0*.... or DI*22.0
|
---|
| 317 | ;"Output: returns IENS to record in 22709.01, or "" if problem.
|
---|
| 318 |
|
---|
| 319 | new result set result=""
|
---|
| 320 | if $get(PatchName)="" goto GI2Done
|
---|
| 321 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
| 322 | new IEN9d4,PckIEN,VerIEN,patchIEN
|
---|
| 323 | do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
| 324 | if (PckInit="")!(Ver="") goto GI2Done
|
---|
| 325 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(IEN9d4'>0) GI2Done
|
---|
| 326 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,"")) goto:(PckIEN'>0) GI2Done
|
---|
| 327 | set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
| 328 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
| 329 | if VerIEN'>0 goto GI2Done
|
---|
| 330 | set result=VerIEN_","_PckIEN_","
|
---|
| 331 | GI2Done
|
---|
| 332 | quit result
|
---|
| 333 |
|
---|
| 334 |
|
---|
| 335 | EnsureLocal(IENS,Info,Msg,Option)
|
---|
| 336 | ;"Purpose: Ensure that the files have been downloaded from server and stored locally
|
---|
| 337 | ;"Input: IENS -- IENS in 22709.11
|
---|
| 338 | ;" Info -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
| 339 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 340 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 341 | ;" Msg("ERROR")=count of last error
|
---|
| 342 | ;" Message are store in Msg(x)=Message
|
---|
| 343 | ;" Msg=count of last message+1
|
---|
| 344 | ;" Option -- optional. Pass by reference.
|
---|
| 345 | ;" Option("VERBOSE")=1, means messaages also written directly to output
|
---|
| 346 | ;"Output: Info will be filled as follows:
|
---|
| 347 | ;" Info("PATH")=Path in HFS
|
---|
| 348 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
| 349 | ;" Info("TEXT FILE")=HFS filename of .TXT accompanying patch
|
---|
| 350 | ;" Info("TEXT ONLY")=1 if there is a text file, but no .KIDS file
|
---|
| 351 | ;" Info("KID URL")=URL on server for KID file
|
---|
| 352 | ;" Info("TEXT URL")=URL on server for TXT file
|
---|
| 353 | ;"results: 1 if OK, 0 if problem.
|
---|
| 354 |
|
---|
| 355 | new TMGMSG,TMGDATA,TMGFDA
|
---|
| 356 | new verbose set verbose=$get(Option("VERBOSE"))
|
---|
| 357 | new result set result=1 ;"default to success
|
---|
| 358 | kill Info
|
---|
| 359 | if $get(IENS)="" goto ELDone
|
---|
| 360 | do GETS^DIQ(22709.11,IENS,"1;1.5;2;3;4","","TMGDATA","TMGMSG")
|
---|
| 361 | if $data(TMGMSG("DIERR")) do goto ELDone
|
---|
| 362 | . new tempS set tempS=$$GetErrStr^TMGDEBUG(.TMGMSG)
|
---|
| 363 | . do AddMsg(tempS,1,.Msg)
|
---|
| 364 | . if verbose write tempS,!
|
---|
| 365 | new URL set URL=$get(TMGDATA(22709.11,IENS,1))
|
---|
| 366 | set Info("KID URL")=URL
|
---|
| 367 | new textURL set textURL=$get(TMGDATA(22709.11,IENS,1.5))
|
---|
| 368 | set Info("TEXT URL")=textURL
|
---|
| 369 | if URL="" do
|
---|
| 370 | . if textURL'="" set Info("TEXT ONLY")=1 quit
|
---|
| 371 | . new tempS set tempS="No URL found for KIDS patch or accompanying Info text file in FM File #22709.22, IENS="_IENS
|
---|
| 372 | . do AddMsg(tempS,1,.Msg)
|
---|
| 373 | . if verbose write tempS,!
|
---|
| 374 |
|
---|
| 375 | new Path set Path=$get(TMGDATA(22709.11,IENS,2))
|
---|
| 376 | if Path="" do
|
---|
| 377 | . set Path=$get(^TMG("KIDS","PATCH DIR"),"/tmp/")
|
---|
| 378 | . set TMGFDA(22709.11,IENS,2)=Path
|
---|
| 379 | set Info("PATH")=Path
|
---|
| 380 | new Filename set Filename=$get(TMGDATA(22709.11,IENS,3))
|
---|
| 381 | new textFilename set textFilename=$get(TMGDATA(22709.11,IENS,4))
|
---|
| 382 |
|
---|
| 383 | if (Filename'=""),$$FileExists^TMGIOUTL(Path_Filename) do
|
---|
| 384 | . set Info("KID FILE")=Filename
|
---|
| 385 | else if (URL'="") do
|
---|
| 386 | . if verbose write "Downloading KID file from FTP.VA.GOV..."
|
---|
| 387 | . if $$DownloadFile^TMGKERNL(URL,Path)
|
---|
| 388 | . set Filename=$$FNameExtract^TMGIOUTL(URL)
|
---|
| 389 | . if $$FileExists^TMGIOUTL(Path_Filename) do
|
---|
| 390 | . . if $$Dos2Unix^TMGKERNL(Path_Filename)
|
---|
| 391 | . . set TMGFDA(22709.11,IENS,3)=Filename
|
---|
| 392 | . . set Info("KID FILE")=Filename
|
---|
| 393 | . else set result=0
|
---|
| 394 | . if verbose write !
|
---|
| 395 |
|
---|
| 396 | if (textFilename'=""),$$FileExists^TMGIOUTL(Path_textFilename) do
|
---|
| 397 | . set Info("TEXT FILE")=textFilename
|
---|
| 398 | else if (textURL'="") do
|
---|
| 399 | . if verbose write "Downloading TEXT file from FTP.VA.GOV..."
|
---|
| 400 | . if $$DownloadFile^TMGKERNL(textURL,Path)
|
---|
| 401 | . set textFilename=$$FNameExtract^TMGIOUTL(textURL)
|
---|
| 402 | . if $$FileExists^TMGIOUTL(Path_textFilename) do
|
---|
| 403 | . . set TMGFDA(22709.11,IENS,4)=textFilename
|
---|
| 404 | . . set Info("TEXT FILE")=textFilename
|
---|
| 405 | . set result=0
|
---|
| 406 | . if verbose write !
|
---|
| 407 |
|
---|
| 408 | set result=1 ;"success
|
---|
| 409 | ELDone
|
---|
| 410 | kill TMGMSG
|
---|
| 411 | if $data(TMGFDA) do
|
---|
| 412 | . do FILE^DIE("","TMGFDA","TMGMSG")
|
---|
| 413 | . if $data(TMGMSG("DIERR")) do
|
---|
| 414 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 415 | . . set result=0
|
---|
| 416 | . . if verbose write Msg("ERROR",MsgI),!
|
---|
| 417 |
|
---|
| 418 | quit result
|
---|
| 419 |
|
---|
| 420 |
|
---|
| 421 | DownloadPatch(PatchName,protocol,Option,Msg,Info)
|
---|
| 422 | ;"Purpose: Ensure that the Patch has been downloaded from server and stored locally
|
---|
| 423 | ;"Input: PatchName -- the name of the patch to get, e.g. ABC*12.34*1234 [SEQ #123]
|
---|
| 424 | ;" protocol -- OPTIONAL. Default is 'ftp://'
|
---|
| 425 | ;" Option -- optional. Pass by reference.
|
---|
| 426 | ;" Option("VERBOSE")=1, means messaages also written directly to output
|
---|
| 427 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 428 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 429 | ;" Msg("ERROR")=count of last error
|
---|
| 430 | ;" Message are store in Msg(x)=Message
|
---|
| 431 | ;" Msg=count of last message+1
|
---|
| 432 | ;" Info -- PASS BY REFERENCE, an IN and OUT PARAMETER.
|
---|
| 433 | ;" Info("PATH")=Path in HFS
|
---|
| 434 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
| 435 | ;" Info("TEXT FILE")=HFS filename of .TXT accompanying patch
|
---|
| 436 | ;" Info("TEXT ONLY")=1 if there is a text file, but no .KIDS file
|
---|
| 437 | ;" Info("KID URL")=URL on server for KID file
|
---|
| 438 | ;" Info("TEXT URL")=URL on server for TXT file
|
---|
| 439 | ;"Output: Info will be filled as follows:
|
---|
| 440 | ;" Info("PATH")=Path in HFS
|
---|
| 441 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
| 442 | ;"results: 1 if OK, 0 if problem.
|
---|
| 443 |
|
---|
| 444 | new result set result=1
|
---|
| 445 | new seqNum,PckInit,Ver,PatchNum,seqNum,PckDirFName,URL
|
---|
| 446 | new verbose set verbose=($get(Option("VERBOSE"))=1)
|
---|
| 447 | set protocol=$get(protocol,"ftp://")
|
---|
| 448 | if PatchName?2.4N1"*"1.3N.(1"."1.4N)1"*"1.4N do
|
---|
| 449 | . do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
| 450 | else if PatchName?1.4A1"_".E do
|
---|
| 451 | . set PckInit=$piece(PatchName,"_",1)
|
---|
| 452 | else do goto:(result=0) DLPDone
|
---|
| 453 | . new tempName set tempName=$get(Info("TEXT FILE"))
|
---|
| 454 | . if tempName="" set result=0 quit
|
---|
| 455 | . if tempName?1.4A1"_".E do
|
---|
| 456 | . . set PckInit=$piece(tempName,"_",1)
|
---|
| 457 | . else if tempName?1.4A1"-".E do
|
---|
| 458 | . . set PckInit=$piece(tempName,"-",1)
|
---|
| 459 | . if $get(PckInit)="" set result=0
|
---|
| 460 |
|
---|
| 461 | set result=$$RefreshPackge(PckInit,.Msg,0,.PckDirFName) goto:(result=0) DLPDone
|
---|
| 462 | set result=$$FindMultPatch^TMGPAT4(PatchName,PckInit,.Option,.URL,.Info) goto:(result=0) DLPDone
|
---|
| 463 |
|
---|
| 464 | new Filename,Path
|
---|
| 465 | set Path=$get(^TMG("KIDS","PATCH DIR"),"/tmp/")
|
---|
| 466 | set Info("PATH")=Path
|
---|
| 467 | set Filename=$$FNameExtract^TMGIOUTL(URL)
|
---|
| 468 | if $$FileExists^TMGIOUTL(Path_Filename) goto DLPDone
|
---|
| 469 | if verbose write "Downloading "_Filename_" from FTP.VA.GOV...",!
|
---|
| 470 | new spec set spec("\ ")="%20"
|
---|
| 471 | set URL=$$REPLACE^XLFSTR(URL,.spec)
|
---|
| 472 | if $$DownloadFile^TMGKERNL(protocol_URL,Path,0)
|
---|
| 473 | if $$FileExists^TMGIOUTL(Path_Filename)=0 set result=0 goto DLPDone
|
---|
| 474 | if $$Dos2Unix^TMGKERNL(Path_Filename)
|
---|
| 475 | set Info("KID FILE")=Filename
|
---|
| 476 | DLPDone
|
---|
| 477 | quit result
|
---|
| 478 |
|
---|
| 479 | FORCEPAT
|
---|
| 480 | ;"Purpose: All user to enter a patch entry
|
---|
| 481 |
|
---|
| 482 | new PckInit,Ver,DIR,PatchNum,SeqNum,NewPatch
|
---|
| 483 | do GetPckVer^TMGPAT1(.PckInit,.Ver)
|
---|
| 484 | set DIR(0)="N",DIR("A")="Enter PATCH NUMBER"
|
---|
| 485 | do ^DIR write !
|
---|
| 486 | set PatchNum=Y
|
---|
| 487 | if $get(DIRUT) goto FPDone
|
---|
| 488 | set DIR(0)="N",DIR("A")="Enter SEQUENCE NUMBER"
|
---|
| 489 | do ^DIR write !
|
---|
| 490 | set SeqNum=Y
|
---|
| 491 | if $get(DIRUT) goto FPDone
|
---|
| 492 | do ForceP2(.PckInit,.Ver,.PatchNum,.SeqNum)
|
---|
| 493 | quit
|
---|
| 494 |
|
---|
| 495 | ForceP2(PckInit,Ver,PatchNum,SeqNum)
|
---|
| 496 | ;"Purpose: Hack write a patch into Package file, based in componant parts.
|
---|
| 497 | ;"Results: None
|
---|
| 498 |
|
---|
| 499 | new NewPatch set NewPatch=PckInit_"*"_Ver_"*"_PatchNum_" SEQ #"_SeqNum
|
---|
| 500 | new DIR set DIR(0)="Y"
|
---|
| 501 | set DIR("A")="HACK/FORCE an entry in the Package file for: "_NewPatch_" (Y/N)"
|
---|
| 502 | do ^DIR write !
|
---|
| 503 | if $get(DIRUT)!(Y'=1) goto FPDone
|
---|
| 504 | new Msg
|
---|
| 505 | if $$MakePatchEntry^TMGPAT2(NewPatch,.Msg)
|
---|
| 506 | if $$ShowMsg^TMGPAT2(.Msg)
|
---|
| 507 | FPDone
|
---|
| 508 | quit
|
---|
| 509 |
|
---|
| 510 |
|
---|
| 511 | MakePatchEntry(PatchName,Msg)
|
---|
| 512 | ;"Purpose: For times when a patch was informational only, and there was
|
---|
| 513 | ;" no KIDS file to actually install, then this can make pseudo-entries
|
---|
| 514 | ;" to show that something was processed.
|
---|
| 515 | ;"Input: PatchName -- The name of the patch. Eg: DI*22*123 SEQ #456"
|
---|
| 516 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
| 517 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 518 | ;" Msg("ERROR")=count of last error
|
---|
| 519 | ;" Message are store in Msg(x)=Message
|
---|
| 520 | ;" Msg=count of last message+1
|
---|
| 521 |
|
---|
| 522 | ;"Results: 1 if OK, 0 if error
|
---|
| 523 |
|
---|
| 524 | new %,X,result
|
---|
| 525 | new TMGMSG,TMGFDA,TMGIEN
|
---|
| 526 | set result=1
|
---|
| 527 | new justPatch set justPatch=$piece(PatchName," SEQ",1)
|
---|
| 528 | new tempIEN set tempIEN=+$order(^XPD(9.7,"B",justPatch,""))
|
---|
| 529 | if tempIEN>0 goto MPE2 ;"INSTALL entry already made
|
---|
| 530 |
|
---|
| 531 | do NOW^%DTC
|
---|
| 532 | set TMGFDA(9.7,"+1,",.01)=justPatch
|
---|
| 533 | set TMGFDA(9.7,"+1,",.02)=3 ;"2 = status
|
---|
| 534 | set TMGFDA(9.7,"+1,",6)="Text_Only "_PatchName ;"6 = file comment
|
---|
| 535 | set TMGFDA(9.7,"+1,",9)=DUZ ;"9 = Installed by
|
---|
| 536 | set TMGFDA(9.7,"+1,",11)=% ;"11 = Install start time
|
---|
| 537 | set TMGFDA(9.7,"+1,",17)=% ;"17 = Install completion time
|
---|
| 538 | do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
| 539 | if $data(TMGMSG("DIERR")) do
|
---|
| 540 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 541 | . set result=0
|
---|
| 542 |
|
---|
| 543 | MPE2 set PckInit=$piece(PatchName,"*",1)
|
---|
| 544 | set Ver=$piece(PatchName,"*",2)
|
---|
| 545 | if (PckInit="")!(Ver="") set result=0 goto MPEDone
|
---|
| 546 | new IEN9d4,IEN9d49
|
---|
| 547 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
| 548 | if IEN9d4'>0 set result=0 goto MPEDone
|
---|
| 549 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
| 550 | if IEN9d49'>0 set result=0 goto MPEDone
|
---|
| 551 |
|
---|
| 552 | new PatchSeq set PatchSeq=$piece(PatchName,"*",3)
|
---|
| 553 | set tempIEN=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",PatchSeq,""))
|
---|
| 554 | if tempIEN>0 do goto MPE3
|
---|
| 555 | . set TMGIEN(1)=tempIEN
|
---|
| 556 | new IENS set IENS="+1,"_IEN9d49_","_IEN9d4_","
|
---|
| 557 | kill TMGFDA,TMGMSG,TMGIEN
|
---|
| 558 | set TMGFDA(9.4901,IENS,.01)=PatchSeq ;".01=Patch Hx, e.g. 10 SEQ #10
|
---|
| 559 | set TMGFDA(9.4901,IENS,.02)="NOW" ;".02=date applied
|
---|
| 560 | set TMGFDA(9.4901,IENS,.03)="`"_DUZ ;".03=Applied by
|
---|
| 561 | do UPDATE^DIE("E","TMGFDA","TMGIEN","TMGMSG")
|
---|
| 562 | if $data(TMGMSG("DIERR")) do
|
---|
| 563 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 564 | . set result=0
|
---|
| 565 |
|
---|
| 566 | MPE3 if result=0 goto MPEDone
|
---|
| 567 | new TMGWP
|
---|
| 568 | kill TMGFDA,TMGMSG
|
---|
| 569 | set TMGWP(1)="Patch was informational only. No installed code etc."
|
---|
| 570 | set TMGWP(2)="This entry was created as a marker that information was processed."
|
---|
| 571 | set IENS=TMGIEN(1)_","_IEN9d49_","_IEN9d4_","
|
---|
| 572 | do WP^DIE(9.4901,IENS,1,"","TMGWP","TMGMSG")
|
---|
| 573 | if $data(TMGMSG("DIERR")) do
|
---|
| 574 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
| 575 | . set result=0
|
---|
| 576 |
|
---|
| 577 | MPEDone
|
---|
| 578 | quit result
|
---|
| 579 |
|
---|
| 580 | IsInstalled(PatchName)
|
---|
| 581 | ;"Purpose: To return if a given patch has already been installed.
|
---|
| 582 | ;"Input: PatchName -- format aaaa*nn.nn*mmm [SEQ #xxx]
|
---|
| 583 | ;"Result: 1 if installed, 0 if not, or problem.
|
---|
| 584 |
|
---|
| 585 | new result set result=0
|
---|
| 586 | new PckInit,Ver,PatchNum
|
---|
| 587 |
|
---|
| 588 | set PatchName=$piece(PatchName," ",1)
|
---|
| 589 | set PatchName=$$TrimRType^TMGSTUTL(PatchName,"C") ;"trim any characters off end of patch name, e.g. 'ABC*5.5*123<=='
|
---|
| 590 | set PckInit=$piece(PatchName,"*",1)
|
---|
| 591 | set Ver=$piece(PatchName,"*",2)
|
---|
| 592 | set PatchNum=$piece(PatchName,"*",3)
|
---|
| 593 | if (PckInit="")!(Ver="")!(PatchNum="") goto IIDone
|
---|
| 594 |
|
---|
| 595 | new IEN9d4,IEN9d49
|
---|
| 596 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
| 597 | if IEN9d4'>0 goto IIDone
|
---|
| 598 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
| 599 | if IEN9d49'>0 do
|
---|
| 600 | . new oneVer set oneVer=""
|
---|
| 601 | . new found set found=0
|
---|
| 602 | . for set oneVer=$order(^DIC(9.4,IEN9d4,22,"B",oneVer)) quit:(oneVer="")!found do
|
---|
| 603 | . . new Int,oneInt,Dec,oneDec
|
---|
| 604 | . . set Int=$piece(Ver,".",1),Dec=+$piece(Ver,".",2)
|
---|
| 605 | . . set oneInt=$piece(oneVer,".",1),oneDec=+$piece(oneVer,".",2)
|
---|
| 606 | . . if (Int=oneInt)&(Dec=oneDec) do
|
---|
| 607 | . . . set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",oneVer,""))
|
---|
| 608 | . . . set found=1
|
---|
| 609 | if IEN9d49'>0 goto IIDone
|
---|
| 610 |
|
---|
| 611 | goto:(IEN9d49'>0) IIDone
|
---|
| 612 |
|
---|
| 613 | new i,array,done
|
---|
| 614 | set i="",done=0
|
---|
| 615 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="") do
|
---|
| 616 | . new onePatchNum set onePatchNum=$piece(i," ",1)
|
---|
| 617 | . if onePatchNum=PatchNum do
|
---|
| 618 | . . set result=1,done=1
|
---|
| 619 |
|
---|
| 620 | IIDone
|
---|
| 621 | quit result
|
---|
| 622 |
|
---|
| 623 |
|
---|
| 624 | ParsePatchName(PatchName,PckInit,Ver,PatchNum,SeqNum)
|
---|
| 625 | ;"Purpose: to parse a patch name into it's composit parts.
|
---|
| 626 | ;"Input: PatchName -- the patch name to parse, e.g. ABC*12.34*1234 SEQ #123
|
---|
| 627 | ;" PckInit,Ver,PatchNum,SeqNum -- PASS BY REFERENCE, OUT PARAMETERS
|
---|
| 628 | ;"Results: none
|
---|
| 629 | set SeqNum=+$piece(PatchName,"SEQ #",2)
|
---|
| 630 | set PatchName=$piece(PatchName," SEQ #",1)
|
---|
| 631 | set PckInit=$piece(PatchName,"*",1)
|
---|
| 632 | set Ver=$piece(PatchName,"*",2)
|
---|
| 633 | set PatchNum=$piece(PatchName,"*",3)
|
---|
| 634 | quit
|
---|
| 635 |
|
---|
| 636 |
|
---|
| 637 |
|
---|
| 638 | AddMsg(s,IsError,Msg)
|
---|
| 639 | ;"Purpose: to add a message to Msg Array
|
---|
| 640 | ;"Input: s -- message. May be a string, or an array (or both) in format of:
|
---|
| 641 | ;" s=A line
|
---|
| 642 | ;" s(1)=line 1
|
---|
| 643 | ;" s(2)=line 2
|
---|
| 644 | ;" IsError -- 1 if is an error message
|
---|
| 645 | ;" Msg -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
| 646 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
| 647 | ;" Msg("ERROR")=count of last error
|
---|
| 648 | ;" Message are store in Msg(x)=Message
|
---|
| 649 | ;" Msg=count of last message+1
|
---|
| 650 | ;"Results: none
|
---|
| 651 |
|
---|
| 652 | set IsError=+$get(IsError)
|
---|
| 653 | new oneLine,subI set subI=""
|
---|
| 654 | set oneLine=$get(s)
|
---|
| 655 | for do set subI=$order(s(subI)) quit:(subI="") set oneLine=$get(s(subI))
|
---|
| 656 | . if IsError do
|
---|
| 657 | . . new MsgI set MsgI=$get(Msg("ERROR"),0)+1
|
---|
| 658 | . . set Msg("ERROR",MsgI)=oneLine
|
---|
| 659 | . . set Msg("ERROR")=MsgI
|
---|
| 660 | . else do
|
---|
| 661 | . . set Msg=+$get(Msg,1)
|
---|
| 662 | . . set Msg(Msg)=oneLine,Msg=Msg+1
|
---|
| 663 | quit
|
---|
| 664 |
|
---|
| 665 |
|
---|
| 666 | ShowMsg(Msg,NoPause)
|
---|
| 667 | ;"Purpose: to display the message array
|
---|
| 668 | ;"Input: Msg - PASS BY REFERENCE. The message array to display.
|
---|
| 669 | ;" NoPause -- OPTIONAL. If 1, then user not prompted to hit enter to cont.
|
---|
| 670 | ;"Results: 0 if OK, 1 if ERROR found in message array.
|
---|
| 671 | new errorFound set errorFound=0
|
---|
| 672 | if $data(Msg) do
|
---|
| 673 | . new i set i=""
|
---|
| 674 | . for set i=$order(Msg(i)) quit:(+i'>0) write " ",$get(Msg(i)),!
|
---|
| 675 | . if $data(Msg("ERROR")) do
|
---|
| 676 | . . write !!,"NOTE: ERRORS ENCOUNTERED:",!
|
---|
| 677 | . . set i=""
|
---|
| 678 | . . for set i=$order(Msg("ERROR",i)) quit:(+i'>0) write " ",$get(Msg("ERROR",i)),!
|
---|
| 679 | . . set errorFound=1
|
---|
| 680 | . if $get(NoPause)'=1 do PressToCont^TMGUSRIF
|
---|
| 681 |
|
---|
| 682 | quit errorFound |
---|