using System;
using System.Data;
using System.Windows.Forms;
using IndianHealthService.BMXNet.Model;
using IndianHealthService.BMXNet.Ado;
namespace IndianHealthService.BMXNet.Services
{
///
/// Extends BMX functionality for easier development and debugging.
/// Copied from Component Framework project IndianHealthService.Xo.Framework.Rpms
///
public class BMXNetRpcSingleThreadedSession : RemoteSession, RemoteEventService
{
private BMXNetBroker m_broker;
public BMXNetBroker Broker
{
get { return m_broker; }
set { m_broker = value; }
}
private BMXNetDataAdapter m_cachedDataAdapter;
private String _debugLastRpcSignature;
public String DebugLastRpcSignature
{
get { return _debugLastRpcSignature; }
set { _debugLastRpcSignature = value; }
}
private String _debugLastResult;
public String DebugLastResult
{
get { return _debugLastResult; }
set { _debugLastResult = value; }
}
private String _rpcResult;
public BMXNetRpcSingleThreadedSession()
{
this.m_cachedDataAdapter = new BMXNetDataAdapter();
}
public void AuthenticatedBroker(BMXNetBroker aBroker)
{
this.Broker = aBroker;
this.StartPollingTimer();
}
private void StartPollingTimer()
{
this.PollingTimer = new System.Timers.Timer(this.EventPollingInterval);
this.PollingTimer.Enabled = this.IsEventPollingEnabled;
this.PollingTimer.Start();
}
public void AuthenticatedConnectionInfo(BMXNetBroker aBroker)
{
this.Broker = aBroker;
this.StartPollingTimer();
}
public virtual String TransmitRPC(String rpcCommand, String rpcParameter, String context)
{
if (rpcParameter.Length > 32600)
{
throw new Exception("RPC parameter length exceeds maximum allowable size.");
}
this.DebugLastRpcSignature = rpcCommand + "^" + rpcParameter + "^" + context;
this.Broker.AppContext = context;
this.RpcResult = this.Broker.TransmitRPC(rpcCommand, rpcParameter);
this.DebugLastResult = this.RpcResult;
return this.RpcResult;
}
public String SafelyTransmitRPC(String rpcCommand, String rpcParameter, String context)
{
try
{
return this.TransmitRPC(rpcCommand, rpcParameter, context);
}
catch (Exception exception)
{
return "Exception: " + exception.Message;
}
}
//TODO: Fix Broker - remove this stuff
private void FixUpBrokerBMXIENissue(DataTable aDataTable)
{
if (aDataTable.Columns.IndexOf("NEW ROW") == -1)
return;
foreach (DataRow each in aDataTable.Rows)
{
each["NEW ROW"] = each["BMXIEN"];
}
}
public bool SaveChanges(DataTable aDataTable)
{
BMXNetConnection bmxConnection;
BMXNetCommand bmxSelectCommand;
BMXNetCommand bmxUpdateCommand;
BMXNetDataAdapter bmxDataAdaptor;
DataTable changes = aDataTable.GetChanges();
if (changes == null)
return false;
this.FixUpBrokerBMXIENissue(changes);
this.Broker.AppContext = "BMXRPC";
bmxConnection = new BMXNetConnection(this.Broker);
bmxConnection.Open();
if (bmxConnection.State != ConnectionState.Open)
throw new BMXNetException("Unable to connect to RPMS.");
try
{
bmxDataAdaptor = this.m_cachedDataAdapter;
bmxSelectCommand = bmxConnection.CreateCommand() as BMXNetCommand;
bmxSelectCommand.CommandText = aDataTable.ExtendedProperties["BMXNetSelectStatementForUpdate"] as String;
bmxDataAdaptor.SelectCommand = bmxSelectCommand;
DataTable schema = bmxDataAdaptor.FillSchema(aDataTable, SchemaType.Source);
bmxUpdateCommand = bmxConnection.CreateCommand() as BMXNetCommand;
bmxUpdateCommand.BMXBuildUpdateCommand(schema);
bmxDataAdaptor.UpdateCommand = bmxUpdateCommand;
bmxDataAdaptor.Update(changes);
aDataTable.AcceptChanges();
return true;
}
catch (Exception exception)
{
throw new BMXNetException("Unable to save data to RPMS.", exception);
}
finally
{
if (bmxConnection != null)
bmxConnection.ToString();
}
}
public virtual DataTable TransmitTableGenerationRPC(String generationString)
{
return this.TransmitTableGenerationRPC(generationString, new DataSet());
}
public virtual DataTable TransmitTableGenerationRPC(String generationString, DataSet aDataSet)
{
BMXNetConnection bmxConnection;
BMXNetCommand bmxCommand;
BMXNetDataAdapter bmxDataAdaptor;
this.Broker.AppContext = "BMXRPC";
bmxConnection = new BMXNetConnection(this.Broker);
bmxConnection.Open();
if (bmxConnection.State != ConnectionState.Open)
throw new BMXNetException("Unable to connect to RPMS.");
try
{
bmxCommand = bmxConnection.CreateCommand() as BMXNetCommand;
bmxCommand.CommandText = generationString;
bmxDataAdaptor = new BMXNetDataAdapter();
bmxDataAdaptor.SelectCommand = bmxCommand;
DataSet dataSet = aDataSet;
bmxDataAdaptor.Fill(dataSet);
DataTable answer = dataSet.Tables[0];
answer.ExtendedProperties["BMXNetSelectStatementForUpdate"] = bmxCommand.CommandText;
answer.ExtendedProperties["RpmsQuery"] = generationString;
answer.ExtendedProperties["RpmsSchema"] = this.RpmsSchema(generationString);
return answer;
}
catch (Exception exception)
{
throw new Exception("Unable to retrive data from RPMS.", exception);
}
finally
{
if (bmxConnection != null)
bmxConnection.ToString();
}
}
public virtual DataTable TransmitTableGenerationRPC(String generationString, DataSet aDataSet, String aTableName)
{
BMXNetConnection bmxConnection;
BMXNetCommand bmxCommand;
BMXNetDataAdapter bmxDataAdaptor;
String initialAppContext = this.Broker.AppContext;
if (generationString.StartsWith("BMX"))
{
this.Broker.AppContext = "BMXRPC";
}
bmxConnection = new BMXNetConnection(this.Broker);
bmxConnection.Open();
if (bmxConnection.State != ConnectionState.Open)
{
throw new BMXNetException("Unable to connect to RPMS.");
}
try
{
bmxCommand = bmxConnection.CreateCommand() as BMXNetCommand;
bmxCommand.CommandText = generationString;
bmxDataAdaptor = new BMXNetDataAdapter();
bmxDataAdaptor = this.m_cachedDataAdapter;
bmxDataAdaptor.SelectCommand = bmxCommand;
DataSet dataSet = aDataSet;
DataTable answer = aDataSet.Tables.Add(aTableName);
bmxDataAdaptor.Fill(answer);
answer.ExtendedProperties["BMXNetSelectStatementForUpdate"] = bmxCommand.CommandText;
answer.ExtendedProperties["RpmsQuery"] = generationString;
answer.ExtendedProperties["RpmsSchema"] = this.RpmsSchema(generationString);
return answer;
}
catch (Exception exception)
{
throw new Exception("Unable to retrive data from RPMS.", exception);
}
finally
{
if (bmxConnection != null)
bmxConnection.ToString();
this.Broker.AppContext = initialAppContext;
}
}
private String RpmsSchema(String aString)
{
char[] carrotDelimiter = "^".ToCharArray();
String[] parts = aString.Split(carrotDelimiter);
return parts[1];
}
public DataTable TableFromRPC(String rpcCommand, String rpcParameter, String context)
{
return this.TableFromRPC(rpcCommand, rpcParameter, context, new DataSet());
}
public DataTable TableFromRPC(String rpcCommand, String rpcParameter, String context, DataSet aDataSet)
{
String tableGenerationRpc = this.TransmitRPC(rpcCommand, rpcParameter, context);
if (IsTableGenerationRpc(tableGenerationRpc))
return this.TransmitTableGenerationRPC(tableGenerationRpc, aDataSet);
else
{
return null;
}
}
/* BAD
public DataTable TableFromRPC(String rpcCommand,String rpcParameter,String context,DataSet aDataSet, String aTableName)
{
String tableGenerationRpc=this.TransmitRPC(rpcCommand,rpcParameter,context);
if (IsTableGenerationRpc(tableGenerationRpc))
return this.TransmitTableGenerationRPC(tableGenerationRpc, aDataSet, aTableName);
else
{
return null;
}
}
*/
public String RpcResult
{
get { return this._rpcResult; }
set { this._rpcResult = value; }
}
public virtual DataTable TableFromSQL(String sql)
{
return this.TableFromSQL(sql, new DataSet());
}
public DataTable TableFromSQL(string sql, DataSet aDataSet)
{
return this.TableFromSQL(sql, aDataSet, "ResultTable");
}
public DataTable TableFromSQL(string sql, DataSet aDataSet, string aTableName)
{
BMXNetConnection bmxConnection;
BMXNetCommand bmxCommand;
BMXNetDataAdapter bmxDataAdaptor;
this.Broker.AppContext = "BSDXRPC";
bmxConnection = new BMXNetConnection(this.Broker);
bmxConnection.Open();
if (bmxConnection.State != ConnectionState.Open)
{
throw new BMXNetException("Unable to connect to RPMS.");
}
try
{
bmxCommand = bmxConnection.CreateCommand() as BMXNetCommand;
bmxCommand.CommandText = sql;
bmxDataAdaptor = new BMXNetDataAdapter();
bmxDataAdaptor = this.m_cachedDataAdapter;
bmxDataAdaptor.SelectCommand = bmxCommand;
bmxDataAdaptor.Fill(aDataSet,aTableName);
DataTable answer = aDataSet.Tables[aTableName];
answer.ExtendedProperties["BMXNetSelectStatementForUpdate"] = bmxCommand.CommandText;
answer.ExtendedProperties["SqlQuery"] = sql;
return answer;
}
catch (Exception exception)
{
throw new Exception("Unable to retrive sql data from RPMS.", exception);
}
finally
{
if (bmxConnection != null)
bmxConnection.ToString();
//TODO: bmxConnection.Close();
//BMX framework lifecylce needs to be better defined.
}
}
public bool IsTableGenerationRpc(String aString)
{
String validFetchTransactionPrefix = "BMX ADO SS";
return aString.StartsWith(validFetchTransactionPrefix);
}
public virtual void Close()
{
this.Broker.CloseConnection();
this.PollingTimer.Close();
}
public string HostAddress
{
get { throw new NotImplementedException(); }
}
public string DUZ
{
get { return this.Broker.DUZ; }
}
public string UserName
{
get { return this.Broker.UserName; }
}
public string AppContext
{
get
{
return this.Broker.AppContext;
}
set
{
this.Broker.AppContext = value;
}
}
public string TransmitRPC(string rpcCommand, string rpcParameter)
{
return this.TransmitRPC(rpcCommand, rpcParameter, this.AppContext);
}
public string SafelyTransmitRPC(string rpcCommand, string rpcParameter)
{
return this.SafelyTransmitRPC(rpcCommand, rpcParameter, this.AppContext);
}
public System.Data.DataTable TableFromRPC(string rpcCommand, string rpcParameter)
{
return this.TableFromRPC(rpcCommand, rpcParameter, this.AppContext);
}
public System.Data.DataTable TableFromRPC(string rpcCommand, string rpcParameter, System.Data.DataSet aDataSet)
{
return this.TableFromRPC(rpcCommand, rpcParameter, aDataSet);
}
#region BMXNetSession Members
public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter)
{
throw new NotImplementedException();
}
public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, DataSet aDataSet)
{
throw new NotImplementedException();
}
public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, string context)
{
throw new NotImplementedException();
}
public DataTableFuture AsyncTableFromRPC(string rpcCommand, string rpcParameter, string context, DataSet aDataSet)
{
throw new NotImplementedException();
}
public event EventHandler RemoteEvent;
#endregion
DataTableFuture RemoteSession.AsyncTableFromRPC(string rpcCommand, string rpcParameter)
{
throw new NotImplementedException();
}
DataTableFuture RemoteSession.AsyncTableFromRPC(string rpcCommand, string rpcParameter, DataSet aDataSet)
{
throw new NotImplementedException();
}
DataTableFuture RemoteSession.AsyncTableFromRPC(string rpcCommand, string rpcParameter, string context)
{
throw new NotImplementedException();
}
DataTableFuture RemoteSession.AsyncTableFromRPC(string rpcCommand, string rpcParameter, string context, DataSet aDataSet)
{
throw new NotImplementedException();
}
public bool HasSubscribers(string anEventName)
{
throw new NotImplementedException();
}
public int Subscribe(string anEventName)
{
return this.EventManagmentCall("BMX EVENT REGISTER^" + anEventName);
}
public int Unsubscribe(string anEventName)
{
return this.EventManagmentCall("BMX EVENT UNREGISTER^" + anEventName);
}
public int RaiseEvent(string EventName, string Param, bool RaiseBack)
{
return this.EventManagmentCall("BMX EVENT RAISE^" + EventName + "^" + Param + "^" + RaiseBack.ToString().ToUpper() + "^");
}
public int TriggerEvent(string anEventName, string someDetails)
{
throw new NotImplementedException();
}
protected int EventManagmentCall(String aCommand)
{
try
{
DataTable table = this.TransmitTableGenerationRPC(aCommand);
return (int)table.Rows[0]["ERRORID"];
}
catch (Exception ex)
{
// Debug.Write(ex.Message);
return 99;
}
}
// this.NativeNetLib.BMXRWL.ReleaseWriterLock();
// this.m_timerEvent.Enabled = true;
//Disable timer before and after this
protected void PollForEvent()
{
this.PollForTimerEvent();
if (this.RpmsEvent != null)
{
DataTable events = this.TransmitTableGenerationRPC("BMX EVENT POLL");
foreach (DataRow row in events.Rows)
{
try
{
RemoteEventArgs args = new RemoteEventArgs();
args.EventType = row["EVENT"].ToString();
args.Details = row["PARAM"].ToString();
this.RpmsEvent(this, args);
}
catch
{
}
}
}
}
private void PollForTimerEvent()
{
}
public RemoteEventService EventServices
{
get { return this; }
}
private System.Timers.Timer _pollingTimer = null;
public System.Timers.Timer PollingTimer
{
get { return _pollingTimer; }
set { _pollingTimer = value; }
}
public event EventHandler RpmsEvent;
public event EventHandler TimerEvent;
private int _eventPollingInterval = 5000;
public int EventPollingInterval
{
get { return _eventPollingInterval; }
set
{
_eventPollingInterval = value;
if (this.PollingTimer != null)
{
this.PollingTimer.Interval = value;
}
}
}
private double _timerEventPollingMultiple = 1;
public double TimerEventPollingMultiple
{
get { return _timerEventPollingMultiple; }
set { _timerEventPollingMultiple = value; }
}
private bool _isEventPollingEnabled = false;
public bool IsEventPollingEnabled
{
get { return _isEventPollingEnabled; }
set
{
_isEventPollingEnabled = value;
if (this.PollingTimer != null)
{
this.PollingTimer.Enabled = value;
}
}
}
public DataTable VersionInfo
{
get { return this.TransmitTableGenerationRPC("BMX VERSION INFO^"); } //this.Broker.NameSpace); }
}
}
}