From 6b86874af5d434310163b08634834943629c08b2 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Sun, 24 Dec 2017 17:52:28 +0100 Subject: [PATCH] Apply Factory Pattern to ProxyCmd --- VAR.Toolbox/Code/IOutputHandler.cs | 7 ++ VAR.Toolbox/Code/IProxyCmdExecutor.cs | 7 ++ VAR.Toolbox/Code/ProxyCmdExecutorDummy.cs | 11 +++ VAR.Toolbox/Code/ProxyCmdExecutorFactory.cs | 14 ++++ .../Code/ProxyCmdExecutorThroughSQLServer.cs | 32 +++++++++ VAR.Toolbox/UI/FrmProxyCmd.cs | 67 +++++++++++-------- VAR.Toolbox/VAR.Toolbox.csproj | 5 ++ 7 files changed, 116 insertions(+), 27 deletions(-) create mode 100644 VAR.Toolbox/Code/IOutputHandler.cs create mode 100644 VAR.Toolbox/Code/IProxyCmdExecutor.cs create mode 100644 VAR.Toolbox/Code/ProxyCmdExecutorDummy.cs create mode 100644 VAR.Toolbox/Code/ProxyCmdExecutorFactory.cs create mode 100644 VAR.Toolbox/Code/ProxyCmdExecutorThroughSQLServer.cs diff --git a/VAR.Toolbox/Code/IOutputHandler.cs b/VAR.Toolbox/Code/IOutputHandler.cs new file mode 100644 index 0000000..efa2702 --- /dev/null +++ b/VAR.Toolbox/Code/IOutputHandler.cs @@ -0,0 +1,7 @@ +namespace VAR.Toolbox.Code +{ + public interface IOutputHandler + { + void OutputLine(string line); + } +} diff --git a/VAR.Toolbox/Code/IProxyCmdExecutor.cs b/VAR.Toolbox/Code/IProxyCmdExecutor.cs new file mode 100644 index 0000000..5acf510 --- /dev/null +++ b/VAR.Toolbox/Code/IProxyCmdExecutor.cs @@ -0,0 +1,7 @@ +namespace VAR.Toolbox.Code +{ + public interface IProxyCmdExecutor + { + bool ExecuteCmd(string cmd, IOutputHandler outputHandler); + } +} diff --git a/VAR.Toolbox/Code/ProxyCmdExecutorDummy.cs b/VAR.Toolbox/Code/ProxyCmdExecutorDummy.cs new file mode 100644 index 0000000..ed1556a --- /dev/null +++ b/VAR.Toolbox/Code/ProxyCmdExecutorDummy.cs @@ -0,0 +1,11 @@ +namespace VAR.Toolbox.Code +{ + public class ProxyCmdExecutorDummy : IProxyCmdExecutor + { + public bool ExecuteCmd(string cmdString, IOutputHandler outputHandler) + { + outputHandler.OutputLine(string.Format("DummyExecution: {0}", cmdString)); + return true; + } + } +} diff --git a/VAR.Toolbox/Code/ProxyCmdExecutorFactory.cs b/VAR.Toolbox/Code/ProxyCmdExecutorFactory.cs new file mode 100644 index 0000000..813ae3a --- /dev/null +++ b/VAR.Toolbox/Code/ProxyCmdExecutorFactory.cs @@ -0,0 +1,14 @@ +namespace VAR.Toolbox.Code +{ + public class ProxyCmdExecutorFactory + { + public static IProxyCmdExecutor CreateFromConfig(string config) + { + if (string.IsNullOrEmpty(config)) + { + return new ProxyCmdExecutorDummy(); + } + return new ProxyCmdExecutorThroughSQLServer(config); + } + } +} diff --git a/VAR.Toolbox/Code/ProxyCmdExecutorThroughSQLServer.cs b/VAR.Toolbox/Code/ProxyCmdExecutorThroughSQLServer.cs new file mode 100644 index 0000000..2a43486 --- /dev/null +++ b/VAR.Toolbox/Code/ProxyCmdExecutorThroughSQLServer.cs @@ -0,0 +1,32 @@ +using System; +using System.Data.SqlClient; + +namespace VAR.Toolbox.Code +{ + public class ProxyCmdExecutorThroughSQLServer : IProxyCmdExecutor + { + private string _connectionString = null; + + public ProxyCmdExecutorThroughSQLServer(string connectionString) + { + _connectionString = connectionString; + } + + public bool ExecuteCmd(string cmdString, IOutputHandler outputHandler) + { + SqlConnection cnx = new SqlConnection(_connectionString); + SqlCommand cmd = cnx.CreateCommand(); + cmd.CommandText = "exec master.dbo.xp_cmdshell @cmd"; + cmd.Parameters.Add(new SqlParameter("cmd", cmdString)); + cnx.Open(); + SqlDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + string output = Convert.ToString(reader[0]); + outputHandler.OutputLine(output); + } + cnx.Close(); + return true; + } + } +} diff --git a/VAR.Toolbox/UI/FrmProxyCmd.cs b/VAR.Toolbox/UI/FrmProxyCmd.cs index 073b992..6c4aa17 100644 --- a/VAR.Toolbox/UI/FrmProxyCmd.cs +++ b/VAR.Toolbox/UI/FrmProxyCmd.cs @@ -1,27 +1,17 @@ using System; -using System.Data.SqlClient; using System.Threading; using System.Windows.Forms; +using VAR.Toolbox.Code; namespace VAR.Toolbox.UI { - public partial class FrmProxyCmd : Form + public partial class FrmProxyCmd : Form, IOutputHandler { public FrmProxyCmd() { InitializeComponent(); } - - private void txtOutput_AppendLine(string line) - { - BeginInvoke(new MethodInvoker(delegate - { - txtOutput.AppendText(line); - txtOutput.AppendText(Environment.NewLine); - Application.DoEvents(); - })); - } - + private object _executionLock = new object(); private void txtInput_KeyDown(object sender, KeyEventArgs e) @@ -32,17 +22,27 @@ namespace VAR.Toolbox.UI Application.DoEvents(); return; } - if (e.KeyCode == Keys.Return) { e.Handled = true; - Application.DoEvents(); string cmd = txtInput.Text.Replace("\n", "").Replace("\r", ""); - txtOutput_AppendLine(cmd); txtInput.Text = string.Empty; + Application.DoEvents(); + txtInput.Text = string.Empty; + OutputLine(cmd); new Thread(() => ExecuteCmd(cmd)).Start(); return; } + if(e.KeyCode == Keys.Enter) + { + e.Handled = true; + return; + } + if (e.KeyCode == Keys.LineFeed) + { + e.Handled = true; + return; + } if (e.KeyCode == Keys.Up) { e.Handled = true; @@ -55,22 +55,35 @@ namespace VAR.Toolbox.UI } } + private IProxyCmdExecutor _proxyCmdExecutor = null; + private void ExecuteCmd(string cmdString) { - Monitor.Enter(_executionLock); - SqlConnection cnx = new SqlConnection(Properties.Settings.Default.ProxyCmdConfig); - SqlCommand cmd = cnx.CreateCommand(); - cmd.CommandText = "exec master.dbo.xp_cmdshell @cmd"; - cmd.Parameters.Add(new SqlParameter("cmd", cmdString)); - cnx.Open(); - SqlDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) + if (_proxyCmdExecutor == null) { - string output = Convert.ToString(reader[0]); - txtOutput_AppendLine(output); + _proxyCmdExecutor = ProxyCmdExecutorFactory.CreateFromConfig(Properties.Settings.Default.ProxyCmdConfig); + } + Monitor.Enter(_executionLock); + try + { + _proxyCmdExecutor.ExecuteCmd(cmdString, this); + } + catch (Exception ex) + { + Logger.Log(ex); + OutputLine(ex.Message); } - cnx.Close(); Monitor.Exit(_executionLock); } + + public void OutputLine(string line) + { + BeginInvoke(new MethodInvoker(delegate + { + txtOutput.AppendText(line); + txtOutput.AppendText(Environment.NewLine); + Application.DoEvents(); + })); + } } } diff --git a/VAR.Toolbox/VAR.Toolbox.csproj b/VAR.Toolbox/VAR.Toolbox.csproj index 7bda487..b3954b7 100644 --- a/VAR.Toolbox/VAR.Toolbox.csproj +++ b/VAR.Toolbox/VAR.Toolbox.csproj @@ -84,8 +84,13 @@ + + + + +