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

BMXMEVN.m

Go to the documentation of this file.
  1. BMXMEVN ; IHS/OIT/HMW - BMXNet MONITOR ;
  1. ;;4.0;BMX;;JUN 28, 2010
  1. ;
  1. Q
  1. ;
  1. REGET ;EP
  1. ;Error trap from REGEVNT, RAISEVNT, and UNREG
  1. ;
  1. I '$D(BMXI) N BMXI S BMXI=999
  1. S BMXI=BMXI+1
  1. D REGERR(BMXI,99)
  1. Q
  1. ;
  1. REGERR(BMXI,BMXERID) ;Error processing
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)=BMXERID_$C(30)
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)=$C(31)
  1. Q
  1. ;
  1. REGEVNT(BMXY,BMXEVENT) ;EP
  1. ;RPC Called by BMX REGISTER EVENT to inform RPMS server
  1. ;of client's interest in BMXEVENT
  1. ;Returns RECORDSET with field ERRORID.
  1. ;If everything ok then ERRORID = 0;
  1. ;
  1. N BMXI
  1. S BMXI=0
  1. S X="REGET^BMXMEVN",@^%ZOSF("TRAP")
  1. S BMXY=$NA(^TMP("BMX",$J)) K @BMXY
  1. S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30)
  1. S ^TMP("BMX EVENT",$J,BMXEVENT)=$G(DUZ)
  1. ;
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31)
  1. Q
  1. ;
  1. RAISEVNT(BMXY,BMXEVENT,BMXPARAM,BMXBACK,BMXKEY) ;EP
  1. ;RPC Called to raise event BMXEVENT with parameter BMXPARAM
  1. ;If BMXBACK = 'TRUE' then event will be raised back to originator
  1. ;Calls EVENT
  1. ;Returns a RECORDSET wit the field ERRORID.
  1. ;If everything ok then ERRORID = 0;
  1. ;
  1. N BMXI,BMXORIG
  1. S BMXI=0
  1. S BMXORIG=$S($G(BMXBACK)="TRUE":"",1:$J)
  1. S BMXY=$NA(^TMP("BMX",$J)) K @BMXY
  1. S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30)
  1. S X="REGET^BMXMEVN",@^%ZOSF("TRAP")
  1. ;
  1. D EVENT(BMXEVENT,BMXPARAM,BMXORIG,$G(BMXKEY))
  1. ;
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31)
  1. Q
  1. ;
  1. EVENT(BMXEVENT,BMXPARAM,BMXORIG,BMXKEY) ;PEP - Raise event to interested clients
  1. ;Clients are listed in ^TMP("BMX EVENT",BMXEVENT,BMXSESS)=DUZ
  1. ;BMXORIG represents the event originator's session
  1. ;The event will not be raised back to the originator if BMXORIG is the session of the originator
  1. ;BMXKEY is a ~-delimited list of security keys. Only holders of one of these keys
  1. ;will receive event notification. If BMXKEY is "" then all registered sessions
  1. ;will be notified.
  1. ;
  1. L +^TMP("BMX EVENT RAISED"):30
  1. N BMXSESS,BMXINC
  1. S BMXSESS=0 F S BMXSESS=$O(^TMP("BMX EVENT",BMXSESS)) Q:'+BMXSESS D
  1. . I BMXSESS=$G(BMXORIG) Q
  1. . I '$D(^TMP("BMX EVENT",BMXSESS,BMXEVENT)) Q
  1. . ;S BMXDUZ=^TMP("BMX EVENT",BMXEVENT,BMXSESS)
  1. . S BMXDUZ=^TMP("BMX EVENT",BMXSESS,BMXEVENT)
  1. . ;TODO: Test if DUZ holds at least one of the keys in BMXKEY
  1. . S BMXINC=$O(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,99999999),-1)
  1. . S:BMXINC="" BMXINC=0
  1. . ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Set "_$NA(^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1))_"="_$G(BMXPARAM)
  1. . S ^TMP("BMX EVENT RAISED",BMXSESS,BMXEVENT,BMXINC+1)=$G(BMXPARAM) ;IHS/OIT/HMW SAC Exemption Applied For
  1. . Q
  1. L -^TMP("BMX EVENT RAISED")
  1. Q
  1. ;
  1. POLLD(BMXY) ;EP
  1. ;Debug Entry Point
  1. ;D DEBUG^%Serenji("POLLD^BMXMEVN(.BMXY)")
  1. Q
  1. ;
  1. POLL(BMXY) ;EP
  1. ;Check event queue for events of interest to current session
  1. ;Return DataSet of events and parameters
  1. ;Called by BMX EVENT POLL
  1. ;
  1. N BMXI,BMXEVENT
  1. S BMXI=0
  1. S X="POLLET^BMXMEVN",@^%ZOSF("TRAP")
  1. S BMXY=$NA(^TMP("BMX",$J)) K @BMXY
  1. S ^TMP("BMX",$J,0)="T00030EVENT"_U_"T00030PARAM"_$C(30)
  1. L +^TMP("BMX EVENT RAISED"):1 G:'$T POLLEND
  1. ;
  1. G:'$D(^TMP("BMX EVENT RAISED",$J)) POLLEND
  1. S BMXEVENT=0 F S BMXEVENT=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT)) Q:BMXEVENT']"" D
  1. . N BMXINC
  1. . S BMXINC=0
  1. . F S BMXINC=$O(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC)) Q:'+BMXINC D
  1. . . ;Set output array node
  1. . . S BMXPARAM=$G(^TMP("BMX EVENT RAISED",$J,BMXEVENT,BMXINC))
  1. . . S BMXI=BMXI+1
  1. . . S ^TMP("BMX",$J,BMXI)=BMXEVENT_U_BMXPARAM_$C(30)
  1. . . Q
  1. . Q
  1. ;S ^TMP("BMXTRACK",$P($H,",",2))="Job "_$J_" Killed "_$NA(^TMP("BMX EVENT RAISED",$J))
  1. K ^TMP("BMX EVENT RAISED",$J)
  1. ;
  1. POLLEND S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)=$C(31)
  1. L -^TMP("BMX EVENT RAISED")
  1. Q
  1. ;
  1. TTESTD(BMXY,BMXTIME) ;Debug entry point
  1. ;
  1. ;D DEBUG^%Serenji("TTEST^BMXMEVN(.BMXY,BMXTIME)")
  1. Q
  1. ;
  1. TTEST(BMXY,BMXTIME) ;EP Timer Test
  1. ;
  1. S X="REGET^BMXMEVN",@^%ZOSF("TRAP")
  1. S BMXY=$NA(^BMXTMP("BMX",$J)) K @BMXY
  1. S ^BMXTMP("BMX",$J,0)="I00020HANGTIME"_$C(30)
  1. I +BMXTIME H BMXTIME
  1. ;
  1. S BMXI=1
  1. S BMXI=BMXI+1
  1. S ^BMXTMP("BMX",$J,BMXI)=BMXTIME_$C(30)_$C(31)
  1. ;
  1. Q
  1. ;
  1. UNREGALL ;EP
  1. ;Unregister all events for current session
  1. ;Called on exit of each session
  1. ;
  1. N BMXEVENT
  1. S BMXEVENT=""
  1. K ^TMP("BMX EVENT",$J)
  1. Q
  1. ;
  1. UNREG(BMXY,BMXEVENT) ;EP
  1. ;RPC Called by client to Unregister client's interest in BMXEVENT
  1. ;Returns RECORDSET with field ERRORID.
  1. ;If everything ok then ERRORID = 0;
  1. ;
  1. N BMXI
  1. S BMXI=0
  1. S X="REGET^BMXMEVN",@^%ZOSF("TRAP")
  1. S BMXY=$NA(^TMP("BMX",$J)) K @BMXY
  1. S ^TMP("BMX",$J,0)="I00020ERRORID"_$C(30)
  1. K ^TMP("BMX EVENT",$J,BMXEVENT)
  1. ;
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)="0"_$C(30)_$C(31)
  1. Q
  1. ;
  1. POLLET ;EP
  1. ;Error trap from REGEVNT, RAISEVNT, ASYNCQUE and UNREG
  1. ;
  1. I '$D(BMXI) N BMXI S BMXI=999
  1. S BMXI=BMXI+1
  1. D POLLERR(BMXI,99)
  1. Q
  1. ;
  1. POLLERR(BMXI,BMXERID) ;Error processing
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)=BMXERID_U_$C(30)
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX",$J,BMXI)=$C(31)
  1. Q
  1. ;
  1. ASYNCQUD(BMXY,BMXRPC,BMXEVN) ;EP
  1. ;D DEBUG^%Serenji("ASYNCQUD^BMXMEVN(.BMXY,BMXRPC,BMXEVN)")
  1. Q
  1. ;
  1. ASYNCQUE(BMXY,BMXRPC,BMXEVN) ;EP
  1. ;RPC Queues taskman to job wrapper ASYNCZTM
  1. N BMXRPCX
  1. S BMXRPCX=$P(BMXRPC,$C(30))
  1. ;RETURNS EVENT NAME, ZTSK in PARAM
  1. S X="POLLET^BMXMEVN",@^%ZOSF("TRAP")
  1. S BMXY=$NA(^TMP("BMX ASYNC QUEUE",$J)) K @BMXY
  1. S ^TMP("BMX ASYNC QUEUE",$J,0)="I00030ERRORID"_U_"I00030PARAM"_$C(30)
  1. ;
  1. K BMXSEC
  1. S BMXSEC=""
  1. D CHKPRMIT^BMXMSEC(BMXRPCX) ;checks if RPC allowed to run
  1. N OLDCTXT
  1. I $L($G(BMXSEC)) D
  1. . S OLDCTXT=""
  1. . F S OLDCTXT=$O(XWBSTATE("ALLCTX",OLDCTXT)) Q:'$L($G(OLDCTXT)) D I '$L($G(BMXSEC)) Q
  1. . . D ADDCTXT^BMXMSEC(DUZ,OLDCTXT)
  1. . . D CHKPRMIT^BMXMSEC(BMXRPCX)
  1. . . Q
  1. . Q
  1. I $L($G(BMXSEC)) D Q
  1. . S ^TMP("BMX ASYNC QUEUE",$J,1)=2_U_$G(BMXSEC)_$C(30) ;IHS/OIT/HMW SAC Exemption Applied For
  1. . S ^TMP("BMX ASYNC QUEUE",$J,2)=$C(31) ;IHS/OIT/HMW SAC Exemption Applied For
  1. . Q
  1. ;K ZTSK
  1. CHKOLDOK N ZTSK,ZTRTN,ZTSAVE,ZTDESC,ZTIO,ZTDTH
  1. S ZTRTN="ASYNCZTM^BMXMEVN"
  1. S BMXRPC=$TR(BMXRPC,"~",$C(30))
  1. S ZTSAVE("BMXRPC")=""
  1. S ZTSAVE("BMXEVN")=""
  1. S ZTDESC="BMX ASYNC JOB"
  1. S ZTIO="",ZTDTH=DT
  1. D ^%ZTLOAD
  1. ;D @ZTRTN ;Debugging call
  1. ;
  1. S ^TMP("BMX ASYNC QUEUE",$J,1)=1_U_$G(ZTSK)_$C(30)
  1. S ^TMP("BMX ASYNC QUEUE",$J,2)=$C(31)
  1. ;
  1. Q
  1. ;
  1. ASYNCZTM ;EP
  1. ;Called by Taskman with BMXRPC and BMXEVN defined to
  1. ; 1) invoke the BMXRPC (RPC NAME^PARAM1^...^PARAMN)
  1. ; 2) when done, raises event BMXEVN with ZTSK^$J in BMXPARAM
  1. ;
  1. N BMXRTN,BMXTAG,BMXRPCD,BMXCALL,BMXJ,BMXY,BMXNOD,BMXY
  1. N BMXT S BMXT=$C(30)
  1. I $E(BMXRPC,1,6)="SELECT" S BMXRPC="BMX SQL"_$C(30)_BMXRPC
  1. S BMXRPCD=$O(^XWB(8994,"B",$P(BMXRPC,BMXT),0))
  1. S BMXNOD=^XWB(8994,BMXRPCD,0)
  1. S BMXRTN=$P(BMXNOD,U,3)
  1. S BMXTAG=$P(BMXNOD,U,2)
  1. S BMXCALL="D "_BMXTAG_"^"_BMXRTN_"(.BMXY,"
  1. F BMXJ=2:1:$L(BMXRPC,BMXT) D
  1. . S BMXCALL=BMXCALL_$C(34)_$P(BMXRPC,BMXT,BMXJ)_$C(34)
  1. . S:BMXJ<$L(BMXRPC,BMXT) BMXCALL=BMXCALL_","
  1. . Q
  1. S BMXCALL=BMXCALL_")"
  1. X BMXCALL
  1. D EVENT(BMXEVN,$G(ZTSK)_"~"_$P($G(BMXY),U,2),$J,"")
  1. Q
  1. ;
  1. ;
  1. ;Windows event handler:
  1. ;Catches event with ZTSK^DataLocation parameter
  1. ;Matches ZTSK to process that called event
  1. ;Calls ASYNCGET rpc with DATALOCATION parameter
  1. ;
  1. ASYNCGET(BMXY,BMXDATA) ;EP
  1. ;RPC Retrieves data queued by ASYNCZTM
  1. ;by setting BMXY to BMXDATA
  1. ;
  1. S BMXY="^"_BMXDATA
  1. Q
  1. ;
  1. ASYNCET ;EP
  1. ;Error trap from ASYNCQUE
  1. ;
  1. I '$D(BMXI) N BMXI S BMXI=999
  1. S BMXI=BMXI+1
  1. D ASYNCERR(BMXI,0)
  1. Q
  1. ;
  1. ASYNCERR(BMXI,BMXERID) ;Error processing
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=BMXERID_U_$C(30)
  1. S BMXI=BMXI+1
  1. S ^TMP("BMX ASYNC QUEUE",$J,BMXI)=$C(31)
  1. Q