From 96445fecac64521e6825f2b2bbabf21ab4390470 Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 30 Sep 2016 10:04:09 +0100 Subject: [PATCH 1/6] Upgrade Npgsql to 3.1.8 --- ADO.ExecuteCommand/ADO.ExecuteCommand.csproj | 8 ++------ ADO.ExecuteCommand/packages.config | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj index 4cac692..c9a2769 100644 --- a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj +++ b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj @@ -45,16 +45,12 @@ 4 - - ..\packages\Npgsql.2.2.5\lib\net45\Mono.Security.dll - True - ..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll True - - ..\packages\Npgsql.2.2.5\lib\net45\Npgsql.dll + + ..\packages\Npgsql.3.1.8\lib\net45\Npgsql.dll True diff --git a/ADO.ExecuteCommand/packages.config b/ADO.ExecuteCommand/packages.config index 907e477..3f7fbbe 100644 --- a/ADO.ExecuteCommand/packages.config +++ b/ADO.ExecuteCommand/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From bc3ffbc0c65deca1cf190fc5464e1f695aa13705 Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 30 Sep 2016 12:41:36 +0100 Subject: [PATCH 2/6] Update version to 1.0.0.1 --- ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs index 83dcc7a..6dc74d2 100644 --- a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs +++ b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.0.1")] +[assembly: AssemblyFileVersion("1.0.0.1")] From b798e28ec59594cf696ad9d230467adb3b7487f6 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 4 Oct 2016 11:58:10 +0100 Subject: [PATCH 3/6] Nuget package --- NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg | Bin 0 -> 19764 bytes NuGet/install.ps1 | 89 ++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg create mode 100644 NuGet/install.ps1 diff --git a/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg b/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..2751ca929093e8e48daaeef5dd035394b526fa81 GIT binary patch literal 19764 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 Date: Thu, 10 Nov 2016 12:30:02 +0000 Subject: [PATCH 4/6] Versions and packages --- .../AdoMocks/MockCommandHelper.cs | 44 +-- ADO.ExecuteCommand.Test/ParametersTest.cs | 4 +- ADO.ExecuteCommand/ADO.ExecuteCommand.csproj | 24 +- ADO.ExecuteCommand/Commands/Command.cs | 10 - ADO.ExecuteCommand/Commands/CommandBatch.cs | 11 - ADO.ExecuteCommand/Helper/CommandHelper.cs | 267 ------------------ ADO.ExecuteCommand/Helper/MsSql.cs | 51 ---- ADO.ExecuteCommand/Helper/MySql.cs | 39 +-- ADO.ExecuteCommand/Helper/PgSql.cs | 45 --- NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg | Bin 0 -> 14028 bytes ...ET.Database.CommandLayer.Win.1.0.0.5.nupkg | Bin 0 -> 16954 bytes NuGet/install.ps1 | 89 ------ Thin.Database.CommandLayer.sln | 15 + 13 files changed, 44 insertions(+), 555 deletions(-) delete mode 100644 ADO.ExecuteCommand/Commands/Command.cs delete mode 100644 ADO.ExecuteCommand/Commands/CommandBatch.cs delete mode 100644 ADO.ExecuteCommand/Helper/CommandHelper.cs delete mode 100644 ADO.ExecuteCommand/Helper/MsSql.cs delete mode 100644 ADO.ExecuteCommand/Helper/PgSql.cs create mode 100644 NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg create mode 100644 NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg delete mode 100644 NuGet/install.ps1 diff --git a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs index 696b376..71243a0 100644 --- a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs +++ b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs @@ -12,6 +12,10 @@ public class MockCommandHelper : CommandHelper { private IList parameters; + public MockCommandHelper(string connectionString) : base(connectionString) + { + } + public IList> ReturnValues { get; set; } public override IDbConnection GetConnection() @@ -42,46 +46,6 @@ protected override IDataParameter GetParameter() return parameter; } - protected override IDbDataAdapter GetDataAdapter() - { - var dba = MockRepository.GenerateMock(); - dba.Expect(da => da.SelectCommand); - - return dba; - } - - protected override void DeriveParameters(IDbCommand cmd) - { - throw new NotImplementedException(); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - if (this.ReturnValues == null || !this.ReturnValues.Any()) throw new NoNullAllowedException(); - - var dt = new DataTable(); - dt.Clear(); - - foreach (var col in this.ReturnValues[0].Keys) - { - dt.Columns.Add(col); - } - - foreach (var rows in this.ReturnValues) - { - var row = dt.NewRow(); - - foreach (var returnValue in rows) - { - row[returnValue.Key] = returnValue.Value; - } - - dt.Rows.Add(row); - } - - return dt; - } - public IEnumerable Parameters => this.parameters; } } diff --git a/ADO.ExecuteCommand.Test/ParametersTest.cs b/ADO.ExecuteCommand.Test/ParametersTest.cs index 0c657ba..e8232da 100644 --- a/ADO.ExecuteCommand.Test/ParametersTest.cs +++ b/ADO.ExecuteCommand.Test/ParametersTest.cs @@ -13,7 +13,7 @@ public class ParametersTest [TestMethod] public void TestParametersInQuery() { - var commandHelper = new MockCommandHelper + var commandHelper = new MockCommandHelper(null) { ReturnValues = new List> { @@ -43,7 +43,7 @@ public void TestParametersInQuery() [TestMethod] public void TestNullParametersInQuery() { - var queryRunner = new MockCommandHelper + var queryRunner = new MockCommandHelper(null) { ReturnValues = new List> { diff --git a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj index c9a2769..8924892 100644 --- a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj +++ b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj @@ -64,14 +64,28 @@ - - - + + Commands\Command.cs + + + Commands\CommandBatch.cs + + + Helper\CommandHelper.cs + + + Helper\DataAccessSectionSettings.cs + + + Helper\MsSql.cs + + + Helper\PgSql.cs + + - - diff --git a/ADO.ExecuteCommand/Commands/Command.cs b/ADO.ExecuteCommand/Commands/Command.cs deleted file mode 100644 index 4dbfc14..0000000 --- a/ADO.ExecuteCommand/Commands/Command.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace ADO.ExecuteCommand.Commands -{ - public abstract class Command - { - public string Expression { get; protected set; } - public IDictionary Parameters { get; protected set; } - } -} \ No newline at end of file diff --git a/ADO.ExecuteCommand/Commands/CommandBatch.cs b/ADO.ExecuteCommand/Commands/CommandBatch.cs deleted file mode 100644 index 002983b..0000000 --- a/ADO.ExecuteCommand/Commands/CommandBatch.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; - -namespace ADO.ExecuteCommand.Commands -{ - public abstract class CommandBatch - { - public IEnumerable Commands { get; protected set; } - - public bool ThrowOnError { get; protected set; } - } -} diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.cs b/ADO.ExecuteCommand/Helper/CommandHelper.cs deleted file mode 100644 index a4ac2d9..0000000 --- a/ADO.ExecuteCommand/Helper/CommandHelper.cs +++ /dev/null @@ -1,267 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using ADO.ExecuteCommand.Commands; - -namespace ADO.ExecuteCommand.Helper -{ - public abstract class CommandHelper - { - #region Declare members - - protected static Hashtable ParamCache = Hashtable.Synchronized(new Hashtable()); - protected static string ConnectionString; - - #endregion - - #region Provider specific abstract methods - - public abstract IDbConnection GetConnection(); - protected abstract IDataParameter GetParameter(); - protected abstract IDbDataAdapter GetDataAdapter(); - protected abstract void DeriveParameters(IDbCommand cmd); - protected abstract DataTable FillTable(IDbDataAdapter da); - - #endregion - - #region Factory - - public static CommandHelper CreateHelper(string providerAlias) - { - try - { - var dict = ConfigurationManager.GetSection("DataCommandProviders") as IDictionary; - if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session."); - - var providerConfig = dict[providerAlias] as ProviderAlias; - if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session."); - - var providerType = providerConfig.TypeName; - ConnectionString = providerConfig.ConnectionString; - - var daType = Type.GetType(providerType); - if (daType == null) throw new Exception("Null Reference in Provider type configuration Session."); - - var provider = daType.Assembly.CreateInstance(daType.FullName); - if (provider is CommandHelper) return provider as CommandHelper; - - throw new Exception("The provider specified does not extends the AdoHelper abstract class."); - } - catch (Exception e) - { - throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e); - } - } - - #endregion - - protected virtual IDataParameter GetParameter(string name, object value) - { - var parameter = this.GetParameter(); - parameter.ParameterName = name; - parameter.Value = value; - - return parameter; - } - - #region private utility methods - - protected virtual void AttachParameters(IDbCommand command, IDataParameter[] commandParameters) - { - if (command == null) throw new ArgumentNullException(nameof(command)); - if (commandParameters == null) return; - - foreach (var p in commandParameters.Where(p => p != null)) - { - if ((p.Direction == ParameterDirection.InputOutput || - p.Direction == ParameterDirection.Input) && (p.Value == null)) - { - p.Value = DBNull.Value; - } - - command.Parameters.Add(p); - } - } - - protected void AssignParameterValues(IDataParameter[] commandParameters, DataRow dataRow) - { - if ((commandParameters == null) || (dataRow == null)) - { - return; - } - - var columns = dataRow.Table.Columns; - - var i = 0; - foreach (var commandParameter in commandParameters) - { - if (commandParameter.ParameterName == null || commandParameter.ParameterName.Length <= 1) - throw new Exception($"Please provide a valid parameter name on the parameter #{i}, the ParameterName property has the following value: '{commandParameter.ParameterName}'."); - - if (columns.Contains(commandParameter.ParameterName)) commandParameter.Value = dataRow[commandParameter.ParameterName]; - else if (columns.Contains(commandParameter.ParameterName.Substring(1))) commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)]; - - i++; - } - } - - protected void AssignParameterValues(IDataParameter[] commandParameters, object[] parameterValues) - { - if ((commandParameters == null) || (parameterValues == null)) - { - return; - } - - if (commandParameters.Length != parameterValues.Length) - { - throw new ArgumentException("Parameter count does not match Parameter Value count."); - } - - for (var i = 0; i < commandParameters.Length; i++) - { - var param = parameterValues[i] as IDataParameter; - if (param != null) - { - var paramInstance = param; - commandParameters[i].Value = paramInstance.Value ?? DBNull.Value; - - continue; - } - - commandParameters[i].Value = parameterValues[i] ?? DBNull.Value; - } - } - - protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters) - { - var mustCloseConnection = false; - - if (command == null) throw new ArgumentNullException(nameof(command)); - if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException(nameof(commandText)); - - if (connection.State != ConnectionState.Open) - { - mustCloseConnection = true; - connection.Open(); - } - - command.Connection = connection; - command.CommandText = commandText; - - if (transaction != null) - { - if (transaction.Connection == null) throw new ArgumentException("The transaction was roll-backed or committed, please provide an open transaction.", nameof(transaction)); - command.Transaction = transaction; - } - - command.CommandType = commandType; - - if (commandParameters != null) - { - this.AttachParameters(command, commandParameters); - } - - return mustCloseConnection; - } - - protected virtual void ClearCommand(IDbCommand command) - { - } - - #endregion private utility methods - - #region ExecuteNonCommand - - public int ExecuteCommand(Command command) - { - var dataParameters = this.GetCriterialParameters(command.Parameters); - return this.ExecuteNonQuery(CommandType.Text, command.Expression, dataParameters); - } - - public void ExecuteBatchCommand(CommandBatch commandBatch) - { - using (var connection = this.GetConnection()) - { - connection.Open(); - var transaction = connection.BeginTransaction(); - - foreach (var command in commandBatch.Commands) - { - try - { - var dataParameters = this.GetCriterialParameters(command.Parameters); - this.ExecuteNonQuery(connection, transaction, CommandType.Text, command.Expression, dataParameters); - } - catch (Exception) - { - if (!commandBatch.ThrowOnError) continue; - - transaction.Rollback(); - throw; - } - } - - transaction.Commit(); - } - } - - #endregion - - #region ExecuteNonQuery - - protected int ExecuteNonQuery(CommandType commandType, string commandText, params IDataParameter[] commandParameters) - { - int rowAffected; - - using (var connection = this.GetConnection()) - { - IDbTransaction transaction = null; - - try - { - connection.Open(); - transaction = connection.BeginTransaction(); - - rowAffected = this.ExecuteNonQuery(connection, transaction, commandType, commandText, commandParameters); - transaction.Commit(); - } - catch (Exception) - { - transaction?.Rollback(); - throw; - } - } - - return rowAffected; - } - - protected virtual int ExecuteNonQuery(IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, params IDataParameter[] commandParameters) - { - if (connection == null) throw new ArgumentNullException(nameof(connection)); - - var cmd = connection.CreateCommand(); - var mustCloseConnection = this.PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); - - var retval = cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - if (mustCloseConnection) connection.Close(); - - return retval; - } - #endregion ExecuteNonQuery - - #region Parameter Discovery Functions - - protected IDataParameter[] GetCriterialParameters(IEnumerable> parameters) - { - return parameters?.Select(p => this.GetParameter(p.Key, p.Value)).ToArray(); - } - - #endregion Parameter Discovery Functions - - } -} \ No newline at end of file diff --git a/ADO.ExecuteCommand/Helper/MsSql.cs b/ADO.ExecuteCommand/Helper/MsSql.cs deleted file mode 100644 index 95ecf46..0000000 --- a/ADO.ExecuteCommand/Helper/MsSql.cs +++ /dev/null @@ -1,51 +0,0 @@ - -using System; -using System.Data; -using System.Data.SqlClient; - -namespace ADO.ExecuteCommand.Helper -{ - public class MsSql : CommandHelper - { - public override IDbConnection GetConnection() - { - if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); - return new SqlConnection(ConnectionString); - } - - /// - /// Return a database connection using connection string passed as parameter - /// - /// connection string to use - /// Database connection - public IDbConnection GetConnection(string connectionString) - { - if (string.IsNullOrEmpty(connectionString)) throw new NullReferenceException("connectionString"); - return new SqlConnection(connectionString); - } - - protected override IDataParameter GetParameter() - { - return new SqlParameter(); - } - - protected override IDbDataAdapter GetDataAdapter() - { - return new SqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) - { - if (!(cmd is SqlCommand)) throw new ArgumentException("The command provided is not a SqlCommand instance.", nameof(cmd)); - SqlCommandBuilder.DeriveParameters((SqlCommand)cmd); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((SqlDataAdapter)da).Fill(dt); - - return dt; - } - } -} diff --git a/ADO.ExecuteCommand/Helper/MySql.cs b/ADO.ExecuteCommand/Helper/MySql.cs index bcadf9f..0fcd825 100644 --- a/ADO.ExecuteCommand/Helper/MySql.cs +++ b/ADO.ExecuteCommand/Helper/MySql.cs @@ -6,50 +6,19 @@ namespace ADO.ExecuteCommand.Helper { public sealed class MySql : CommandHelper { - public override IDbConnection GetConnection() + public MySql(string connectionString) : base(connectionString) { - if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); - return new MySqlConnection( ConnectionString ); } - protected override IDbDataAdapter GetDataAdapter() - { - return new MySqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) + public override IDbConnection GetConnection() { - if (!(cmd is MySqlCommand)) throw new ArgumentException("The command provided is not a MySqlCommand instance.", nameof(cmd)); - MySqlCommandBuilder.DeriveParameters((MySqlCommand)cmd); + if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); + return new MySqlConnection( ConnectionString ); } protected override IDataParameter GetParameter() { return new MySqlParameter(); } - - protected override void ClearCommand(IDbCommand command) - { - var canClear = true; - foreach(IDataParameter commandParameter in command.Parameters) - { - if (commandParameter.Direction != ParameterDirection.Input) canClear = false; - } - - if (canClear) - { - command.Parameters.Clear(); - } - - command.Parameters.Clear(); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((MySqlDataAdapter) da).Fill(dt); - - return dt; - } } } \ No newline at end of file diff --git a/ADO.ExecuteCommand/Helper/PgSql.cs b/ADO.ExecuteCommand/Helper/PgSql.cs deleted file mode 100644 index ed93f31..0000000 --- a/ADO.ExecuteCommand/Helper/PgSql.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Data; -using Npgsql; - -namespace ADO.ExecuteCommand.Helper -{ - public class PgSql : CommandHelper - { - public override IDbConnection GetConnection() - { - if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); - return new NpgsqlConnection(ConnectionString); - } - - public IDbConnection GetConnection(string connectionString) - { - if (string.IsNullOrEmpty(connectionString)) throw new NullReferenceException("connectionString"); - return new NpgsqlConnection(connectionString); - } - - protected override IDataParameter GetParameter() - { - return new NpgsqlParameter(); - } - - protected override IDbDataAdapter GetDataAdapter() - { - return new NpgsqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) - { - if (!(cmd is NpgsqlCommand)) throw new ArgumentException("The command provided is not a NpgSqlCommand instance.", nameof(cmd)); - NpgsqlCommandBuilder.DeriveParameters((NpgsqlCommand)cmd); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((NpgsqlDataAdapter)da).Fill(dt); - - return dt; - } - } -} diff --git a/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg b/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..157c7063759efe15e6f0033cfbc174892c3c6113 GIT binary patch literal 14028 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 M5AW}5-k+ua2U+w<4FCWD literal 0 HcmV?d00001 diff --git a/NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg b/NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..dfc85f8f0752a72d474161cd34c703927f8468e6 GIT binary patch literal 16954 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 literal 0 HcmV?d00001 diff --git a/NuGet/install.ps1 b/NuGet/install.ps1 deleted file mode 100644 index 94b5566..0000000 --- a/NuGet/install.ps1 +++ /dev/null @@ -1,89 +0,0 @@ -param($installPath, $toolsPath, $package, $project) - -try -{ - $url = "https://github.com/odelvalle/NET-Database-query-layer/" - $packageName = "slapper.automapper" - $dte2 = Get-Interface $dte ([EnvDTE80.DTE2]) - - if ($dte2.ActiveWindow.Caption -eq "Package Manager Console") - { - # user is installing from VS NuGet console - # get reference to the window, the console host and the input history - # show webpage if "install-package YourPackageName" was last input - - $consoleWindow = $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]) - - $props = $consoleWindow.GetType().GetProperties([System.Reflection.BindingFlags]::Instance -bor ` - [System.Reflection.BindingFlags]::NonPublic) - - $prop = $props | ? { $_.Name -eq "ActiveHostInfo" } | select -first 1 - if ($prop -eq $null) { return } - - $hostInfo = $prop.GetValue($consoleWindow) - if ($hostInfo -eq $null) { return } - - $history = $hostInfo.WpfConsole.InputHistory.History - - $lastCommand = $history | select -last 1 - - if ($lastCommand) - { - $lastCommand = $lastCommand.Trim().ToLower() - if ($lastCommand.StartsWith("install-package") -and $lastCommand.Contains($packageName)) - { - $dte2.ItemOperations.Navigate($url) | Out-Null - } - } - } - else - { - # user is installing from VS NuGet dialog - # get reference to the window, then smart output console provider - # show webpage if messages in buffered console contains "installing...YourPackageName" in last operation - - $instanceField = [NuGet.Dialog.PackageManagerWindow].GetField("CurrentInstance", [System.Reflection.BindingFlags]::Static -bor ` - [System.Reflection.BindingFlags]::NonPublic) - $consoleField = [NuGet.Dialog.PackageManagerWindow].GetField("_smartOutputConsoleProvider", [System.Reflection.BindingFlags]::Instance -bor ` - [System.Reflection.BindingFlags]::NonPublic) - if ($instanceField -eq $null -or $consoleField -eq $null) { return } - - $instance = $instanceField.GetValue($null) - if ($instance -eq $null) { return } - - $consoleProvider = $consoleField.GetValue($instance) - if ($consoleProvider -eq $null) { return } - - $console = $consoleProvider.CreateOutputConsole($false) - - $messagesField = $console.GetType().GetField("_messages", [System.Reflection.BindingFlags]::Instance -bor ` - [System.Reflection.BindingFlags]::NonPublic) - if ($messagesField -eq $null) { return } - - $messages = $messagesField.GetValue($console) - if ($messages -eq $null) { return } - - $operations = $messages -split "==============================" - - $lastOperation = $operations | select -last 1 - - if ($lastOperation) - { - $lastOperation = $lastOperation.ToLower() - - $lines = $lastOperation -split "`r`n" - - $installMatch = $lines | ? { $_.StartsWith("------- installing..." + $packageName) } | select -first 1 - - if ($installMatch) - { - $dte2.ItemOperations.Navigate($url) | Out-Null - } - } - } -} -catch -{ - # stop potential errors from bubbling up - # worst case the splash page won't open -} \ No newline at end of file diff --git a/Thin.Database.CommandLayer.sln b/Thin.Database.CommandLayer.sln index b526931..18e4c8d 100644 --- a/Thin.Database.CommandLayer.sln +++ b/Thin.Database.CommandLayer.sln @@ -7,6 +7,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand", "ADO.E EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand.Test", "ADO.ExecuteCommand.Test\ADO.ExecuteCommand.Test.csproj", "{CDCF391D-B31A-4A58-861D-199456E56368}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Core", "NET Core", "{E4767CC8-7D5E-47F0-B190-9A5818B1B09A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Framework 4.5", "NET Framework 4.5", "{C24B7231-5233-49C9-8C84-D4FEFA90FDB3}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ADO.ExecuteCommand.Core", "ADO.ExecuteCommand.Core\ADO.ExecuteCommand.Core.xproj", "{B7737B4F-4C59-4CE5-AA62-0A6CCA639473}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,8 +27,17 @@ Global {CDCF391D-B31A-4A58-861D-199456E56368}.Debug|Any CPU.Build.0 = Debug|Any CPU {CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.ActiveCfg = Release|Any CPU {CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.Build.0 = Release|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {D6653B75-F3DC-4C5D-ADAA-B70F24D66A95} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3} + {CDCF391D-B31A-4A58-861D-199456E56368} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3} + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473} = {E4767CC8-7D5E-47F0-B190-9A5818B1B09A} + EndGlobalSection EndGlobal From 7823e401118ce85bd66a3be0fa90fada4932d166 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 10 Nov 2016 12:40:15 +0000 Subject: [PATCH 5/6] updates --- .../ADO.ExecuteCommand.Core.xproj | 21 ++ ADO.ExecuteCommand.Core/Commands/Command.cs | 10 + .../Commands/CommandBatch.cs | 11 ++ .../Helper/CommandHelper.Factory.cs | 34 ++++ .../Helper/CommandHelper.cs | 182 ++++++++++++++++++ .../Helper/DataAccessSectionSettings.cs | 14 ++ ADO.ExecuteCommand.Core/Helper/MsSql.cs | 36 ++++ ADO.ExecuteCommand.Core/Helper/PgSql.cs | 30 +++ .../Properties/AssemblyInfo.cs | 19 ++ ADO.ExecuteCommand.Core/project.json | 17 ++ .../Helper/CommandHelper.Factory.cs | 54 ++++++ 11 files changed, 428 insertions(+) create mode 100644 ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj create mode 100644 ADO.ExecuteCommand.Core/Commands/Command.cs create mode 100644 ADO.ExecuteCommand.Core/Commands/CommandBatch.cs create mode 100644 ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs create mode 100644 ADO.ExecuteCommand.Core/Helper/CommandHelper.cs create mode 100644 ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs create mode 100644 ADO.ExecuteCommand.Core/Helper/MsSql.cs create mode 100644 ADO.ExecuteCommand.Core/Helper/PgSql.cs create mode 100644 ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs create mode 100644 ADO.ExecuteCommand.Core/project.json create mode 100644 ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs diff --git a/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj new file mode 100644 index 0000000..bbde65d --- /dev/null +++ b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + b7737b4f-4c59-4ce5-aa62-0a6cca639473 + ADO.ExecuteCommand.Core + .\obj + .\bin\ + v4.5 + + + + 2.0 + + + diff --git a/ADO.ExecuteCommand.Core/Commands/Command.cs b/ADO.ExecuteCommand.Core/Commands/Command.cs new file mode 100644 index 0000000..4dbfc14 --- /dev/null +++ b/ADO.ExecuteCommand.Core/Commands/Command.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace ADO.ExecuteCommand.Commands +{ + public abstract class Command + { + public string Expression { get; protected set; } + public IDictionary Parameters { get; protected set; } + } +} \ No newline at end of file diff --git a/ADO.ExecuteCommand.Core/Commands/CommandBatch.cs b/ADO.ExecuteCommand.Core/Commands/CommandBatch.cs new file mode 100644 index 0000000..002983b --- /dev/null +++ b/ADO.ExecuteCommand.Core/Commands/CommandBatch.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace ADO.ExecuteCommand.Commands +{ + public abstract class CommandBatch + { + public IEnumerable Commands { get; protected set; } + + public bool ThrowOnError { get; protected set; } + } +} diff --git a/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs new file mode 100644 index 0000000..b13147d --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs @@ -0,0 +1,34 @@ +using System; + +namespace ADO.ExecuteCommand.Helper +{ + public abstract partial class CommandHelper + { + #region - Factory - + + public static CommandHelper CreateHelper(DataAccessSectionSettings settings) + { + try + { + var providerType = settings.Type; + + var daType = Type.GetType(providerType); + if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session."); + + var provider = Activator.CreateInstance(daType, settings.ConnectionString); + if (provider is CommandHelper) + { + return provider as CommandHelper; + } + + throw new Exception("The provider specified does not extends the QueryRunner abstract class."); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e); + } + } + + #endregion + } +} diff --git a/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs new file mode 100644 index 0000000..f2a9d57 --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using ADO.ExecuteCommand.Commands; + +namespace ADO.ExecuteCommand.Helper +{ + public abstract partial class CommandHelper + { + #region Declare members + + protected string ConnectionString; + + #endregion + + protected CommandHelper(string connectionString) + { + this.ConnectionString = connectionString; + } + + #region Provider specific abstract methods + + public abstract IDbConnection GetConnection(); + protected abstract IDataParameter GetParameter(); + + #endregion + + protected virtual IDataParameter GetParameter(string name, object value) + { + var parameter = this.GetParameter(); + parameter.ParameterName = name; + parameter.Value = value; + + return parameter; + } + + #region private utility methods + + protected virtual void AttachParameters(IDbCommand command, IDataParameter[] commandParameters) + { + if (command == null) throw new ArgumentNullException(nameof(command)); + if (commandParameters == null) return; + + foreach (var p in commandParameters.Where(p => p != null)) + { + if ((p.Direction == ParameterDirection.InputOutput || + p.Direction == ParameterDirection.Input) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters) + { + var mustCloseConnection = false; + + if (command == null) throw new ArgumentNullException(nameof(command)); + if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException(nameof(commandText)); + + if (connection.State != ConnectionState.Open) + { + mustCloseConnection = true; + connection.Open(); + } + + command.Connection = connection; + command.CommandText = commandText; + + if (transaction != null) + { + if (transaction.Connection == null) throw new ArgumentException("The transaction was roll-backed or committed, please provide an open transaction.", nameof(transaction)); + command.Transaction = transaction; + } + + command.CommandType = commandType; + + if (commandParameters != null) + { + this.AttachParameters(command, commandParameters); + } + + return mustCloseConnection; + } + + #endregion private utility methods + + #region ExecuteNonCommand + + public int ExecuteCommand(Command command) + { + var dataParameters = this.GetCriterialParameters(command.Parameters); + return this.ExecuteNonQuery(CommandType.Text, command.Expression, dataParameters); + } + + public void ExecuteBatchCommand(CommandBatch commandBatch) + { + using (var connection = this.GetConnection()) + { + connection.Open(); + var transaction = connection.BeginTransaction(); + + foreach (var command in commandBatch.Commands) + { + try + { + var dataParameters = this.GetCriterialParameters(command.Parameters); + this.ExecuteNonQuery(connection, transaction, CommandType.Text, command.Expression, dataParameters); + } + catch (Exception) + { + if (!commandBatch.ThrowOnError) continue; + + transaction.Rollback(); + throw; + } + } + + transaction.Commit(); + } + } + + #endregion + + #region ExecuteNonQuery + + protected int ExecuteNonQuery(CommandType commandType, string commandText, params IDataParameter[] commandParameters) + { + int rowAffected; + + using (var connection = this.GetConnection()) + { + IDbTransaction transaction = null; + + try + { + connection.Open(); + transaction = connection.BeginTransaction(); + + rowAffected = this.ExecuteNonQuery(connection, transaction, commandType, commandText, commandParameters); + transaction.Commit(); + } + catch (Exception) + { + transaction?.Rollback(); + throw; + } + } + + return rowAffected; + } + + protected virtual int ExecuteNonQuery(IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, params IDataParameter[] commandParameters) + { + if (connection == null) throw new ArgumentNullException(nameof(connection)); + + var cmd = connection.CreateCommand(); + var mustCloseConnection = this.PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + var retval = cmd.ExecuteNonQuery(); + + cmd.Parameters.Clear(); + if (mustCloseConnection) connection.Close(); + + return retval; + } + #endregion ExecuteNonQuery + + #region Parameter Discovery Functions + + protected IDataParameter[] GetCriterialParameters(IEnumerable> parameters) + { + return parameters?.Select(p => this.GetParameter(p.Key, p.Value)).ToArray(); + } + + #endregion Parameter Discovery Functions + + } +} \ No newline at end of file diff --git a/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs new file mode 100644 index 0000000..adabae2 --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs @@ -0,0 +1,14 @@ +namespace ADO.ExecuteCommand.Helper +{ + public class DataAccessSectionSettings + { + public DataAccessSectionSettings(string type, string connectionString) + { + Type = type; + ConnectionString = connectionString; + } + + public string Type { get; } + public string ConnectionString { get; } + } +} diff --git a/ADO.ExecuteCommand.Core/Helper/MsSql.cs b/ADO.ExecuteCommand.Core/Helper/MsSql.cs new file mode 100644 index 0000000..8cbe7e4 --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/MsSql.cs @@ -0,0 +1,36 @@ + +using System; +using System.Data; +using System.Data.SqlClient; + +namespace ADO.ExecuteCommand.Helper +{ + public class MsSql : CommandHelper + { + public MsSql(string connectionString) : base(connectionString) + { + } + + public override IDbConnection GetConnection() + { + if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); + return new SqlConnection(ConnectionString); + } + + /// + /// Return a database connection using connection string passed as parameter + /// + /// connection string to use + /// Database connection + public IDbConnection GetConnection(string connectionString) + { + if (string.IsNullOrEmpty(connectionString)) throw new NullReferenceException("connectionString"); + return new SqlConnection(connectionString); + } + + protected override IDataParameter GetParameter() + { + return new SqlParameter(); + } + } +} diff --git a/ADO.ExecuteCommand.Core/Helper/PgSql.cs b/ADO.ExecuteCommand.Core/Helper/PgSql.cs new file mode 100644 index 0000000..3e56b4e --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/PgSql.cs @@ -0,0 +1,30 @@ +using System; +using System.Data; +using Npgsql; + +namespace ADO.ExecuteCommand.Helper +{ + public class PgSql : CommandHelper + { + public PgSql(string connectionString) : base(connectionString) + { + } + + public override IDbConnection GetConnection() + { + if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); + return new NpgsqlConnection(ConnectionString); + } + + public IDbConnection GetConnection(string connectionString) + { + if (string.IsNullOrEmpty(connectionString)) throw new NullReferenceException("connectionString"); + return new NpgsqlConnection(connectionString); + } + + protected override IDataParameter GetParameter() + { + return new NpgsqlParameter(); + } + } +} diff --git a/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..055d60e --- /dev/null +++ b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ADO.ExecuteCommand.Core")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b7737b4f-4c59-4ce5-aa62-0a6cca639473")] diff --git a/ADO.ExecuteCommand.Core/project.json b/ADO.ExecuteCommand.Core/project.json new file mode 100644 index 0000000..2e7bc9f --- /dev/null +++ b/ADO.ExecuteCommand.Core/project.json @@ -0,0 +1,17 @@ +{ + "version": "1.0.0-*", + + "dependencies": { + "NETStandard.Library": "1.6.0", + "Npgsql": "3.1.8", + "System.Collections.NonGeneric": "4.0.1", + "System.Data.Common": "4.1.0", + "System.Data.SqlClient": "4.1.0" + }, + + "frameworks": { + "netstandard1.4": { + "imports": "dnxcore50" + } + } +} diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs new file mode 100644 index 0000000..7ac7c99 --- /dev/null +++ b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections; +using System.Configuration; + +namespace ADO.ExecuteCommand.Helper +{ + public abstract partial class CommandHelper + { + #region - Factory - + + public static CommandHelper CreateHelper(string providerAlias) + { + try + { + var dict = ConfigurationManager.GetSection("daProviders") as IDictionary; + if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session."); + + var providerConfig = dict[providerAlias] as ProviderAlias; + if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session."); + + return CreateHelper(new DataAccessSectionSettings(providerConfig.TypeName, providerConfig.ConnectionString)); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e); + } + } + + public static CommandHelper CreateHelper(DataAccessSectionSettings settings) + { + try + { + var providerType = settings.Type; + + var daType = Type.GetType(providerType); + if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session."); + + var provider = Activator.CreateInstance(daType, settings.ConnectionString); + if (provider is CommandHelper) + { + return provider as CommandHelper; + } + + throw new Exception("The provider specified does not extends the QueryRunner abstract class."); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e); + } + } + + #endregion + } +} From 18b710b092dda6905ed89389443d055569ecb1e7 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 10 Nov 2016 13:10:57 +0000 Subject: [PATCH 6/6] remove package to specific platform --- .../NET.Database.CommandLayer.Win.1.0.0.5.nupkg | Bin 16954 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg diff --git a/NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg b/NuGet/NET.Database.CommandLayer.Win.1.0.0.5.nupkg deleted file mode 100644 index dfc85f8f0752a72d474161cd34c703927f8468e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16954 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