Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: HLEVSRV

HLEVSRV.m

Go to the documentation of this file.
HLEVSRV ;O-OIFO/LJA - Event Monitor SERVER ;02/04/2004 14:42
 ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
 ;
 ; Send email to S.XQSCHK@SITE.DOMAIN.EXT to check server status.
 ; (Include the name of server (w/o S.) in body of message.)
 ;
SERVER ; Called to get information about local monitoring system
 N ADDREQHD,MXEC,NOW,XMER,XMPOS,XMRG,XTMP
 ;
 ;[M]S MXEC=$$MST^HLEVSRV1 ; Is M code execution allowed?
 ;
 S NOW=$$NOW^XLFDT,XTMP="HLEV SERVER "_NOW
 S ^XTMP(XTMP,0)=$$FMADD^XLFDT(NOW,2)_U_NOW_"^HLEV SERVER REQUEST^"_$G(XMFROM)
 ;
 I $G(XMZ)'>0!($G(XMREC)']"") D  QUIT  ;->
 .  S ^XTMP(XTMP,"ERR")="No XMZ or XMREC"
 ;
 S ^XTMP(XTMP,"MAIL")=XMZ
 ;
 S XMPOS=""
 ;
READ ; Sequentially read thru message
 X XMREC
 I $D(XMER) G PROCESS:XMER<0 ;->
 D ADDLINE(XMRG)
 G READ ;->
 ;
 ;======================================================================
 ;
PROCESS ; Multiple "data request" formats possible...
 ;[M]; MXEC -- req
 N SUB
 ;
 D EXTRACT
 D REQBACK ; Echo what was requested
 ;
 ;[M]S MXEC=$P(MXEC,U)+$P(MXEC,U,4)
 ;[M]I MXEC=2 D  QUIT:$G(HLEVQUIT)  ;-> Pre-load M code execution
 ;[M].  D MPRE^HLEVSRV0
 D LOADATA
 ;[M]I MXEC=2 D  QUIT:$G(HLEVQUIT)  ;-> Post-load M code execution
 ;[M].  D MPST^HLEVSRV0
 ;[M].  D MCOND^HLEVSRV0
 ;[M].  D MCALLREC^HLEVSRV0
 ;[M].  D MTEXT^HLEVSRV0
 D XTMPMAIL ; Place at bottom of message XTMP value
 D MAILIT
 D KILLS
 ;
 Q
 ;
 ;======================================================================
 ;
EXTRACT ; Extract out the work list...
 ; XTMP -- req
 N CT,FILE,LNO,TXT
 S LNO=0,CT=0
 F  S LNO=$O(^XTMP(XTMP,"RQ",LNO)) Q:LNO'>0  D
 .  S TXT=$$CHKREQ($G(^XTMP(XTMP,"RQ",LNO))) QUIT:TXT']""  ;->
 .  S FILE=$P(TXT,U) ; Type of request in "FILE"...
 .
 .  ; There are 3 types of "data requests"...
 .  I FILE="QUERY" D EXTQUERY($P(TXT,U,2,99)) QUIT  ;-> $QUERY format...
 .  I FILE="UNIT" D UNIT^HLEVSRV0($P(TXT,U,2,99)) QUIT  ;-> Msg ID
 .  I $$OKFILE(+FILE) D EXTFILE(TXT) QUIT  ;->
 .
 .  ; If not a data request, must be a non-VistA HL7 request.  And,
 .  ; if so, they have to pass a license
 .  I FILE="LICENSE" D CHKLIC^HLEVSRV4($P(TXT,U,2,99),$G(XMFROM)) QUIT  ;->
 .
 .  D ADDREQHD,ADDREQ("Error (HEADER)^"_TXT)
 Q
 ;
CHKREQ(TXT) ; Check request, strip comments, etc...
 N I
 ;
 ; Strip comments...
 I $L(TXT,";")>1 S TXT=$P(TXT,";",1,$L(TXT,";")-1)
 ;
 ; Ignore blank lines, and dashed lines...
 QUIT:$TR(TXT," -=;")']"" "" ;->
 ;
 ; Strip leading and trailing spaces...
 X "F I=1:1:$L(TXT) Q:$E(TXT,I)'="" """ S TXT=$E(TXT,I,999) ; Leading
 X "F I=$L(TXT):-1:1 Q:$E(TXT,I)'="" """ S TXT=$E(TXT,1,I) ;  Trailing
 ;
 Q TXT
 ;
LOADATA ; Process the work list...
 D LOADFNO
 D LOADQRY
 D LOADUNIT^HLEVSRV0 ; Msg ID-related data
 D GBLTOXM^HLEVSRV1 ; 776 format data to send back
 Q
 ;
LOADFNO ; Load data from file number...
 N FILE,NODE,WHAT
 D ADDMAIL("")
 S FILE=0
 F  S FILE=$O(^XTMP(XTMP,"HLEV PROC","F",FILE)) Q:FILE'>0  D
 .  S WHAT=""
 .  F  S WHAT=$O(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT)) Q:WHAT']""  D
 .  .  S NODE=""
 .  .  F  S NODE=$O(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE)) Q:NODE']""  D
 .  .  .  S LIMIT=$G(^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE))
 .  .  .  D LOAD(FILE,WHAT,NODE,LIMIT)
 Q
 ;
LOADQRY ; Load $QUERY data...
 N NO
 ;
 QUIT:'$D(^XTMP(XTMP,"HLQUERY"))  ;->
 D ADDMAIL("")
 D ADDMAIL("$QUERY Data"),ADDMAIL($$REPEAT^XLFSTR("-",74))
 ;
 ; Load $QUERY format data...
 S NO=0
 F  S NO=$O(^XTMP(XTMP,"HLQUERY",NO)) Q:NO'>0  D
 .  D LOADQ(^XTMP(XTMP,"HLQUERY",+NO))
 ;
 Q
 ;
REQBACK ; Send back what was requested...
 N SNO
 ;
 S SNO=0
 F  S SNO=$O(^XTMP(XTMP,"HLREQ",SNO)) Q:SNO'>0  D
 .  D ADDMAIL(^XTMP(XTMP,"HLREQ",SNO))
 ;
 Q
 ;
XTMPMAIL ; Add XTMP reference to bottom of email...
 D ADDMAIL(""),ADDMAIL("")
 D ADDMAIL("Remote request by: "_$G(XMFROM)),ADDMAIL("")
 D ADDMAIL("[Query log stored in ^XTMP("""_XTMP_""") at site.]")
 Q
 ;
MAILIT ; Mail report back to HL7 mail group...
 ; XTMP -- req
 N NO,TEXT,X,XMDUZ,XMSUB,XMTEXT,XMZ
 S XMDUZ=.5,XMTEXT="^XTMP("""_XTMP_""",""HLMAIL"","
 S X=$$SITE^VASITE,XMSUB="HLEV SERVER REQUEST "_$P(X,U,2)_" [#"_$P(X,U,3)_"]"
 ;
 ; Only send to VistA HL7 team members!!!!
 S XMY("HL7SystemMonitoring@domain.ext")=""
 ;
 D ^XMD
 ;
 S $P(^XTMP(XTMP,"MAIL"),U,2)=$G(XMZ)
 ;
 QUIT
 ;
KILLS ; Remove unwanted ^XTMP subscripts...
 F SUB="DATA","HLEV PROC","HLMAIL","HLUNIT","HLQUERY","HLREQ","M","MTXT" D
 .  KILL ^XTMP(XTMP,SUB)
 ;
 Q
 ;
 ; =====================================================================
 ;
LOAD(FILE,WHAT,NODE,LIMIT) ;
 N CT,DATA,GBL,IEN
 ;
 S LIMIT=$G(LIMIT)
 S GBL=$$GBLFILE(+FILE) QUIT:GBL']""  ;->
 ;
 ; If passed in an IEN...
 I WHAT=+WHAT D LOADONE(FILE,+WHAT,NODE),ADDMAIL("")
 ;
 ; Check to make sure it is ALL...
 QUIT:WHAT'["ALL"  ;->
 ;
 S IEN=0,CT=0,LIMIT=$S(LIMIT:LIMIT,1:99999)
 F  S IEN=$O(@GBL@(IEN)) Q:IEN'>0!(CT>(LIMIT-1))  D
 .  D LOADONE(FILE,+IEN,NODE,LIMIT)
 .  S CT=CT+1
 ;
 I CT D ADDMAIL("")
 ;
 Q
 ;
LOADONE(FILE,IEN,NODE,LIMIT) ; Load one entry...
 N DATA,GBL,MIEN,MONM,ND,TXT
 ;
 S LIMIT=$G(LIMIT)
 S GBL=$$GBLFILE(+FILE) QUIT:GBL']""  ;->
 ;
 ; Node (not multiple or WP) requested...
 I $D(@GBL@(+IEN,NODE))#2 D  QUIT  ;->
 .  S DATA=$G(@GBL@(+IEN,NODE))
 .  S ^XTMP(XTMP,"DATA",FILE,+IEN,NODE)=DATA
 ;
 Q
 ;
 ; =====================================================================
 ;
EXTFILE(TXT) ; Extract 776 data...
 N FILE,GBL,LIMIT,LOOPI,NODES,WHAT
 ;
 ; Sets...
 S FILE=+TXT,GBL=$$GBLFILE(FILE) QUIT:GBL']""  ;->
 S WHAT=$P(TXT,U,2)
 I WHAT']"" S WHAT="ALL"
 I WHAT=+WHAT QUIT:$G(@GBL@(+WHAT,0))']""  ;->
 S NODES=$TR($P(TXT,U,3),"~",U),LIMIT=$P(TXT,U,4)
 ;
 ; Build nodes requested list...
 F LOOPI=1:1:$L(NODES,U) S NODE=$P(NODES,U,LOOPI) I NODE]"" D
 .  S ^XTMP(XTMP,"HLEV PROC","F",FILE,WHAT,NODE)=LIMIT
 .  D ADDREQHD
 .  S TXT=$E("[#1] "_FILE_$S(LIMIT:" #"_LIMIT,1:"")_$$REPEAT^XLFSTR(" ",18),1,18)
 .  I LOOPI>1 S LIMIT=""
 .  S TXT=TXT_$E("[#2] "_$S(WHAT=+WHAT:"#"_WHAT,1:WHAT)_$$REPEAT^XLFSTR(" ",18),1,18)
 .  S TXT=TXT_"[#3] "_NODE
 .  D ADDREQ(TXT)
 ;
 Q
 ;
GBLFILE(FILE) ; Return closed global root...
 N CH,GBL
 S GBL=$G(^DIC(+FILE,0,"GL"))
 S CH=$E(GBL,$L(GBL))
 I CH="," QUIT $E(GBL,1,$L(GBL)-1)_")" ;->
 I CH="(" QUIT $E(GBL,1,$L(GBL)-1)
 Q ""
 ;
EXTQUERY(VAL) ; Extract $QUERY format requests...
 ;
 ; Format:  p(1) = $QUERY reference.  (E.g., "^DPT(25)")
 ;          p(2) = $QUERY stop value. (E.g., "^DPT(25,")
 ;          p(3) = # lines limit
 ;          p(4) = Screen format (E.g., "^DPT(#,0)")
 ;
 N LPVAL,NO,NOLINE,SCREEN,STOP
 ;
 ; Get values...
 QUIT:'$$OKVARSQ(VAL)  ;->
 ;
 ; Loop and collect now...
 S NO=$O(^XTMP(XTMP,"HLQUERY",":"),-1)+1
 S ^XTMP(XTMP,"HLQUERY",+NO)=VAL
 ;
 ; Add to list of items being queried...
 S TXT=""
 F PCE=1:1:$L(VAL,U) D
 .  S DATA=$P(VAL,U,PCE)
 .  I PCE=1!(PCE=2)!(PCE=4) S DATA=U_DATA
 .  I PCE=3 D
 .  .  I DATA']"" S DATA="[1000]"
 .  .  S DATA=" "_DATA
 .  S DATA="[#"_PCE_"]"_DATA
 .  I $L(DATA)>15 S DATA=$P(DATA,"]",2,99)
 .  S DATA=$S($L(DATA)>15:DATA_" ",1:$E(DATA_$$REPEAT^XLFSTR(" ",15),1,15))
 .  S TXT=TXT_$S(TXT]"":"   ",1:"")_DATA
 ;
 I TXT]"" D
 .  D ADDREQHD
 .  D ADDREQ(TXT)
 ;
 Q
 ;
OKVARSQ(VAL)  ; Are variables OK for $QUERY looping?
 ; Defines (and "leaves around") LPVAL,STOP,NOLINE,SCREEN...
 S (LPVAL,NOLINE,SCREEN,STOP)=""
 S LPVAL=U_$P(VAL,U) S X="W "_LPVAL D ^DIM QUIT:'$D(X) "" ;->
 QUIT:$E(LPVAL,1,3)'="^HL"&($E(LPVAL,1,8)'="^ORD(101") "" ;->
 S STOP=U_$P(VAL,U,2) S X="W "_STOP_"25)" D ^DIM QUIT:'$D(X) "" ;->
 S X=$P(VAL,U,3),NOLINE=$S(X>1000:1000,X>0:X,1:1000)
 S SCREEN=$P(VAL,U,4) I SCREEN]"" D  QUIT:'$D(X) "" ;->
 .  S SCREEN=U_SCREEN
 .  S X="W "_$TR(SCREEN,"#",1) D ^DIM
 QUIT 1
 ;
LOADQ(VAL) ; Load $QUERY format data...
 N CT,LPVAL,NO,NOLINE,POSX,REF,SCREEN,STOP,TXT
 ;
 ; Already checked format. But, this call sets up looping variables...
 QUIT:'$$OKVARSQ(VAL)  ;->
 ;
 S CT=0
 F  S LPVAL=$Q(@LPVAL) Q:$$QUITQ^HLEVSRV0(LPVAL,STOP,NOLINE,CT)  D
 .  I SCREEN]"" QUIT:$$QUITS^HLEVSRV0(LPVAL,SCREEN)  ;->
 .  S REF=LPVAL_"=",POSX=$L(REF)
 .  S DATA=@LPVAL,CT=CT+1
 .  F  D  QUIT:$TR(REF," ","")']""&(DATA']"")
 .  .  S TXT=REF_$E(DATA,1,74-$L(REF))
 .  .  D ADDMAIL(TXT)
 .  .  S CT=CT+1
 .  .  S DATA=$E(DATA,74-$L(REF)+1,999)
 .  .  S REF=$$REPEAT^XLFSTR(" ",POSX)
 ;
 I CT D ADDMAIL("")
 ;
 Q
 ;
 ; =====================================================================
 ;
ADDREQHD ; Add Header to request record in email...
 S ADDREQHD=$G(ADDREQHD)+1 QUIT:ADDREQHD>1  ;->
 D ADDREQ(""),ADDREQ("Data Requests")
 D ADDREQ($$REPEAT^XLFSTR("-",74))
 Q
 ;
ADDLINE(XMRG) ; Add read line of text to ^TMP...
 N LNO
 S LNO=$O(^XTMP(XTMP,"RQ",":"),-1)+1
 S ^XTMP(XTMP,"RQ",+LNO)=XMRG
 Q
 ;
ADDREQ(TXT) ; Add data request to be added to ^XTMP(XTMP,"HLMAIL") later
 N SNO
 S SNO=$O(^XTMP(XTMP,"HLREQ",":"),-1)+1
 S ^XTMP(XTMP,"HLREQ",+SNO)=TXT
 Q
 ;
ADDMAIL(TXT) D ADDMAIL^HLEVSRV2(TXT)
 Q
 ;
OKFILE(FILE) QUIT:+FILE=101 1 ;->
 I FILE>769.99999&(FILE<870) QUIT 1 ;->
 Q ""
 ;
EOR ;HLEVSRV - Event Monitor SERVER ;5/16/03 14:42