| 1 | HLEVSRV ;O-OIFO/LJA - Event Monitor SERVER ;02/04/2004 14:42 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Send email to S.XQSCHK@SITE.VA.GOV to check server status. | 
|---|
| 5 | ; (Include the name of server (w/o S.) in body of message.) | 
|---|
| 6 | ; | 
|---|
| 7 | SERVER ; Called to get information about local monitoring system | 
|---|
| 8 | N ADDREQHD,MXEC,NOW,XMER,XMPOS,XMRG,XTMP | 
|---|
| 9 | ; | 
|---|
| 10 | ;[M]S MXEC=$$MST^HLEVSRV1 ; Is M code execution allowed? | 
|---|
| 11 | ; | 
|---|
| 12 | S NOW=$$NOW^XLFDT,XTMP="HLEV SERVER "_NOW | 
|---|
| 13 | S ^XTMP(XTMP,0)=$$FMADD^XLFDT(NOW,2)_U_NOW_"^HLEV SERVER REQUEST^"_$G(XMFROM) | 
|---|
| 14 | ; | 
|---|
| 15 | I $G(XMZ)'>0!($G(XMREC)']"") D  QUIT  ;-> | 
|---|
| 16 | .  S ^XTMP(XTMP,"ERR")="No XMZ or XMREC" | 
|---|
| 17 | ; | 
|---|
| 18 | S ^XTMP(XTMP,"MAIL")=XMZ | 
|---|
| 19 | ; | 
|---|
| 20 | S XMPOS="" | 
|---|
| 21 | ; | 
|---|
| 22 | READ ; Sequentially read thru message | 
|---|
| 23 | X XMREC | 
|---|
| 24 | I $D(XMER) G PROCESS:XMER<0 ;-> | 
|---|
| 25 | D ADDLINE(XMRG) | 
|---|
| 26 | G READ ;-> | 
|---|
| 27 | ; | 
|---|
| 28 | ;====================================================================== | 
|---|
| 29 | ; | 
|---|
| 30 | PROCESS ; Multiple "data request" formats possible... | 
|---|
| 31 | ;[M]; MXEC -- req | 
|---|
| 32 | N SUB | 
|---|
| 33 | ; | 
|---|
| 34 | D EXTRACT | 
|---|
| 35 | D REQBACK ; Echo what was requested | 
|---|
| 36 | ; | 
|---|
| 37 | ;[M]S MXEC=$P(MXEC,U)+$P(MXEC,U,4) | 
|---|
| 38 | ;[M]I MXEC=2 D  QUIT:$G(HLEVQUIT)  ;-> Pre-load M code execution | 
|---|
| 39 | ;[M].  D MPRE^HLEVSRV0 | 
|---|
| 40 | D LOADATA | 
|---|
| 41 | ;[M]I MXEC=2 D  QUIT:$G(HLEVQUIT)  ;-> Post-load M code execution | 
|---|
| 42 | ;[M].  D MPST^HLEVSRV0 | 
|---|
| 43 | ;[M].  D MCOND^HLEVSRV0 | 
|---|
| 44 | ;[M].  D MCALLREC^HLEVSRV0 | 
|---|
| 45 | ;[M].  D MTEXT^HLEVSRV0 | 
|---|
| 46 | D XTMPMAIL ; Place at bottom of message XTMP value | 
|---|
| 47 | D MAILIT | 
|---|
| 48 | D KILLS | 
|---|
| 49 | ; | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | ;====================================================================== | 
|---|
| 53 | ; | 
|---|
| 54 | EXTRACT ; Extract out the work list... | 
|---|
| 55 | ; XTMP -- req | 
|---|
| 56 | N CT,FILE,LNO,TXT | 
|---|
| 57 | S LNO=0,CT=0 | 
|---|
| 58 | F  S LNO=$O(^XTMP(XTMP,"RQ",LNO)) Q:LNO'>0  D | 
|---|
| 59 | .  S TXT=$$CHKREQ($G(^XTMP(XTMP,"RQ",LNO))) QUIT:TXT']""  ;-> | 
|---|
| 60 | .  S FILE=$P(TXT,U) ; Type of request in "FILE"... | 
|---|
| 61 | . | 
|---|
| 62 | .  ; There are 3 types of "data requests"... | 
|---|
| 63 | .  I FILE="QUERY" D EXTQUERY($P(TXT,U,2,99)) QUIT  ;-> $QUERY format... | 
|---|
| 64 | .  I FILE="UNIT" D UNIT^HLEVSRV0($P(TXT,U,2,99)) QUIT  ;-> Msg ID | 
|---|
| 65 | .  I $$OKFILE(+FILE) D EXTFILE(TXT) QUIT  ;-> | 
|---|
| 66 | . | 
|---|
| 67 | .  ; If not a data request, must be a non-VistA HL7 request.  And, | 
|---|
| 68 | .  ; if so, they have to pass a license | 
|---|
| 69 | .  I FILE="LICENSE" D CHKLIC^HLEVSRV4($P(TXT,U,2,99),$G(XMFROM)) QUIT  ;-> | 
|---|
| 70 | . | 
|---|
| 71 | .  D ADDREQHD,ADDREQ("Error (HEADER)^"_TXT) | 
|---|
| 72 | Q | 
|---|
| 73 | ; | 
|---|
| 74 | CHKREQ(TXT) ; Check request, strip comments, etc... | 
|---|
| 75 | N I | 
|---|
| 76 | ; | 
|---|
| 77 | ; Strip comments... | 
|---|
| 78 | I $L(TXT,";")>1 S TXT=$P(TXT,";",1,$L(TXT,";")-1) | 
|---|
| 79 | ; | 
|---|
| 80 | ; Ignore blank lines, and dashed lines... | 
|---|
| 81 | QUIT:$TR(TXT," -=;")']"" "" ;-> | 
|---|
| 82 | ; | 
|---|
| 83 | ; Strip leading and trailing spaces... | 
|---|
| 84 | X "F I=1:1:$L(TXT) Q:$E(TXT,I)'="" """ S TXT=$E(TXT,I,999) ; Leading | 
|---|
| 85 | X "F I=$L(TXT):-1:1 Q:$E(TXT,I)'="" """ S TXT=$E(TXT,1,I) ;  Trailing | 
|---|
| 86 | ; | 
|---|
| 87 | Q TXT | 
|---|
| 88 | ; | 
|---|
| 89 | LOADATA ; Process the work list... | 
|---|
| 90 | D LOADFNO | 
|---|
| 91 | D LOADQRY | 
|---|
| 92 | D LOADUNIT^HLEVSRV0 ; Msg ID-related data | 
|---|
| 93 | D GBLTOXM^HLEVSRV1 ; 776 format data to send back | 
|---|
| 94 | Q | 
|---|
| 95 | ; | 
|---|
| 96 | LOADFNO ; Load data from file number... | 
|---|
| 97 | N FILE,NODE,WHAT | 
|---|
| 98 | D ADDMAIL("") | 
|---|
| 99 | S FILE=0 | 
|---|
| 100 | F  S FILE=$O(^XTMP(XTMP,"HLEV PROC","F",FILE)) Q:FILE'>0  D | 
|---|
| 101 | .  S WHAT="" | 
|---|
| 102 | .  F  S WHAT=$O(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT)) Q:WHAT']""  D | 
|---|
| 103 | .  .  S NODE="" | 
|---|
| 104 | .  .  F  S NODE=$O(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE)) Q:NODE']""  D | 
|---|
| 105 | .  .  .  S LIMIT=$G(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE)) | 
|---|
| 106 | .  .  .  D LOAD(FILE,WHAT,NODE,LIMIT) | 
|---|
| 107 | Q | 
|---|
| 108 | ; | 
|---|
| 109 | LOADQRY ; Load $QUERY data... | 
|---|
| 110 | N NO | 
|---|
| 111 | ; | 
|---|
| 112 | QUIT:'$D(^XTMP(XTMP,"HLQUERY"))  ;-> | 
|---|
| 113 | D ADDMAIL("") | 
|---|
| 114 | D ADDMAIL("$QUERY Data"),ADDMAIL($$REPEAT^XLFSTR("-",74)) | 
|---|
| 115 | ; | 
|---|
| 116 | ; Load $QUERY format data... | 
|---|
| 117 | S NO=0 | 
|---|
| 118 | F  S NO=$O(^XTMP(XTMP,"HLQUERY",NO)) Q:NO'>0  D | 
|---|
| 119 | .  D LOADQ(^XTMP(XTMP,"HLQUERY",+NO)) | 
|---|
| 120 | ; | 
|---|
| 121 | Q | 
|---|
| 122 | ; | 
|---|
| 123 | REQBACK ; Send back what was requested... | 
|---|
| 124 | N SNO | 
|---|
| 125 | ; | 
|---|
| 126 | S SNO=0 | 
|---|
| 127 | F  S SNO=$O(^XTMP(XTMP,"HLREQ",SNO)) Q:SNO'>0  D | 
|---|
| 128 | .  D ADDMAIL(^XTMP(XTMP,"HLREQ",SNO)) | 
|---|
| 129 | ; | 
|---|
| 130 | Q | 
|---|
| 131 | ; | 
|---|
| 132 | XTMPMAIL ; Add XTMP reference to bottom of email... | 
|---|
| 133 | D ADDMAIL(""),ADDMAIL("") | 
|---|
| 134 | D ADDMAIL("Remote request by: "_$G(XMFROM)),ADDMAIL("") | 
|---|
| 135 | D ADDMAIL("[Query log stored in ^XTMP("""_XTMP_""") at site.]") | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | MAILIT ; Mail report back to HL7 mail group... | 
|---|
| 139 | ; XTMP -- req | 
|---|
| 140 | N NO,TEXT,X,XMDUZ,XMSUB,XMTEXT,XMZ | 
|---|
| 141 | S XMDUZ=.5,XMTEXT="^XTMP("""_XTMP_""",""HLMAIL""," | 
|---|
| 142 | S X=$$SITE^VASITE,XMSUB="HLEV SERVER REQUEST "_$P(X,U,2)_" [#"_$P(X,U,3)_"]" | 
|---|
| 143 | ; | 
|---|
| 144 | ; Only send to VistA HL7 team members!!!! | 
|---|
| 145 | S XMY("HL7SystemMonitoring@med.va.gov")="" | 
|---|
| 146 | ; | 
|---|
| 147 | D ^XMD | 
|---|
| 148 | ; | 
|---|
| 149 | S $P(^XTMP(XTMP,"MAIL"),U,2)=$G(XMZ) | 
|---|
| 150 | ; | 
|---|
| 151 | QUIT | 
|---|
| 152 | ; | 
|---|
| 153 | KILLS ; Remove unwanted ^XTMP subscripts... | 
|---|
| 154 | F SUB="DATA","HLEV PROC","HLMAIL","HLUNIT","HLQUERY","HLREQ","M","MTXT" D | 
|---|
| 155 | .  KILL ^XTMP(XTMP,SUB) | 
|---|
| 156 | ; | 
|---|
| 157 | Q | 
|---|
| 158 | ; | 
|---|
| 159 | ; ===================================================================== | 
|---|
| 160 | ; | 
|---|
| 161 | LOAD(FILE,WHAT,NODE,LIMIT) ; | 
|---|
| 162 | N CT,DATA,GBL,IEN | 
|---|
| 163 | ; | 
|---|
| 164 | S LIMIT=$G(LIMIT) | 
|---|
| 165 | S GBL=$$GBLFILE(+FILE) QUIT:GBL']""  ;-> | 
|---|
| 166 | ; | 
|---|
| 167 | ; If passed in an IEN... | 
|---|
| 168 | I WHAT=+WHAT D LOADONE(FILE,+WHAT,NODE),ADDMAIL("") | 
|---|
| 169 | ; | 
|---|
| 170 | ; Check to make sure it is ALL... | 
|---|
| 171 | QUIT:WHAT'["ALL"  ;-> | 
|---|
| 172 | ; | 
|---|
| 173 | S IEN=0,CT=0,LIMIT=$S(LIMIT:LIMIT,1:99999) | 
|---|
| 174 | F  S IEN=$O(@GBL@(IEN)) Q:IEN'>0!(CT>(LIMIT-1))  D | 
|---|
| 175 | .  D LOADONE(FILE,+IEN,NODE,LIMIT) | 
|---|
| 176 | .  S CT=CT+1 | 
|---|
| 177 | ; | 
|---|
| 178 | I CT D ADDMAIL("") | 
|---|
| 179 | ; | 
|---|
| 180 | Q | 
|---|
| 181 | ; | 
|---|
| 182 | LOADONE(FILE,IEN,NODE,LIMIT) ; Load one entry... | 
|---|
| 183 | N DATA,GBL,MIEN,MONM,ND,TXT | 
|---|
| 184 | ; | 
|---|
| 185 | S LIMIT=$G(LIMIT) | 
|---|
| 186 | S GBL=$$GBLFILE(+FILE) QUIT:GBL']""  ;-> | 
|---|
| 187 | ; | 
|---|
| 188 | ; Node (not multiple or WP) requested... | 
|---|
| 189 | I $D(@GBL@(+IEN,NODE))#2 D  QUIT  ;-> | 
|---|
| 190 | .  S DATA=$G(@GBL@(+IEN,NODE)) | 
|---|
| 191 | .  S ^XTMP(XTMP,"DATA",FILE,+IEN,NODE)=DATA | 
|---|
| 192 | ; | 
|---|
| 193 | Q | 
|---|
| 194 | ; | 
|---|
| 195 | ; ===================================================================== | 
|---|
| 196 | ; | 
|---|
| 197 | EXTFILE(TXT) ; Extract 776 data... | 
|---|
| 198 | N FILE,GBL,LIMIT,LOOPI,NODES,WHAT | 
|---|
| 199 | ; | 
|---|
| 200 | ; Sets... | 
|---|
| 201 | S FILE=+TXT,GBL=$$GBLFILE(FILE) QUIT:GBL']""  ;-> | 
|---|
| 202 | S WHAT=$P(TXT,U,2) | 
|---|
| 203 | I WHAT']"" S WHAT="ALL" | 
|---|
| 204 | I WHAT=+WHAT QUIT:$G(@GBL@(+WHAT,0))']""  ;-> | 
|---|
| 205 | S NODES=$TR($P(TXT,U,3),"~",U),LIMIT=$P(TXT,U,4) | 
|---|
| 206 | ; | 
|---|
| 207 | ; Build nodes requested list... | 
|---|
| 208 | F LOOPI=1:1:$L(NODES,U) S NODE=$P(NODES,U,LOOPI) I NODE]"" D | 
|---|
| 209 | .  S ^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE)=LIMIT | 
|---|
| 210 | .  D ADDREQHD | 
|---|
| 211 | .  S TXT=$E("[#1] "_FILE_$S(LIMIT:" #"_LIMIT,1:"")_$$REPEAT^XLFSTR(" ",18),1,18) | 
|---|
| 212 | .  I LOOPI>1 S LIMIT="" | 
|---|
| 213 | .  S TXT=TXT_$E("[#2] "_$S(WHAT=+WHAT:"#"_WHAT,1:WHAT)_$$REPEAT^XLFSTR(" ",18),1,18) | 
|---|
| 214 | .  S TXT=TXT_"[#3] "_NODE | 
|---|
| 215 | .  D ADDREQ(TXT) | 
|---|
| 216 | ; | 
|---|
| 217 | Q | 
|---|
| 218 | ; | 
|---|
| 219 | GBLFILE(FILE) ; Return closed global root... | 
|---|
| 220 | N CH,GBL | 
|---|
| 221 | S GBL=$G(^DIC(+FILE,0,"GL")) | 
|---|
| 222 | S CH=$E(GBL,$L(GBL)) | 
|---|
| 223 | I CH="," QUIT $E(GBL,1,$L(GBL)-1)_")" ;-> | 
|---|
| 224 | I CH="(" QUIT $E(GBL,1,$L(GBL)-1) | 
|---|
| 225 | Q "" | 
|---|
| 226 | ; | 
|---|
| 227 | EXTQUERY(VAL) ; Extract $QUERY format requests... | 
|---|
| 228 | ; | 
|---|
| 229 | ; Format:  p(1) = $QUERY reference.  (E.g., "^DPT(25)") | 
|---|
| 230 | ;          p(2) = $QUERY stop value. (E.g., "^DPT(25,") | 
|---|
| 231 | ;          p(3) = # lines limit | 
|---|
| 232 | ;          p(4) = Screen format (E.g., "^DPT(#,0)") | 
|---|
| 233 | ; | 
|---|
| 234 | N LPVAL,NO,NOLINE,SCREEN,STOP | 
|---|
| 235 | ; | 
|---|
| 236 | ; Get values... | 
|---|
| 237 | QUIT:'$$OKVARSQ(VAL)  ;-> | 
|---|
| 238 | ; | 
|---|
| 239 | ; Loop and collect now... | 
|---|
| 240 | S NO=$O(^XTMP(XTMP,"HLQUERY",":"),-1)+1 | 
|---|
| 241 | S ^XTMP(XTMP,"HLQUERY",+NO)=VAL | 
|---|
| 242 | ; | 
|---|
| 243 | ; Add to list of items being queried... | 
|---|
| 244 | S TXT="" | 
|---|
| 245 | F PCE=1:1:$L(VAL,U) D | 
|---|
| 246 | .  S DATA=$P(VAL,U,PCE) | 
|---|
| 247 | .  I PCE=1!(PCE=2)!(PCE=4) S DATA=U_DATA | 
|---|
| 248 | .  I PCE=3 D | 
|---|
| 249 | .  .  I DATA']"" S DATA="[1000]" | 
|---|
| 250 | .  .  S DATA=" "_DATA | 
|---|
| 251 | .  S DATA="[#"_PCE_"]"_DATA | 
|---|
| 252 | .  I $L(DATA)>15 S DATA=$P(DATA,"]",2,99) | 
|---|
| 253 | .  S DATA=$S($L(DATA)>15:DATA_" ",1:$E(DATA_$$REPEAT^XLFSTR(" ",15),1,15)) | 
|---|
| 254 | .  S TXT=TXT_$S(TXT]"":"   ",1:"")_DATA | 
|---|
| 255 | ; | 
|---|
| 256 | I TXT]"" D | 
|---|
| 257 | .  D ADDREQHD | 
|---|
| 258 | .  D ADDREQ(TXT) | 
|---|
| 259 | ; | 
|---|
| 260 | Q | 
|---|
| 261 | ; | 
|---|
| 262 | OKVARSQ(VAL)  ; Are variables OK for $QUERY looping? | 
|---|
| 263 | ; Defines (and "leaves around") LPVAL,STOP,NOLINE,SCREEN... | 
|---|
| 264 | S (LPVAL,NOLINE,SCREEN,STOP)="" | 
|---|
| 265 | S LPVAL=U_$P(VAL,U) S X="W "_LPVAL D ^DIM QUIT:'$D(X) "" ;-> | 
|---|
| 266 | QUIT:$E(LPVAL,1,3)'="^HL"&($E(LPVAL,1,8)'="^ORD(101") "" ;-> | 
|---|
| 267 | S STOP=U_$P(VAL,U,2) S X="W "_STOP_"25)" D ^DIM QUIT:'$D(X) "" ;-> | 
|---|
| 268 | S X=$P(VAL,U,3),NOLINE=$S(X>1000:1000,X>0:X,1:1000) | 
|---|
| 269 | S SCREEN=$P(VAL,U,4) I SCREEN]"" D  QUIT:'$D(X) "" ;-> | 
|---|
| 270 | .  S SCREEN=U_SCREEN | 
|---|
| 271 | .  S X="W "_$TR(SCREEN,"#",1) D ^DIM | 
|---|
| 272 | QUIT 1 | 
|---|
| 273 | ; | 
|---|
| 274 | LOADQ(VAL) ; Load $QUERY format data... | 
|---|
| 275 | N CT,LPVAL,NO,NOLINE,POSX,REF,SCREEN,STOP,TXT | 
|---|
| 276 | ; | 
|---|
| 277 | ; Already checked format. But, this call sets up looping variables... | 
|---|
| 278 | QUIT:'$$OKVARSQ(VAL)  ;-> | 
|---|
| 279 | ; | 
|---|
| 280 | S CT=0 | 
|---|
| 281 | F  S LPVAL=$Q(@LPVAL) Q:$$QUITQ^HLEVSRV0(LPVAL,STOP,NOLINE,CT)  D | 
|---|
| 282 | .  I SCREEN]"" QUIT:$$QUITS^HLEVSRV0(LPVAL,SCREEN)  ;-> | 
|---|
| 283 | .  S REF=LPVAL_"=",POSX=$L(REF) | 
|---|
| 284 | .  S DATA=@LPVAL,CT=CT+1 | 
|---|
| 285 | .  F  D  QUIT:$TR(REF," ","")']""&(DATA']"") | 
|---|
| 286 | .  .  S TXT=REF_$E(DATA,1,74-$L(REF)) | 
|---|
| 287 | .  .  D ADDMAIL(TXT) | 
|---|
| 288 | .  .  S CT=CT+1 | 
|---|
| 289 | .  .  S DATA=$E(DATA,74-$L(REF)+1,999) | 
|---|
| 290 | .  .  S REF=$$REPEAT^XLFSTR(" ",POSX) | 
|---|
| 291 | ; | 
|---|
| 292 | I CT D ADDMAIL("") | 
|---|
| 293 | ; | 
|---|
| 294 | Q | 
|---|
| 295 | ; | 
|---|
| 296 | ; ===================================================================== | 
|---|
| 297 | ; | 
|---|
| 298 | ADDREQHD ; Add Header to request record in email... | 
|---|
| 299 | S ADDREQHD=$G(ADDREQHD)+1 QUIT:ADDREQHD>1  ;-> | 
|---|
| 300 | D ADDREQ(""),ADDREQ("Data Requests") | 
|---|
| 301 | D ADDREQ($$REPEAT^XLFSTR("-",74)) | 
|---|
| 302 | Q | 
|---|
| 303 | ; | 
|---|
| 304 | ADDLINE(XMRG) ; Add read line of text to ^TMP... | 
|---|
| 305 | N LNO | 
|---|
| 306 | S LNO=$O(^XTMP(XTMP,"RQ",":"),-1)+1 | 
|---|
| 307 | S ^XTMP(XTMP,"RQ",+LNO)=XMRG | 
|---|
| 308 | Q | 
|---|
| 309 | ; | 
|---|
| 310 | ADDREQ(TXT) ; Add data request to be added to ^XTMP(XTMP,"HLMAIL") later | 
|---|
| 311 | N SNO | 
|---|
| 312 | S SNO=$O(^XTMP(XTMP,"HLREQ",":"),-1)+1 | 
|---|
| 313 | S ^XTMP(XTMP,"HLREQ",+SNO)=TXT | 
|---|
| 314 | Q | 
|---|
| 315 | ; | 
|---|
| 316 | ADDMAIL(TXT) D ADDMAIL^HLEVSRV2(TXT) | 
|---|
| 317 | Q | 
|---|
| 318 | ; | 
|---|
| 319 | OKFILE(FILE) QUIT:+FILE=101 1 ;-> | 
|---|
| 320 | I FILE>769.99999&(FILE<870) QUIT 1 ;-> | 
|---|
| 321 | Q "" | 
|---|
| 322 | ; | 
|---|
| 323 | EOR ;HLEVSRV - Event Monitor SERVER ;5/16/03 14:42 | 
|---|