[796] | 1 | TMGDEBUG ;TMG/kst/Debug utilities: logging, record dump ;03/25/06
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;07/12/05
|
---|
| 3 |
|
---|
| 4 | ;"TMG DEBUG UTILITIES
|
---|
| 5 | ;"Kevin Toppenberg MD
|
---|
| 6 | ;"GNU General Public License (GPL) applies
|
---|
| 7 | ;"7-12-2005
|
---|
| 8 |
|
---|
| 9 | ;"=======================================================================
|
---|
| 10 | ;" API -- Public Functions.
|
---|
| 11 | ;"=======================================================================
|
---|
| 12 | ;"$$GetDebugMode^TMGDEBUG(DefVal)
|
---|
| 13 | ;"OpenDefLogFile^TMGDEBUG
|
---|
| 14 | ;"OpenLogFile^TMGDEBUG(DefPath,DefName)
|
---|
| 15 | ;"DebugMsg^TMGDEBUG(DBIndent,Msg,A,B,C,D,E,F,G,H,I,J,K,L)
|
---|
| 16 | ;"DebugWrite^TMGDEBUG(DBIndent,s,AddNewline)
|
---|
| 17 | ;"DebugIndent^TMGDEBUG(Num)
|
---|
| 18 | ;"ArrayDump^TMGDEBUG(ArrayP,index,indent)
|
---|
| 19 | ;"ASKANODES
|
---|
| 20 | ;"ArrayNodes(pArray)
|
---|
| 21 | ;"DebugEntry^TMGDEBUG((DBIndent,ProcName)
|
---|
| 22 | ;"DebugExit^TMGDEBUG(DBIndent,ProcName)
|
---|
| 23 | ;"ShowError^TMGDEBUG(PriorErrorFound,Error)
|
---|
| 24 | ;"$$GetErrStr^TMGDEBUG(ErrArray)
|
---|
| 25 | ;"ShowIfDIERR^TMGDEBUG(ErrMsg,PriorErrorFound) ;really same as below
|
---|
| 26 | ;"ShowDIERR^TMGDEBUG(ErrMsg,PriorErrorFound)
|
---|
| 27 | ;"ExpandLine(Pos)
|
---|
| 28 | ;"ASKDUMP -- A record dumper -- a little different from Fileman Inquire
|
---|
| 29 | ;"DumpRec(FileNum,IEN) -- dump (display) a record, using Fileman functionality.
|
---|
| 30 | ;"DumpRec2(FileNum,IEN,ShowEmpty) -- dump (display) a record, NOT Fileman's Inquire code
|
---|
| 31 |
|
---|
| 32 | ;"=======================================================================
|
---|
| 33 | ;"Private API functions
|
---|
| 34 |
|
---|
| 35 | ;"DumpRec2(FileNum,IEN,ShowEmpty)
|
---|
| 36 | ;"WriteRLabel(IEN,Ender)
|
---|
| 37 | ;"WriteFLabel(Label,Field,Type,Ender)
|
---|
| 38 | ;"WriteLine(Line)
|
---|
| 39 |
|
---|
| 40 | ;"=======================================================================
|
---|
| 41 | ;"DEPENDENCIES
|
---|
| 42 | ;" TMGUSRIF
|
---|
| 43 |
|
---|
| 44 | ;"Note: This module accesses custom file 22711, TMG UPLOAD SETTINGS
|
---|
| 45 | ;" It is OK if this file does not exist (i.e. on other computer systems.) However, the function
|
---|
| 46 | ;" OpenDefLogFile will fail to find a default specified file, and would not open a log file.
|
---|
| 47 | ;" Nothing is PUT INTO this file in this module. So new global would NOT be created.
|
---|
| 48 | ;"=======================================================================
|
---|
| 49 | ;"=======================================================================
|
---|
| 50 |
|
---|
| 51 | GetDebugMode(DefVal)
|
---|
| 52 | ;"Purpose: to ask if debug output desired
|
---|
| 53 | ;"Input: DefVal [optional] -- Default choice
|
---|
| 54 | ;"result: returns values as below
|
---|
| 55 | ;" 0, cdbNone - no debug
|
---|
| 56 | ;" 1, cdbToScrn - Debug output to screen
|
---|
| 57 | ;" 2, cdbToFile - Debug output to file
|
---|
| 58 | ;" 3, cdbToTail - Debug output to X tail dialog box.
|
---|
| 59 | ;" Note: 2-2-06 I am adding a mode (-1) which is EXTRA QUIET (used initially in ShowError)
|
---|
| 60 | ;"Note: This does not set up output streams etc, just gets preference.
|
---|
| 61 |
|
---|
| 62 | new cdbNone set cdbNone=0
|
---|
| 63 | new cdbAbort set cdbAbort=0
|
---|
| 64 | new cdbToScrn set cdbToScrn=1 ;"was 2
|
---|
| 65 | new cdbToFile set cdbToFile=2 ;"was 3
|
---|
| 66 | new cdbToTail set cdbToTail=3 ;"was 4
|
---|
| 67 |
|
---|
| 68 | new Input
|
---|
| 69 | new result set result=cdbNone ;"the default
|
---|
| 70 | new Default set Default=$get(DefVal,3)
|
---|
| 71 |
|
---|
| 72 | write !,"Select debug output option:",!
|
---|
| 73 | write " '^'. Abort",!
|
---|
| 74 | write " 0. NO debug output",!
|
---|
| 75 | write " 1. Show debug output on screen",!
|
---|
| 76 | write " 2. Send debug output to file",!
|
---|
| 77 | if $get(DispMode(cDialog)) do
|
---|
| 78 | . write " 3. Show debug output in X tail dialog box.",!
|
---|
| 79 |
|
---|
| 80 | write "Enter option number ("_Default_"): "
|
---|
| 81 | read Input,!
|
---|
| 82 |
|
---|
| 83 | if Input="" do
|
---|
| 84 | . write "Defaulting to: ",Default,!
|
---|
| 85 | . set Input=Default
|
---|
| 86 |
|
---|
| 87 | if Input="^" set result=cdbAbort
|
---|
| 88 | if Input=0 set result=cdbNone
|
---|
| 89 | if Input=1 set result=cdbToScrn
|
---|
| 90 | if Input=2 set result=cdbToFile
|
---|
| 91 | if Input=3 set result=cdbToTail
|
---|
| 92 |
|
---|
| 93 | GDMDone
|
---|
| 94 | quit result
|
---|
| 95 |
|
---|
| 96 | OpenDefLogFile
|
---|
| 97 | ;"Purpose: To open a default log file for debug output
|
---|
| 98 | ;"Results: none
|
---|
| 99 |
|
---|
| 100 | new DefPath,DefName
|
---|
| 101 |
|
---|
| 102 | set DefPath=$piece($get(^TMG(22711,1,2)),"^",1)
|
---|
| 103 | set DefName=$piece($get(^TMG(22711,1,1)),"^",1)
|
---|
| 104 |
|
---|
| 105 | do OpenLogFile(.DefPath,.DefName)
|
---|
| 106 |
|
---|
| 107 | quit
|
---|
| 108 |
|
---|
| 109 |
|
---|
| 110 | OpenLogFile(DefPath,DefName)
|
---|
| 111 | ;"Purpose: To open a log file for debug output
|
---|
| 112 | ;"Input: DefPath -- the default path, like this: "/tmp/" <-- note trailing '/'
|
---|
| 113 | ;" DefName -- default file name (without path). e.g. "LogFile.tmp"
|
---|
| 114 | ;"Results: None
|
---|
| 115 |
|
---|
| 116 | new DebugFPath set DebugFPath=$get(DefPath,"/tmp/")
|
---|
| 117 | new DebugFName set DebugFName=$get(DefName,"M_DebugLog.tmp")
|
---|
| 118 | if $get(TMGDEBUG)>1 do
|
---|
| 119 | . write "Note: Sending debug output to file: ",DebugFPath,DebugFName,!
|
---|
| 120 |
|
---|
| 121 | ;"new DebugFile -- don't NEW here, needs to be global-scope
|
---|
| 122 | set DebugFile=DebugFPath_DebugFName
|
---|
| 123 | new FileSpec set FileSpec(DebugFile)=""
|
---|
| 124 |
|
---|
| 125 | if +$piece($get(^TMG(22711,1,1)),"^",2)'=1 do
|
---|
| 126 | . ;"kill any pre-existing log
|
---|
| 127 | . new result
|
---|
| 128 | . set result=$$DEL^%ZISH(DebugFPath,$name(FileSpec)) ;"delete any preexisting one.
|
---|
| 129 |
|
---|
| 130 | open DebugFile
|
---|
| 131 | use $PRINCIPAL
|
---|
| 132 |
|
---|
| 133 | quit
|
---|
| 134 |
|
---|
| 135 |
|
---|
| 136 | DebugMsg(DBIndent,Msg,A,B,C,D,E,F,G,H,I,J,K,L)
|
---|
| 137 | ;"PUBLIC FUNCTION
|
---|
| 138 | ;"Purpose: a debugging message output procedure
|
---|
| 139 | ;"Input:DBIndent -- the value of indentation expected
|
---|
| 140 | ;" Msg -- a string or value to show as message
|
---|
| 141 | ;" A..L -- extra values to show.
|
---|
| 142 | ;"
|
---|
| 143 | if $get(TMGDEBUG,0)=0 quit
|
---|
| 144 | set cTrue=$get(cTrue,1)
|
---|
| 145 | set DBIndent=$get(DBIndent,0)
|
---|
| 146 |
|
---|
| 147 | set Msg=$get(Msg)
|
---|
| 148 | set Msg=Msg_$get(A)
|
---|
| 149 | set Msg=Msg_$get(B)
|
---|
| 150 | set Msg=Msg_$get(C)
|
---|
| 151 | set Msg=Msg_$get(D)
|
---|
| 152 | set Msg=Msg_$get(E)
|
---|
| 153 | set Msg=Msg_$get(F)
|
---|
| 154 | set Msg=Msg_$get(G)
|
---|
| 155 | set Msg=Msg_$get(H)
|
---|
| 156 | set Msg=Msg_$get(I)
|
---|
| 157 | set Msg=Msg_$get(J)
|
---|
| 158 | set Msg=Msg_$get(K)
|
---|
| 159 | set Msg=Msg_$get(L)
|
---|
| 160 | do DebugIndent(DBIndent)
|
---|
| 161 | do DebugWrite(DBIndent,.Msg,cTrue)
|
---|
| 162 |
|
---|
| 163 | quit
|
---|
| 164 |
|
---|
| 165 |
|
---|
| 166 | DebugWrite(DBIndent,s,AddNewline)
|
---|
| 167 | ;"PUBLIC FUNCTION
|
---|
| 168 | ;"Purpose: to write debug output. Having the proc separate will allow
|
---|
| 169 | ;" easier dump to file etc.
|
---|
| 170 | ;"Input:DBIndent, the amount of indentation expected for output.
|
---|
| 171 | ;" s -- the text to write
|
---|
| 172 | ;" AddNewline -- boolean, 1 if ! (i.e. newline) should be written after s
|
---|
| 173 |
|
---|
| 174 | ;"Relevant DEBUG values
|
---|
| 175 | ;" cdbNone - no debug (0)
|
---|
| 176 | ;" cdbToScrn - Debug output to screen (1)
|
---|
| 177 | ;" cdbToFile - Debug output to file (2)
|
---|
| 178 | ;" cdbToTail - Debug output to X tail dialog box. (3)
|
---|
| 179 | ;"Note: If above values are not defined, then functionality will be ignored.
|
---|
| 180 |
|
---|
| 181 |
|
---|
| 182 | set cdbNone=$get(cdbNone,0)
|
---|
| 183 | set cdbToScrn=$get(cdbToScrn,1)
|
---|
| 184 | set cdbToFile=$get(cdbToFile,2)
|
---|
| 185 | set cdbToTail=$get(cdbToTail,3)
|
---|
| 186 | set TMGDEBUG=$get(TMGDEBUG,cdbNone)
|
---|
| 187 | if $get(TMGDEBUG)=cdbNone quit
|
---|
| 188 |
|
---|
| 189 | if (TMGDEBUG=$get(cdbToFile))!(TMGDEBUG=$get(cdbToTail)) do
|
---|
| 190 | . if $data(DebugFile) use DebugFile
|
---|
| 191 |
|
---|
| 192 | new ch,chN,l,i
|
---|
| 193 | set l=$length(s)
|
---|
| 194 | for i=1:1:l do
|
---|
| 195 | . set ch=$extract(s,i)
|
---|
| 196 | . set chN=$ascii(ch)
|
---|
| 197 | . if (chN<32)&(chN'=13) write "<",chN,">"
|
---|
| 198 | . else write ch
|
---|
| 199 | ;"write s
|
---|
| 200 |
|
---|
| 201 | set cTrue=$get(cTrue,1)
|
---|
| 202 | if $get(AddNewline)=cTrue write !
|
---|
| 203 |
|
---|
| 204 | if (TMGDEBUG=$get(cdbToFile))!(TMGDEBUG=$get(cdbToTail)) do
|
---|
| 205 | . use $PRINCIPAL
|
---|
| 206 |
|
---|
| 207 | quit
|
---|
| 208 |
|
---|
| 209 |
|
---|
| 210 | DebugIndent(DBIndentForced)
|
---|
| 211 | ;"PUBLIC FUNCTION
|
---|
| 212 | ;"Purpose: to provide a unified indentation for debug messages
|
---|
| 213 | ;"Input: DBIndent = number of indentations
|
---|
| 214 | ;" Forced = 1 if to indent regardless of DEBUG mode
|
---|
| 215 |
|
---|
| 216 | set Forced=$get(Forced,0)
|
---|
| 217 |
|
---|
| 218 | if ($get(TMGDEBUG,0)=0)&(Forced=0) quit
|
---|
| 219 | new i
|
---|
| 220 | for i=1:1:DBIndent do
|
---|
| 221 | . if Forced do DebugWrite(DBIndent," ")
|
---|
| 222 | . else do DebugWrite(DBIndent,". ")
|
---|
| 223 | quit
|
---|
| 224 |
|
---|
| 225 |
|
---|
| 226 |
|
---|
| 227 | ArrayDump(ArrayP,TMGIDX,indent,flags)
|
---|
| 228 | ;"PUBLIC FUNCTION
|
---|
| 229 | ;"Purpose: to get a custom version of GTM's "zwr" command
|
---|
| 230 | ;"Input: Uses global scope var DBIndent (if defined)
|
---|
| 231 | ;" ArrayP: NAME of global or variable to display, i.e. "^VA(200)", "MyVar"
|
---|
| 232 | ;" TMGIDX: initial index (i.e. 5 if wanting to start with ^VA(200,5) -- Optional
|
---|
| 233 | ;" indent: spacing from left margin to begin with. (A number. Each count is 2 spaces)
|
---|
| 234 | ;" OPTIONAL: indent may be an array, with information about columns
|
---|
| 235 | ;" to skip. For example:
|
---|
| 236 | ;" indent=3, indent(2)=0 --> show | for columns 1 & 3, but NOT 2
|
---|
| 237 | ;" flags: OPTIONAL. "F"-> flat (don't use tre structure)
|
---|
| 238 | ;"Result: none
|
---|
| 239 |
|
---|
| 240 | ;"--Leave out, this calls itself recursively! do DebugEntry("ArrayDump")
|
---|
| 241 | ;"--Leave out, this calls itself recursively! do DebugMsg^TMGDEBUG("ArrayP=",ArrayP,", TMGIDX=",index)
|
---|
| 242 |
|
---|
| 243 | if $data(ArrayP)=0 quit
|
---|
| 244 |
|
---|
| 245 | if $get(flags)["F" do goto ADDone
|
---|
| 246 | . new ref set ref=ArrayP
|
---|
| 247 | . new nNums set nNums=$qlength(ref)
|
---|
| 248 | . new lValue set lValue=$qsubscript(ref,nNums)
|
---|
| 249 | . write ref,"=""",$get(@ref),"""",!
|
---|
| 250 | . for set ref=$query(@ref) quit:(ref="")!($qsubscript(ref,nNums)'=lValue) do
|
---|
| 251 | . . write ref,"=""",$get(@ref),"""",!
|
---|
| 252 |
|
---|
| 253 | ;"Note: I need to do some validation to ensure ArrayP doesn't have any null nodes.
|
---|
| 254 | new X set X="SET TEMP=$GET("_ArrayP_")"
|
---|
| 255 | set X=$$UP^XLFSTR(X)
|
---|
| 256 | do ^DIM ;"a method to ensure ArrayP doesn't have an invalid reference.
|
---|
| 257 | if $get(X)="" quit
|
---|
| 258 |
|
---|
| 259 | set DBIndent=$get(DBIndent,0)
|
---|
| 260 | set cTrue=$get(cTrue,1)
|
---|
| 261 | set cFalse=$get(cFalse,0)
|
---|
| 262 |
|
---|
| 263 | ;"Force this function to output, even if TMGDEBUG is not defined.
|
---|
| 264 | ;"if $data(TMGDEBUG)=0 new TMGDEBUG ;"//kt 1-16-06, doesn't seem to be working
|
---|
| 265 | new TMGDEBUG ;"//kt added 1-16-06
|
---|
| 266 | set TMGDEBUG=1
|
---|
| 267 |
|
---|
| 268 | new ChildP,TMGi
|
---|
| 269 |
|
---|
| 270 | set TMGIDX=$get(TMGIDX,"")
|
---|
| 271 | set indent=$get(indent,0)
|
---|
| 272 | new SavIndex set SavIndex=TMGIDX
|
---|
| 273 |
|
---|
| 274 | do DebugIndent(DBIndent)
|
---|
| 275 |
|
---|
| 276 | if indent>0 do
|
---|
| 277 | . for TMGi=1:1:indent-1 do
|
---|
| 278 | . . new s set s=""
|
---|
| 279 | . . if $get(indent(TMGi),-1)=0 set s=" "
|
---|
| 280 | . . else set s="| "
|
---|
| 281 | . . do DebugWrite(DBIndent,s)
|
---|
| 282 | . do DebugWrite(DBIndent,"}~")
|
---|
| 283 |
|
---|
| 284 | if TMGIDX'="" do
|
---|
| 285 | . if $data(@ArrayP@(TMGIDX))#10=1 do
|
---|
| 286 | . . new s set s=@ArrayP@(TMGIDX)
|
---|
| 287 | . . if s="" set s=""""""
|
---|
| 288 | . . new qt set qt=""
|
---|
| 289 | . . if +TMGIDX'=TMGIDX set qt=""""
|
---|
| 290 | . . do DebugWrite(DBIndent,qt_TMGIDX_qt_" = "_s,cTrue)
|
---|
| 291 | . else do
|
---|
| 292 | . . do DebugWrite(DBIndent,TMGIDX,1)
|
---|
| 293 | . set ArrayP=$name(@ArrayP@(TMGIDX))
|
---|
| 294 | else do
|
---|
| 295 | . ;"do DebugWrite(DBIndent,ArrayP_"(*)",cFalse)
|
---|
| 296 | . do DebugWrite(DBIndent,ArrayP,cFalse)
|
---|
| 297 | . if $data(@ArrayP)#10=1 do
|
---|
| 298 | . . do DebugWrite(0,"="_$get(@ArrayP),cFalse)
|
---|
| 299 | . do DebugWrite(0,"",cTrue)
|
---|
| 300 |
|
---|
| 301 | set TMGIDX=$order(@ArrayP@(""))
|
---|
| 302 | if TMGIDX="" goto ADDone
|
---|
| 303 | set indent=indent+1
|
---|
| 304 |
|
---|
| 305 | for do quit:TMGIDX=""
|
---|
| 306 | . new tTMGIDX set tTMGIDX=$order(@ArrayP@(TMGIDX))
|
---|
| 307 | . if tTMGIDX="" set indent(indent)=0
|
---|
| 308 | . new tIndent merge tIndent=indent
|
---|
| 309 | . do ArrayDump(ArrayP,TMGIDX,.tIndent) ;"Call self recursively
|
---|
| 310 | . set TMGIDX=$order(@ArrayP@(TMGIDX))
|
---|
| 311 |
|
---|
| 312 | ;"Put in a blank space at end of subbranch
|
---|
| 313 | do DebugIndent(DBIndent)
|
---|
| 314 |
|
---|
| 315 | if indent>0 do
|
---|
| 316 | . for TMGi=1:1:indent-1 do
|
---|
| 317 | . . new s set s=""
|
---|
| 318 | . . if $get(indent(TMGi),-1)=0 set s=" "
|
---|
| 319 | . . else set s="| "
|
---|
| 320 | . . do DebugWrite(DBIndent,s)
|
---|
| 321 | . do DebugWrite(DBIndent," ",1)
|
---|
| 322 |
|
---|
| 323 | ADDone
|
---|
| 324 | ;"--Leave out, this calls itself recursively! do DebugExit("ArrayDump")
|
---|
| 325 | quit
|
---|
| 326 |
|
---|
| 327 |
|
---|
| 328 | ASKANODES
|
---|
| 329 | ;"Purpose: to ask user for the name of an array, then display nodes
|
---|
| 330 |
|
---|
| 331 | new name
|
---|
| 332 | write !
|
---|
| 333 | read "Enter name of array to display nodes in: ",name,!
|
---|
| 334 | if name="^" set name=""
|
---|
| 335 | if name'="" do ArrayNodes(name)
|
---|
| 336 | quit
|
---|
| 337 |
|
---|
| 338 |
|
---|
| 339 | ArrayNodes(pArray)
|
---|
| 340 | ;"Purpose: To display all the nodes of the given array
|
---|
| 341 | ;"Input: pArray -- NAME OF array to display
|
---|
| 342 |
|
---|
| 343 | new TMGi
|
---|
| 344 |
|
---|
| 345 | write pArray,!
|
---|
| 346 | set TMGi=$order(@pArray@(""))
|
---|
| 347 | if TMGi'="" for do quit:(TMGi="")
|
---|
| 348 | . write " +--(",TMGi,")",!
|
---|
| 349 | . set TMGi=$order(@pArray@(TMGi))
|
---|
| 350 |
|
---|
| 351 | quit
|
---|
| 352 |
|
---|
| 353 | DebugEntry(DBIndent,ProcName)
|
---|
| 354 | ;"PUBLIC FUNCTION
|
---|
| 355 | ;"Purpose: A way to show when entering a procedure, in debug mode
|
---|
| 356 | ;"Input: DBIndent, a variable to keep track of indentation amount--PASS BY REFERENCE
|
---|
| 357 | ;" ProcName: any arbitrary name to show when decreasing indent amount.
|
---|
| 358 |
|
---|
| 359 | set ProcName=$get(ProcName,"?")
|
---|
| 360 | set DBIndent=$get(DBIndent,0)
|
---|
| 361 | do DebugMsg(DBIndent,ProcName_" {")
|
---|
| 362 | set DBIndent=DBIndent+1
|
---|
| 363 | quit
|
---|
| 364 |
|
---|
| 365 |
|
---|
| 366 | DebugExit(DBIndent,ProcName)
|
---|
| 367 | ;"PUBLIC FUNCTION
|
---|
| 368 | ;"Purpose: A way to show when leaving a procedure, in debug mode
|
---|
| 369 | ;"Input: DBIndent, a variable to keep track of indentation amount--PASS BY REFERENCE
|
---|
| 370 | ;" ProcName: any arbitrary name to show when decreasing indent amount.
|
---|
| 371 |
|
---|
| 372 | ;"write "DBIndent=",DBIndent,!
|
---|
| 373 | ;"write "ProcName=",ProcName,!
|
---|
| 374 | set ProcName=$get(ProcName,"?")
|
---|
| 375 | set DBIndent=$get(DBIndent)-1
|
---|
| 376 | if DBIndent<0 set DBIndent=0
|
---|
| 377 | do DebugMsg(DBIndent,"} //"_ProcName)
|
---|
| 378 |
|
---|
| 379 | quit
|
---|
| 380 |
|
---|
| 381 |
|
---|
| 382 |
|
---|
| 383 |
|
---|
| 384 | ShowError(PriorErrorFound,Error)
|
---|
| 385 | ;"Purpose: to output an error message
|
---|
| 386 | ;"Input: [OPTIONAL] PriorErrorFound -- var to see if an error already shown.
|
---|
| 387 | ;" if not passed, then default value used ('no prior error')
|
---|
| 388 | ;" Error -- a string to display
|
---|
| 389 | ;"results: none
|
---|
| 390 |
|
---|
| 391 | if $get(TMGDEBUG)=-1 quit ;"EXTRA QUIET mode --> skip entirely
|
---|
| 392 |
|
---|
| 393 | if $get(TMGDEBUG)>0 do DebugEntry(.DBIndent,"ShowError")
|
---|
| 394 | if $get(TMGDEBUG)>0 do DebugMsg(.DBIndent,"Error msg=",Error)
|
---|
| 395 |
|
---|
| 396 | if $get(PriorErrorFound,0) do goto ShErrQuit ;"Remove to show cascading errors
|
---|
| 397 | . if $get(TMGDEBUG)>0 do DebugMsg(.DBIndent,"Prior error found, so won't show this error.")
|
---|
| 398 |
|
---|
| 399 | if $data(DBIndent)=0 new DBIndent ;"If it wasn't global before, keep it that way.
|
---|
| 400 | new SaveIndent set SaveIndent=$get(DBIndent)
|
---|
| 401 | set DBIndent=1
|
---|
| 402 | do PopupBox^TMGUSRIF("<!> ERROR . . .",Error)
|
---|
| 403 | set PriorErrorFound=1
|
---|
| 404 | set DBIndent=SaveIndent
|
---|
| 405 |
|
---|
| 406 | ShErrQuit
|
---|
| 407 | if $get(TMGDEBUG)>0 do DebugExit(.DBIndent,"ShowError")
|
---|
| 408 |
|
---|
| 409 | quit
|
---|
| 410 |
|
---|
| 411 |
|
---|
| 412 | GetErrStr(ErrArray)
|
---|
| 413 | ;"Purpose: convert a standard DIERR array into a string for output
|
---|
| 414 | ;"Input: ErrArray -- PASS BY REFERENCE. example:
|
---|
| 415 | ;" array("DIERR")="1^1"
|
---|
| 416 | ;" array("DIERR",1)=311
|
---|
| 417 | ;" array("DIERR",1,"PARAM",0)=3
|
---|
| 418 | ;" array("DIERR",1,"PARAM","FIELD")=.02
|
---|
| 419 | ;" array("DIERR",1,"PARAM","FILE")=2
|
---|
| 420 | ;" array("DIERR",1,"PARAM","IENS")="+1,"
|
---|
| 421 | ;" array("DIERR",1,"TEXT",1)="The new record '+1,' lacks some required identifiers."
|
---|
| 422 | ;" array("DIERR","E",311,1)=""
|
---|
| 423 | ;"Results: returns one long equivalent string from above array.
|
---|
| 424 |
|
---|
| 425 | new ErrStr
|
---|
| 426 | new TMGIDX
|
---|
| 427 | new ErrNum
|
---|
| 428 |
|
---|
| 429 | set ErrStr=""
|
---|
| 430 | for ErrNum=1:1:+$get(ErrArray("DIERR")) do
|
---|
| 431 | . set ErrStr=ErrStr_"Fileman says: '"
|
---|
| 432 | . if ErrNum'=1 set ErrStr=ErrStr_"(Error# "_ErrNum_") "
|
---|
| 433 | . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"TEXT",""))
|
---|
| 434 | . if TMGIDX'="" for do quit:(TMGIDX="")
|
---|
| 435 | . . set ErrStr=ErrStr_$get(ErrArray("DIERR",ErrNum,"TEXT",TMGIDX))_" "
|
---|
| 436 | . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"TEXT",TMGIDX))
|
---|
| 437 | . if $get(ErrArray("DIERR",ErrNum,"PARAM",0))>0 do
|
---|
| 438 | . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"PARAM",0))
|
---|
| 439 | . . set ErrStr=ErrStr_"Details: "
|
---|
| 440 | . . for do quit:(TMGIDX="")
|
---|
| 441 | . . . if TMGIDX="" quit
|
---|
| 442 | . . . set ErrStr=ErrStr_"["_TMGIDX_"]="_$get(ErrArray("DIERR",1,"PARAM",TMGIDX))_" "
|
---|
| 443 | . . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"PARAM",TMGIDX))
|
---|
| 444 |
|
---|
| 445 | quit ErrStr
|
---|
| 446 |
|
---|
| 447 |
|
---|
| 448 |
|
---|
| 449 | ShowIfDIERR(ErrMsg,PriorErrorFound) ;"really same as below
|
---|
| 450 | goto SEL1
|
---|
| 451 |
|
---|
| 452 | ShowDIERR(ErrMsg,PriorErrorFound)
|
---|
| 453 | ;"Purpose: To provide a standard output mechanism for the fileman DIERR message
|
---|
| 454 | ;"Input: ErrMsg -- PASS BY REFERENCE. a standard error message array, as
|
---|
| 455 | ;" put out by fileman calls
|
---|
| 456 | ;" PriorErrorFound -- OPTIONAL variable to keep track if prior error found.
|
---|
| 457 | ;" Note -- can also be used as ErrorFound (i.e. set to 1 if error found)
|
---|
| 458 | ;"Output -- none
|
---|
| 459 | ;"Result -- none
|
---|
| 460 |
|
---|
| 461 | SEL1
|
---|
| 462 | if $get(TMGDEBUG)=-1 quit ;"EXTRA QUIET mode --> skip entirely
|
---|
| 463 |
|
---|
| 464 | if $get(TMGDEBUG)>0 do DebugEntry(.DBIndent,"ShowDIERR")
|
---|
| 465 |
|
---|
| 466 | if $data(ErrMsg("DIERR")) do
|
---|
| 467 | . if $get(TMGDEBUG)>0 do DebugMsg(.DBIndent,"Error message found. Here is array:")
|
---|
| 468 | . if $get(TMGDEBUG) do ArrayDump("ErrMsg")
|
---|
| 469 | . new ErrStr
|
---|
| 470 | . set ErrStr=$$GetErrStr(.ErrMsg)
|
---|
| 471 | . do ShowError(.PriorErrorFound,.ErrStr)
|
---|
| 472 |
|
---|
| 473 | if $get(TMGDEBUG)>0 do DebugExit(.DBIndent,"ShowDIERR")
|
---|
| 474 | quit
|
---|
| 475 |
|
---|
| 476 | ExpandLine(Pos)
|
---|
| 477 | ;"Purpose: to expand a line of code, found at position "Pos", using ^XINDX8 functionality
|
---|
| 478 | ;"Input: Pos: a position as returned by $ZPOS (e.g. G+5^DIS, or +23^DIS)
|
---|
| 479 | ;"Output: Writes to the currently selecte IO device and expansion of one line of code
|
---|
| 480 | ;"Note: This is used for taking the very long lines of code, as found in Fileman, and
|
---|
| 481 | ;" convert them to a format with one command on each line.
|
---|
| 482 | ;" Note: it appears to do syntax checking and shows ERROR if syntax is not per VA
|
---|
| 483 | ;" conventions--such as commands must be UPPERCASE etc.
|
---|
| 484 |
|
---|
| 485 | ;"--- copied and modified from XINDX8.m ---
|
---|
| 486 |
|
---|
| 487 | kill ^UTILITY($J)
|
---|
| 488 |
|
---|
| 489 | new label,offset,RTN,dmod
|
---|
| 490 | do ParsePos^TMGMISC(Pos,.label,.offset,.RTN,.dmod)
|
---|
| 491 | if label'="" do ;"change position from one relative to label into one relative to top of file
|
---|
| 492 | . new CodeArray
|
---|
| 493 | . set Pos=$$ConvertPos^TMGMISC(Pos,"CodeArray")
|
---|
| 494 | . do ParsePos^TMGMISC(Pos,.label,.offset,.RTN,.dmod)
|
---|
| 495 |
|
---|
| 496 | if RTN="" goto ELDone
|
---|
| 497 |
|
---|
| 498 | do BUILD^XINDX7
|
---|
| 499 | set ^UTILITY($J,RTN)=""
|
---|
| 500 | do LOAD^XINDEX
|
---|
| 501 | set CCN=0
|
---|
| 502 | for I=1:1:+^UTILITY($J,1,RTN,0,0) S CCN=CCN+$L(^UTILITY($J,1,RTN,0,I,0))+2
|
---|
| 503 | set ^UTILITY($J,1,RTN,0)=CCN
|
---|
| 504 | ;"do ^XINDX8 -- included below
|
---|
| 505 |
|
---|
| 506 | new Q,DDOT,LO,PG,LIN,ML,IDT
|
---|
| 507 | new tIOSL set tIOSL=IOSL
|
---|
| 508 | set IOSL=999999 ;"really long 'page length' prevents header printout (and error)
|
---|
| 509 |
|
---|
| 510 | set Q=""""
|
---|
| 511 | set DDOT=0
|
---|
| 512 | set LO=0
|
---|
| 513 | set PG=+$G(PG)
|
---|
| 514 |
|
---|
| 515 | set LC=offset
|
---|
| 516 | if $D(^UTILITY($J,1,RTN,0,LC)) do
|
---|
| 517 | . S LIN=^(LC,0),ML=0,IDT=10
|
---|
| 518 | . set LO=LC-1
|
---|
| 519 | . D CD^XINDX8
|
---|
| 520 |
|
---|
| 521 | K AGR,EOC,IDT,JJ,LO,ML,OLD,SAV,TY
|
---|
| 522 |
|
---|
| 523 | set IOSL=tIOSL ;"restore saved IOSL
|
---|
| 524 | ELDone
|
---|
| 525 | quit
|
---|
| 526 |
|
---|
| 527 |
|
---|
| 528 | DumpRec(FileNum,IEN)
|
---|
| 529 | ;"Purpose: to dump (display) a record, using Fileman functionality.
|
---|
| 530 | ;"Input: FileNum -- the number of the file to dump from
|
---|
| 531 | ;" IEN -- the record number to display
|
---|
| 532 | ;"Note: this code is modified from INQ^DII
|
---|
| 533 |
|
---|
| 534 | new DIC,X,Y,DI,DPP,DK,DICSS
|
---|
| 535 |
|
---|
| 536 | set X=FileNum,Y=X
|
---|
| 537 |
|
---|
| 538 | set DI=$get(^DIC(FileNum,0,"GL")) if DI="" quit
|
---|
| 539 | set DPP(1)=FileNum_"^^^@"
|
---|
| 540 | set DK=FileNum
|
---|
| 541 |
|
---|
| 542 | K ^UTILITY($J),^(U,$J),DIC,DIQ,DISV,DIBT,DICS
|
---|
| 543 |
|
---|
| 544 | set DIK=1
|
---|
| 545 | set ^UTILITY(U,$J,DIK,IEN)="" ;"<-- note, to have multiple IEN's shown, iterate via DIK
|
---|
| 546 |
|
---|
| 547 | do S^DII ;"Jump into Fileman code.
|
---|
| 548 |
|
---|
| 549 | quit
|
---|
| 550 |
|
---|
| 551 |
|
---|
| 552 | xASKDUMP
|
---|
| 553 | ;"Purpose: A record dumper -- a little different from Fileman Inquire
|
---|
| 554 |
|
---|
| 555 | new DIC,X,Y
|
---|
| 556 | new FileNum,IEN
|
---|
| 557 | new UseDefault set UseDefault=1
|
---|
| 558 |
|
---|
| 559 | ;"Pick file to dump from
|
---|
| 560 | xASK1 set DIC=1
|
---|
| 561 | set DIC(0)="AEQM"
|
---|
| 562 | if UseDefault do ;"leave the redundant do loop, it protects $T, so second do ^DIC isn't called
|
---|
| 563 | . do ^DICRW ;" has default value of user's last response
|
---|
| 564 | else do ^DIC ;doesn't have default value...
|
---|
| 565 | if +Y'>0 write ! goto xASKDone
|
---|
| 566 | set FileNum=+Y
|
---|
| 567 |
|
---|
| 568 | ;"Pick record to dump
|
---|
| 569 | xASKLOOP kill DIC,X
|
---|
| 570 | set DIC=+FileNum
|
---|
| 571 | set DIC(0)="AEQM"
|
---|
| 572 | do ^DIC write !
|
---|
| 573 | if +Y'>0 set UseDefault=0 goto xASK1
|
---|
| 574 | set IEN=+Y
|
---|
| 575 |
|
---|
| 576 | new % set %=2
|
---|
| 577 | write "Display empty fields"
|
---|
| 578 | do YN^DICN
|
---|
| 579 | if %=-1 write ! goto xASKDone
|
---|
| 580 |
|
---|
| 581 | new %ZIS
|
---|
| 582 | set %ZIS("A")="Enter Output Device: "
|
---|
| 583 | set %ZIS("B")="HOME"
|
---|
| 584 | do ^%ZIS ;"standard device call
|
---|
| 585 | if POP do goto xASKDone
|
---|
| 586 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error opening output. Aborting.")
|
---|
| 587 | use IO
|
---|
| 588 |
|
---|
| 589 | ;"Do the output
|
---|
| 590 | write !
|
---|
| 591 | do DumpRec2(FileNum,IEN,(%=1))
|
---|
| 592 |
|
---|
| 593 | ;" Close the output device
|
---|
| 594 | do ^%ZISC
|
---|
| 595 |
|
---|
| 596 | new temp
|
---|
| 597 | read "Press [ENTER] to continue...",temp:$get(DTIME,3600),!
|
---|
| 598 |
|
---|
| 599 | goto xASKLOOP
|
---|
| 600 |
|
---|
| 601 | xASKDone
|
---|
| 602 | quit
|
---|
| 603 |
|
---|
| 604 | ASKDUMP
|
---|
| 605 | ;"Purpose: A record dumper -- a little different from Fileman Inquire
|
---|
| 606 |
|
---|
| 607 | write !!," -= RECORD DUMPER =-",!
|
---|
| 608 | new FIENS,IENS
|
---|
| 609 | AL1
|
---|
| 610 | set FIENS=$$AskFIENS^TMGDBAPI()
|
---|
| 611 | if (FIENS["?")!(FIENS="^") goto ASKDone
|
---|
| 612 |
|
---|
| 613 | set FileNum=$piece(FIENS,"^",1)
|
---|
| 614 | set IENS=$piece(FIENS,"^",2)
|
---|
| 615 |
|
---|
| 616 | AL2
|
---|
| 617 | set IENS=$$AskIENS^TMGDBAPI(FileNum,IENS)
|
---|
| 618 | if (IENS["?")!(IENS="") goto AL1
|
---|
| 619 |
|
---|
| 620 | new % set %=2
|
---|
| 621 | write "Display empty fields"
|
---|
| 622 | do YN^DICN
|
---|
| 623 | if %=-1 write ! goto ASKDone
|
---|
| 624 |
|
---|
| 625 | new %ZIS
|
---|
| 626 | set %ZIS("A")="Enter Output Device: "
|
---|
| 627 | set %ZIS("B")="HOME"
|
---|
| 628 | do ^%ZIS ;"standard device call
|
---|
| 629 | if POP do goto ASKDone
|
---|
| 630 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error opening output. Aborting.")
|
---|
| 631 | use IO
|
---|
| 632 |
|
---|
| 633 | ;"Do the output
|
---|
| 634 | write ! do DumpRec2(FileNum,IENS,(%=1))
|
---|
| 635 |
|
---|
| 636 | ;" Close the output device
|
---|
| 637 | do ^%ZISC
|
---|
| 638 |
|
---|
| 639 | do PressToCont^TMGUSRIF
|
---|
| 640 | ;"new temp
|
---|
| 641 | ;"read "Press [ENTER] to continue...",temp:$get(DTIME,3600),!
|
---|
| 642 |
|
---|
| 643 | set IENS=$piece(IENS,",",2,99) ;"force Pick of new record to dump
|
---|
| 644 | if +IENS>0 goto AL2
|
---|
| 645 | goto AL1
|
---|
| 646 |
|
---|
| 647 | ASKDone
|
---|
| 648 | quit
|
---|
| 649 |
|
---|
| 650 |
|
---|
| 651 | DumpRec2(FileNum,IENS,ShowEmpty,FieldsArray)
|
---|
| 652 | ;"Purpose: to dump (display) a record, NOT using ^DII (Fileman's Inquire code)
|
---|
| 653 | ;"Input: FileNum -- the number of the file to dump from
|
---|
| 654 | ;" IENS -- the record number to display (or IENS: #,#,#,)
|
---|
| 655 | ;" ShowEmpty -- OPTIONAL; if 1 then empty fields will be displayed
|
---|
| 656 | ;" FieldsArray -- OPTIONAL. PASS BY REFERENCE.
|
---|
| 657 | ;" Allows user to specify which fields to show. Format:
|
---|
| 658 | ;" FieldsArray(FieldtoShow)="" <-- FieldtoShow is name or number
|
---|
| 659 | ;" FieldsArray(FieldtoShow)="" <-- FieldtoShow is name or number
|
---|
| 660 | ;" Default is an empty array, in which all fields are considered
|
---|
| 661 |
|
---|
| 662 | new Fields
|
---|
| 663 | set Fields("*")=""
|
---|
| 664 | new flags set flags="i"
|
---|
| 665 | if $get(ShowEmpty)=1 set flags=flags_"b"
|
---|
| 666 |
|
---|
| 667 | write "Record# ",IENS," in FILE: ",FileNum,!
|
---|
| 668 |
|
---|
| 669 | new field,fieldName
|
---|
| 670 | if $data(FieldsArray)=0 do
|
---|
| 671 | . set field=$order(^DD(FileNum,0))
|
---|
| 672 | . if +field>0 for do quit:(+field'>0)
|
---|
| 673 | . . set fieldName=$piece(^DD(FileNum,field,0),"^",1)
|
---|
| 674 | . . set Fields("TAG NAME",field)=fieldName_"("_field_")"
|
---|
| 675 | . . set field=$order(^DD(FileNum,field))
|
---|
| 676 | else do ;"Handle case of showing ONLY requested fields
|
---|
| 677 | . new temp set temp=""
|
---|
| 678 | . for set temp=$order(FieldsArray(temp)) quit:(temp="") do
|
---|
| 679 | . . if +temp=temp do
|
---|
| 680 | . . . set field=+temp
|
---|
| 681 | . . . set fieldName=$piece(^DD(FileNum,field,0),"^",1)
|
---|
| 682 | . . else do
|
---|
| 683 | . . . set fieldName=temp
|
---|
| 684 | . . . if $$SetFileFldNums^TMGDBAPI(FileNum,fieldName,,.field)=0 quit
|
---|
| 685 | . . set Fields("TAG NAME",field)=fieldName_"("_field_")"
|
---|
| 686 | . ;"Now exclude those fields not specifically included
|
---|
| 687 | . set field=0
|
---|
| 688 | . for set field=$order(^DD(FileNum,field)) quit:(+field'>0) do
|
---|
| 689 | . . if $data(Fields("TAG NAME",field))'=0 quit
|
---|
| 690 | . . set fieldName=$piece(^DD(FileNum,field,0),"^",1)
|
---|
| 691 | . . set Fields("Field Exclude",field)=""
|
---|
| 692 |
|
---|
| 693 | new RFn,FFn,LFn,WPLFn
|
---|
| 694 | set RFn="WriteRLabel^TMGDEBUG"
|
---|
| 695 | set FFn="WriteFLabel^TMGDEBUG"
|
---|
| 696 | set LFn="WriteLine^TMGDEBUG"
|
---|
| 697 | set WPLFn="WriteWPLine^TMGDEBUG"
|
---|
| 698 |
|
---|
| 699 | ;"write "Using flags (options): ",flags,!
|
---|
| 700 |
|
---|
| 701 | if +IENS=IENS do
|
---|
| 702 | . do Write1Rec^TMGXMLE2(FileNum,IENS,.Fields,flags,,,"",RFn,FFn,LFn,WPLFn)
|
---|
| 703 | else do ;"dump a subfile record
|
---|
| 704 | . do Write1Rec^TMGXMLE2(FileNum,+IENS,.Fields,flags,,IENS,"",RFn,FFn,LFn,WPLFn)
|
---|
| 705 |
|
---|
| 706 | quit
|
---|
| 707 |
|
---|
| 708 |
|
---|
| 709 | WriteRLabel(IEN,Ender)
|
---|
| 710 | ;"Purpose: To actually write out labels for record starting and ending.
|
---|
| 711 | ;" IEN -- the IEN (record number) of the record
|
---|
| 712 | ;" Ender -- OPTIONAL if 1, then ends field.
|
---|
| 713 | ;"Results: none.
|
---|
| 714 | ;"Note: Used by DumpRec2 above, with callback from TMGXMLE2
|
---|
| 715 |
|
---|
| 716 | if +$get(Ender)>0 write !
|
---|
| 717 | else write " Multiple Entry #",IEN,"",!
|
---|
| 718 |
|
---|
| 719 | quit
|
---|
| 720 |
|
---|
| 721 |
|
---|
| 722 | WriteFLabel(Label,Field,Type,Ender)
|
---|
| 723 | ;"Purpose: This is the code that actually does writing of labels etc for output
|
---|
| 724 | ;" This is a CUSTOM CALL BACK function called by Write1Fld^TMGXMLE2
|
---|
| 725 | ;"Input: Label -- OPTIONAL -- Name of label, to write after 'label='
|
---|
| 726 | ;" Field -- OPTIONAL -- Name of field, to write after 'id='
|
---|
| 727 | ;" Type -- OPTIONAL -- Typeof field, to write after 'type='
|
---|
| 728 | ;" Ender -- OPTIONAL if 1, then ends field.
|
---|
| 729 | ;"Results: none.
|
---|
| 730 | ;"Note: Used by DumpRec2 above, with callback from TMGXMLE2
|
---|
| 731 |
|
---|
| 732 | ;"To write out <Field label="NAME" id=".01" type="FREE TEXT"> or </Field>
|
---|
| 733 |
|
---|
| 734 | if +$get(Ender)>0 do
|
---|
| 735 | . write !
|
---|
| 736 | else do
|
---|
| 737 | . new s set s=Field
|
---|
| 738 | . if $get(Field)'="" write $$RJ^XLFSTR(.s,6," "),"-"
|
---|
| 739 | . if $get(Label)'="" write Label," "
|
---|
| 740 | . ;"if $get(Type)'="" write "type=""",Type,""" "
|
---|
| 741 | . write ": "
|
---|
| 742 |
|
---|
| 743 | quit
|
---|
| 744 |
|
---|
| 745 |
|
---|
| 746 | WriteLine(Line)
|
---|
| 747 | ;"Purpose: To actually write out labels for record starting and ending.
|
---|
| 748 | ;"Input: Line -- The line of text to be written out.
|
---|
| 749 | ;"Results: none.
|
---|
| 750 | ;"Note: Used by DumpRec2 above, with callback from TMGXMLE2
|
---|
| 751 |
|
---|
| 752 | write line
|
---|
| 753 | quit
|
---|
| 754 |
|
---|
| 755 |
|
---|
| 756 | WriteWPLine(Line)
|
---|
| 757 | ;"Purpose: To actually write out line from WP field
|
---|
| 758 | ;"Input: Line -- The line of text to be written out.
|
---|
| 759 | ;"Results: none.
|
---|
| 760 | ;"Note: Used by DumpRec2 above, with callback from TMGXMLE2
|
---|
| 761 |
|
---|
| 762 | write line,!
|
---|
| 763 | quit
|
---|
| 764 |
|
---|