| 1 | HLDIEDBG ;CIOFO-O/LJA - Direct 772 & 773 Sets DEBUG CODE ;12/29/03 10:39
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13,1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; D MENU^HLDIE to invoke debug menu.  Debugger documentation included.
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | MENU ; Additional documentation available in INIT^HLDIEDB1...
 | 
|---|
| 7 |  D INIT^HLDIEDB1
 | 
|---|
| 8 |  Q
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 | SETDEBUG ; Set or "unset" the DEBUG string...
 | 
|---|
| 11 |  N IOBOFF,IOBON,IOINHI,IOINORM,NEWSTR,STRING,X
 | 
|---|
| 12 |  W @IOF,$$CJ^XLFSTR("HLDIE Debug String Set/Unset Utility",IOM)
 | 
|---|
| 13 |  W !,$$REPEAT^XLFSTR("=",IOM)
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  S X="IOINHI;IOINORM" D ENDR^%ZISS
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ; Ask for a new string...
 | 
|---|
| 18 |  W !!,"When asked for a new debug string, you may take one of the following actions:"
 | 
|---|
| 19 |  W !!," * Enter RETURN or '^' to exit."
 | 
|---|
| 20 |  W !," * Enter a debug string.  (E.g., '1' or '1^2' or '1^1^1'.)"
 | 
|---|
| 21 |  W !," * Enter '@' to delete the debug string, (If a debug string exists)."
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 | SET1 ;
 | 
|---|
| 24 |  ; Get current DEBUG value...
 | 
|---|
| 25 |  S STRING=$G(^XTMP("HLDIE-DEBUG","STATUS"))
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ; Show user current value...
 | 
|---|
| 28 |  W !!!!,"Current DEBUG string = ",IOINHI,STRING,IOINORM
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ; Get new debug string...
 | 
|---|
| 31 |  W !!,"Enter DEBUG string, ",$S(STRING]"":"'@', ",1:""),"or RETURN to exit: "
 | 
|---|
| 32 |  R NEWSTR:999 QUIT:'$T  ;->
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  ; Exit conditions...
 | 
|---|
| 35 |  I NEWSTR=U!(NEWSTR']"") D  QUIT  ;->
 | 
|---|
| 36 |  .  I STRING']"" D  QUIT  ;->
 | 
|---|
| 37 |  .  .  W "   no changes made.  Exiting... "
 | 
|---|
| 38 |  .  .  H 2
 | 
|---|
| 39 |  .  W !!,"No changes made.  (If you want to stop debugging, enter '"
 | 
|---|
| 40 |  .  W IOINHI,"@",IOINORM,"'.)  Exiting..."
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ; Reset to null if @...
 | 
|---|
| 43 |  I NEWSTR="@" S NEWSTR=""
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ; User didn't change anything!!!
 | 
|---|
| 46 |  I NEWSTR=STRING W "  no changes made... " G SET1 ;->
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  ; If debug string to be set to null...
 | 
|---|
| 49 |  I NEWSTR']"" D  G SET1 ;->
 | 
|---|
| 50 |  .  KILL ^XTMP("HLDIE-DEBUG","STATUS")
 | 
|---|
| 51 |  .  W "  stopped all debugging!"
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ; Debug string has text, so just set it...
 | 
|---|
| 54 |  S ^XTMP("HLDIE-DEBUG",0)=$$FMADD^XLFDT(DT,7)_U_$$NOW^XLFDT_U_"Control string for HLDIE debugging"
 | 
|---|
| 55 |  S ^XTMP("HLDIE-DEBUG","STATUS")=NEWSTR
 | 
|---|
| 56 |  W "  debugging set..."
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  Q
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 |  ; ================================================================
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | DEBUG(RTN,LOC,STORE,XEC) ; Store debug data... (Don't call unless all
 | 
|---|
| 65 |  ; checks have been made and debug data IS to be stored!)
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; ROOT() -- req
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; RTN -- Where (subrtn~rtn, usually) call to FILE^HLDIE made from.
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  ; LOC -- Location... BEFORE FILE^HLDIE call = 1
 | 
|---|
| 72 |  ;                    AFTER FILE^HLDIE call = 2
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ; STORE -- "" = Don't collect
 | 
|---|
| 75 |  ;           1 = Collect "select" (see above) data.
 | 
|---|
| 76 |  ;           2 = Collect "all" data.
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ; XEC -- If XEC=1 then S STORE=$$STORE^HLDIEDB0(RTN,LOC,STORE) is
 | 
|---|
| 79 |  ;        called to optionally change the value of STORE (and thus
 | 
|---|
| 80 |  ;        control whether data is stored.)
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  N CT,DEBUGNO,DEBUGNOW,HLFILE,HLIEN,INCRNO,NO,X,XTMP
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  S DEBUGNOW=$$NOW^XLFDT,DT=DEBUGNOW\1
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ; Get file and ien for storing in XTMP...
 | 
|---|
| 87 |  S FILE=$G(FILE),IEN=$G(IEN)
 | 
|---|
| 88 |  I FILE,IEN S HLFILE=FILE,HLIEN=IEN
 | 
|---|
| 89 |  I 'FILE!('IEN) D
 | 
|---|
| 90 |  .  S (HLFILE,HLIEN)=0
 | 
|---|
| 91 |  .  I $G(ROOT)]"" S HLFILE=$O(@ROOT@(0)),HLIEN=+$O(@ROOT@(+HLFILE,""))
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  ; Get storage number...
 | 
|---|
| 94 |  S DEBUGNO=$O(^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,":"),-1)+1
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  ; How many stored?  Can't store more than 20...
 | 
|---|
| 97 |  S CT=0,NO=0
 | 
|---|
| 98 |  F  S NO=$O(^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,NO)) Q:'NO  D
 | 
|---|
| 99 |  .  S CT=CT+1
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 |  ; If M code passed, check w/^DIM, then execute.
 | 
|---|
| 102 |  I XEC=1 S STORE=$$STORESCR^HLDIEDB2(RTN,LOC,STORE) QUIT:'STORE  ;->
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 | ERRESUME ; If $$STORESCR code errors, there has to be a place for
 | 
|---|
| 105 |  ; error trapping to GOTO.  This is that place...
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ; Quit if 20 occurences stored...
 | 
|---|
| 108 |  QUIT:CT'<20  ;->
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  ; Zero node & XTMP...
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  ; Debug data retained for 7 days...
 | 
|---|
| 113 |  S XTMP="HLDIE-DEBUG-"_DT
 | 
|---|
| 114 |  S:$G(^XTMP(XTMP,0))']"" ^XTMP(XTMP,0)=$$FMADD^XLFDT(DT,7)_U_DEBUGNOW_U_"Debug data created by HLDIEDBG routine"
 | 
|---|
| 115 |  ;
 | 
|---|
| 116 |  ; Xref data retain for 7 days from last time any DEBUG data created...
 | 
|---|
| 117 |  S XTMP="HLDIE-DEBUGX"
 | 
|---|
| 118 |  S:$G(^XTMP(XTMP,0))']"" ^XTMP(XTMP,0)=$$FMADD^XLFDT(DT,7)_U_$$NOW^XLFDT_U_"Debug data created by HLDIEDBG routine"
 | 
|---|
| 119 |  I $P(^XTMP(XTMP,0),U)'=$$FMADD^XLFDT(DT,7) S $P(^XTMP(XTMP,0),U)=$$FMADD^XLFDT(DT,7)
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 |  ; Get incremental number...
 | 
|---|
| 122 |  S INCRNO=$I(^XTMP("HLDIE-DEBUGN","N"),1)
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; Do following for STORE=1 and STORE=2...
 | 
|---|
| 125 |  S ^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,+DEBUGNO)=LOC_U_DEBUGNOW_U_$G(HLFILE)_U_$G(HLIEN)_U_$TR($P($G(XQY0),U,1,2),U,"~")_U_$TR($G(HLEDITOR),U,"~")
 | 
|---|
| 126 |  D STOREMSG(+$G(HLFILE),+$G(HLIEN),RTN,DEBUGNO,LOC,INCRNO)
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  ; Store "select" data...
 | 
|---|
| 129 |  I STORE=1,LOC'=2,$G(ROOT)]"" D  QUIT  ;->
 | 
|---|
| 130 |  .  MERGE ^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,+DEBUGNO)=@ROOT
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 |  QUIT:STORE'=2  ;->
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  ; Store "all" local variable data...
 | 
|---|
| 135 |  S X="^XTMP(""HLDIE-DEBUG-"_DT_""","_$J_","""_RTN_""","_DEBUGNO_","
 | 
|---|
| 136 |  D DOLRO^%ZOSV
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 |  D ONLYASC(X)
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 |  Q
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 | ONLYASC(REF) ; Convert control characters to {ASCII}...
 | 
|---|
| 143 |  N DATA,LP
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  S LP=$E(REF,1,$L(REF)-1)_")"
 | 
|---|
| 146 |  F  S LP=$Q(@LP) Q:LP'[REF  D
 | 
|---|
| 147 |  .  S DATA=$$ONLYASC^HLDIEDB0(@LP)
 | 
|---|
| 148 |  .  I $L(DATA),$TR(DATA," ","")']"" S DATA="{#"_$L(DATA)_" spaces}"
 | 
|---|
| 149 |  .  S @LP=DATA
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | STOREMSG(FILE,IEN,RTN,DEBUGNO,LOC,INCRNO) ; Store message data in ^XTMP...
 | 
|---|
| 154 |  ; DEBUGNOW -- req
 | 
|---|
| 155 |  N GBL,NODE
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; Set XREF XTMP...
 | 
|---|
| 158 |  S ^XTMP("HLDIE-DEBUGX",FILE,IEN,DEBUGNOW,$J,RTN,DEBUGNO)=LOC_U_$TR($G(HLEDITOR),U,"~")
 | 
|---|
| 159 |  S ^XTMP("HLDIE-DEBUGN","N",INCRNO)=FILE_U_IEN_U_DEBUGNOW_U_$J_U_RTN_U_DEBUGNO_U_LOC_U_$TR($G(HLEDITOR),U,"~")
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  ; Get GBL...
 | 
|---|
| 162 |  S GBL=$S(FILE=772:"^HL(772,"_IEN_")",1:"^HLMA("_IEN_")")
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 |  ; Collect message data...
 | 
|---|
| 165 |  F NODE=0,1,2,"P","S",$S(FILE=772:"IN",1:"MSH") D NODE(GBL,NODE)
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 |  Q
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 | NODE(GBL,NODE) ; Collect message data...
 | 
|---|
| 170 |  ; RTN,DEBUGNO -- req
 | 
|---|
| 171 |  N LAST,LNO,TXT,X
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  I NODE="MSH" D  QUIT  ;->
 | 
|---|
| 174 |  .  N LNO,TXT
 | 
|---|
| 175 |  .  S LNO=0
 | 
|---|
| 176 |  .  F  S LNO=$O(@GBL@("MSH",LNO)) Q:'LNO  D
 | 
|---|
| 177 |  .  .  S TXT=$G(@GBL@("MSH",+LNO,0)) QUIT:TXT']""  ;->
 | 
|---|
| 178 |  .  .  S ^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,DEBUGNO,"D","MSH",LNO,0)=TXT
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 |  I NODE="IN" D  QUIT  ;->
 | 
|---|
| 181 |  .  N LAST,TXT
 | 
|---|
| 182 |  .  S LAST=$O(@GBL@("IN",":"),-1)
 | 
|---|
| 183 |  .  S TXT=$G(@GBL@("IN",1,0)) QUIT:TXT']""  ;->
 | 
|---|
| 184 |  .  S ^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,DEBUGNO,"D","IN",1,0)=1_":"_LAST_"~"_TXT
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  ; Store node...
 | 
|---|
| 187 |  S X=$G(@GBL@(NODE)) I X]"" S ^XTMP("HLDIE-DEBUG-"_DT,$J,RTN,DEBUGNO,"D",NODE)=X
 | 
|---|
| 188 |  ;
 | 
|---|
| 189 |  Q
 | 
|---|
| 190 |  ;
 | 
|---|
| 191 | KILLALL ; Don't call here unless it's OK to remove ALL-ALL debug data...
 | 
|---|
| 192 |  N KILL,OFF,XTMP
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 |  I $O(^XTMP("HLDIE-DEBUG"))']"HLDIE-DEBUG" D  QUIT  ;->
 | 
|---|
| 195 |  .  W !!,"No debug data exists..."
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 |  W !
 | 
|---|
| 198 |  S KILL=$$YN^HLCSRPT4("Kill **ALL** debug data","No")
 | 
|---|
| 199 |  I 'KILL W "  no data will be killed..." QUIT  ;->
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  W !!,"KILLing all debug data..."
 | 
|---|
| 202 |  S XTMP="HLDIE-DEBUG"
 | 
|---|
| 203 |  F  S XTMP=$O(^XTMP(XTMP)) Q:XTMP'["HLDIE-DEBUG"  D
 | 
|---|
| 204 |  .  KILL ^XTMP(XTMP)
 | 
|---|
| 205 |  ;
 | 
|---|
| 206 |  Q
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 | LOG(SUBSV,KEEP,STOP) ; Log local vars into ^XTMP("HLDIE "_DT)...
 | 
|---|
| 209 |  ;
 | 
|---|
| 210 |  ; Documentation in MENU^HLDIE...
 | 
|---|
| 211 |  ;
 | 
|---|
| 212 |  N NO,NOW,NOXTMP,X,XTMP
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 |  ; Presets...
 | 
|---|
| 215 |  S SUBSV=$G(SUBSV),KEEP=$G(KEEP),STOP=$G(STOP),NOXTMP=0,NOW=$$NOW^XLFDT
 | 
|---|
| 216 |  S SUBSV=$TR($S(SUBSV]"":SUBSV,1:"UNKNOWN"),"""","")
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  ; # to keep setup...
 | 
|---|
| 219 |  S KEEP=$S(KEEP&(KEEP<100):KEEP,1:20)
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 |  ; XTMP setup...
 | 
|---|
| 222 |  S XTMP="HLDIE-"_DT
 | 
|---|
| 223 |  S:'$D(^XTMP(XTMP,0)) ^XTMP(XTMP,0)=$$FMADD^XLFDT(NOW,7)_U_$$NOW^XLFDT_U_"Data logged by LOG~HLDIE"
 | 
|---|
| 224 |  ;
 | 
|---|
| 225 |  ; Count number entries...
 | 
|---|
| 226 |  I STOP=1 D
 | 
|---|
| 227 |  .  S NOXTMP=0,NO=0
 | 
|---|
| 228 |  .  F  S NO=$O(^XTMP(XTMP,SUBSV,NO)) Q:'NO  D
 | 
|---|
| 229 |  .  .  S NOXTMP=NOXTMP+1
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 |  ; Incremented sequential store #...
 | 
|---|
| 232 |  S NO=$O(^XTMP(XTMP,SUBSV,":"),-1)+1
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 |  ; STOP now?
 | 
|---|
| 235 |  I STOP,NOXTMP'<KEEP QUIT  ;->
 | 
|---|
| 236 |  ;
 | 
|---|
| 237 |  ; Store all local variables...
 | 
|---|
| 238 |  S X="^XTMP("""_XTMP_""","""_SUBSV_""","_NO_"," D DOLRO^%ZOSV
 | 
|---|
| 239 |  S ^XTMP(XTMP,SUBSV,NO)=$$NOW^XLFDT
 | 
|---|
| 240 |  ;
 | 
|---|
| 241 |  I $ZE]"" S ^XTMP(XTMP,SUBSV,NO,"$ZE")=$ZE
 | 
|---|
| 242 |  ;
 | 
|---|
| 243 |  ; Keep only KEEP instances...
 | 
|---|
| 244 |  F NO=NO-KEEP:-1:1 KILL ^XTMP(XTMP,SUBSV,NO)
 | 
|---|
| 245 |  ;
 | 
|---|
| 246 |  Q
 | 
|---|
| 247 |  ;
 | 
|---|
| 248 | EOR ;HLDIEDBG - Direct 772 & 773 Sets DEBUG CODE ; 11/18/2003 11:17
 | 
|---|