From 1732f6cc1274315de37e7d000b6770ebab2ddfc7 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 10:08:13 +0100 Subject: [PATCH 01/38] version 4.2.0 --- Sources/GlobalAssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/GlobalAssemblyInfo.cs b/Sources/GlobalAssemblyInfo.cs index fd05e8aa..40467503 100644 --- a/Sources/GlobalAssemblyInfo.cs +++ b/Sources/GlobalAssemblyInfo.cs @@ -9,5 +9,5 @@ [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] -[assembly: AssemblyVersion("4.1.1.0")] -[assembly: AssemblyFileVersion("4.1.1.0")] +[assembly: AssemblyVersion("4.2.0.0")] +[assembly: AssemblyFileVersion("4.2.0.0")] From 92a7f74d4f6051f03a8a504dd3d500be89438518 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 10:42:42 +0100 Subject: [PATCH 02/38] central package management --- Sources/Directory.Build.props | 2 +- Sources/Directory.Packages.props | 28 +++++++++++++++++++ .../SqlDatabase.PowerShell.Test.csproj | 15 ++++------ .../SqlDatabase.PowerShell.csproj | 2 +- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 14 +++++----- Sources/SqlDatabase/SqlDatabase.csproj | 20 ++++++------- 6 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 Sources/Directory.Packages.props diff --git a/Sources/Directory.Build.props b/Sources/Directory.Build.props index a7fec37a..8a286147 100644 --- a/Sources/Directory.Build.props +++ b/Sources/Directory.Build.props @@ -15,7 +15,7 @@ - + diff --git a/Sources/Directory.Packages.props b/Sources/Directory.Packages.props new file mode 100644 index 00000000..3a598665 --- /dev/null +++ b/Sources/Directory.Packages.props @@ -0,0 +1,28 @@ + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj index 9917b25d..9b771d4d 100644 --- a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj +++ b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj @@ -7,15 +7,12 @@ - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + + + + diff --git a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj index bbd43a6f..2a22b124 100644 --- a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj +++ b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj @@ -7,7 +7,7 @@ - + diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 0f3745f3..3b0228f1 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -8,13 +8,13 @@ - - - - - - - + + + + + + + diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 4ca88f4f..b9d247fd 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -60,34 +60,34 @@ - + - + - + - + - + - - - + + + - - + + From b62c65aa2a3a803e611519e81bcbe0486d5a8ef4 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 10:49:26 +0100 Subject: [PATCH 03/38] InvokeBuild 5.9.12 => 5.10.4 ThirdPartyLibraries 3.1.2 => 3.4.1 --- Build/README.md | 4 ++-- Build/build.ps1 | 2 +- Build/create-images.ps1 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Build/README.md b/Build/README.md index f5304836..e4433b26 100644 --- a/Build/README.md +++ b/Build/README.md @@ -7,8 +7,8 @@ build.ps1 is designed to run on windows - PowerShell [7.2.1](https://github.com/PowerShell/PowerShell/releases/tag/v7.2.1) for .net 6.0 tests - PowerShell [7.1.5](https://github.com/PowerShell/PowerShell/releases/tag/v7.1.5) for .net 5.0 tests - PowerShell [7.0.8](https://github.com/PowerShell/PowerShell/releases/tag/v7.0.8) for .net core 3.1 tests -- Install-Module -Name [InvokeBuild](https://www.powershellgallery.com/packages/InvokeBuild/5.9.12) -RequiredVersion 5.9.12 -- Install-Module -Name [ThirdPartyLibraries](https://www.powershellgallery.com/packages/ThirdPartyLibraries/3.1.2) -RequiredVersion 3.1.2 +- Install-Module -Name [InvokeBuild](https://www.powershellgallery.com/packages/InvokeBuild/5.10.4) -RequiredVersion 5.10.4 +- Install-Module -Name [ThirdPartyLibraries](https://www.powershellgallery.com/packages/ThirdPartyLibraries/3.4.1) -RequiredVersion 3.4.1 - .net framework 4.7.2+ sdk - .net 7.0 sdk - docker, switched to linux containers diff --git a/Build/build.ps1 b/Build/build.ps1 index 7cd2fd66..b6ba01ac 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -1,5 +1,5 @@ #Requires -Version "7.0" -#Requires -Modules @{ ModuleName="InvokeBuild"; ModuleVersion="5.9.12" } +#Requires -Modules @{ ModuleName="InvokeBuild"; ModuleVersion="5.10.4" } Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" diff --git a/Build/create-images.ps1 b/Build/create-images.ps1 index 61280f6a..05b230f1 100644 --- a/Build/create-images.ps1 +++ b/Build/create-images.ps1 @@ -1,5 +1,5 @@ #Requires -Version "7.0" -#Requires -Modules @{ ModuleName="InvokeBuild"; ModuleVersion="5.9.12" } +#Requires -Modules @{ ModuleName="InvokeBuild"; ModuleVersion="5.10.4" } Set-StrictMode -Version Latest From e4ec5baf5b6a0c6ec564334fb632dde7b040d7f7 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 11:27:00 +0100 Subject: [PATCH 04/38] .sln remove netcore3.1 and net5.0 --- Sources/SqlDatabase.Test/SqlDatabase.Test.csproj | 2 +- .../SqlDatabase/Configuration/CreateCommandLine.cs | 2 +- .../SqlDatabase/Configuration/ExecuteCommandLine.cs | 2 +- .../SqlDatabase/Configuration/UpgradeCommandLine.cs | 2 +- .../PowerShellInternal/PowerShellFactory.hosted.cs | 2 +- Sources/SqlDatabase/SqlDatabase.csproj | 12 ++---------- 6 files changed, 7 insertions(+), 15 deletions(-) diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 3b0228f1..5439355a 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -1,7 +1,7 @@  - net472;netcoreapp3.1;net5.0;net6.0;net7.0 + net472;net6.0;net7.0 SqlDatabase NU1702 ..\..\bin\Tests diff --git a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs index bf27f249..53d059b5 100644 --- a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs @@ -41,7 +41,7 @@ public override ICommand CreateCommand(ILogger logger) protected override bool ParseArg(Arg arg) { -#if NETCOREAPP || NET5_0_OR_GREATER +#if NET5_0_OR_GREATER if (Arg.UsePowerShell.Equals(arg.Key, System.StringComparison.OrdinalIgnoreCase)) { UsePowerShell = arg.Value; diff --git a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs index 3fc11ed2..f5d11ddf 100644 --- a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs @@ -56,7 +56,7 @@ protected override bool ParseArg(Arg arg) return true; } -#if NETCOREAPP || NET5_0_OR_GREATER +#if NET5_0_OR_GREATER if (Arg.UsePowerShell.Equals(arg.Key, StringComparison.OrdinalIgnoreCase)) { UsePowerShell = arg.Value; diff --git a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs index 3b2ada29..d17f8ec2 100644 --- a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs @@ -63,7 +63,7 @@ protected override bool ParseArg(Arg arg) return true; } -#if NETCOREAPP || NET5_0_OR_GREATER +#if NET5_0_OR_GREATER if (Arg.UsePowerShell.Equals(arg.Key, StringComparison.OrdinalIgnoreCase)) { UsePowerShell = arg.Value; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs index 4f79bae0..143e9388 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs @@ -1,4 +1,4 @@ -#if NETCOREAPP || NET5_0_OR_GREATER +#if NET5_0_OR_GREATER using System; using System.IO; using System.Management.Automation; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index b9d247fd..3a00cd67 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -1,8 +1,8 @@  - net452;netcoreapp3.1;net5.0;net6.0;net7.0;netstandard2.0 - netcoreapp3.1;net5.0;net6.0;net7.0 + net452;net6.0;net7.0;netstandard2.0 + net6.0;net7.0 @@ -63,14 +63,6 @@ - - - - - - - - From 4d74f1b562bc5a31984c0b8ca74fd51578de4ae1 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 11:27:54 +0100 Subject: [PATCH 05/38] docs remove netcore3.1 and net5.0 --- Examples/CSharpMirationStep/readme.md | 6 +++--- Examples/PowerShellScript/readme.md | 4 +--- Examples/SqlServerDockerImage/create-database.dockerfile | 4 ++-- .../upgrade-database-scripts.dockerfile | 4 ++-- README.md | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Examples/CSharpMirationStep/readme.md b/Examples/CSharpMirationStep/readme.md index e142106a..a9a31bba 100644 --- a/Examples/CSharpMirationStep/readme.md +++ b/Examples/CSharpMirationStep/readme.md @@ -4,12 +4,12 @@ Any assembly script is - .exe or .dll for target framework is 4.5.2+ -- .dll for .net 7.0, 6.0, 5.0 or .net core 3.1 +- .dll for .net 7.0 or 6.0 - has exactly one class with script implementation This project is an example of script implementation. The build output is 2.1_2.2.dll with target framework 4.5.2. -Due to the current dependencies, 2.1_2.2.dll works well on .net 7.0 - .net core 3.1. +Due to the current dependencies, 2.1_2.2.dll works well on .net 6.0+. ## Script source @@ -81,7 +81,7 @@ After the migration step is finished or failed - the domain will be unloaded - temporary directory will be deleted -## Runtime .NET Core +## Runtime .NET At runtime the assembly will be loaded into the current application domain (`AssemblyLoadContext.Default`). diff --git a/Examples/PowerShellScript/readme.md b/Examples/PowerShellScript/readme.md index fd83bf0b..634e646c 100644 --- a/Examples/PowerShellScript/readme.md +++ b/Examples/PowerShellScript/readme.md @@ -67,7 +67,7 @@ The version with which you run the module. Installed Powershell Desktop version. -### .net SDK tool for .net 5.0/6.0 or .net core 3.1 +### .net SDK tool for .net 6.0+ [![NuGet](https://img.shields.io/nuget/v/SqlDatabase.GlobalTool.svg?style=flat-square&label=nuget%20dotnet%20tool)](https://www.nuget.org/packages/SqlDatabase.GlobalTool/) @@ -75,8 +75,6 @@ Pre-installed Powershell Core is required, will be used by SqlDatabase as extern * SqlDatabase .net 7.0 can host Powershell Core versions below 7.4 * SqlDatabase .net 6.0 can host Powershell Core versions below 7.3 -* .net 5.0 can host Powershell Core versions below 7.2 -* .net core 3.1 below 7.1 PowerShell location can be passed via command line: diff --git a/Examples/SqlServerDockerImage/create-database.dockerfile b/Examples/SqlServerDockerImage/create-database.dockerfile index 2a820422..2cf2e4a6 100644 --- a/Examples/SqlServerDockerImage/create-database.dockerfile +++ b/Examples/SqlServerDockerImage/create-database.dockerfile @@ -7,11 +7,11 @@ ENV ACCEPT_EULA=Y \ # copy scripts COPY create-database-scripts/ /sql-scripts/ -# install .net 5.0 sdk +# install .net 6.0 sdk RUN apt-get update && \ apt-get install -y apt-transport-https && \ apt-get update && \ - apt-get install -y dotnet-sdk-5.0 + apt-get install -y dotnet-sdk-6.0 # install SqlDatabase.GlobalTool RUN dotnet tool install --global SqlDatabase.GlobalTool diff --git a/Examples/SqlServerDockerImage/upgrade-database-scripts.dockerfile b/Examples/SqlServerDockerImage/upgrade-database-scripts.dockerfile index 3f65ada3..1b4fba3e 100644 --- a/Examples/SqlServerDockerImage/upgrade-database-scripts.dockerfile +++ b/Examples/SqlServerDockerImage/upgrade-database-scripts.dockerfile @@ -4,11 +4,11 @@ FROM sqldatabase/mssql-server-linux-demo:create AS build # copy scripts COPY upgrade-database-scripts/ /sql-scripts/ -# install .net 5.0 sdk +# install .net 6.0 sdk RUN apt-get update && \ apt-get install -y apt-transport-https && \ apt-get update && \ - apt-get install -y dotnet-sdk-5.0 + apt-get install -y dotnet-sdk-6.0 # install SqlDatabase.GlobalTool RUN dotnet tool install --global SqlDatabase.GlobalTool diff --git a/README.md b/README.md index 78d5941c..aa48857b 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,9 @@ Installation PowerShell module is compatible with Powershell Core 6.1+ and PowerShell Desktop 5.1. -.net tool is compatible with .net sdk 7.0, 6.0, 5.0 and .net core 3.1. +.net tool is compatible with .net sdk 7.0, and 6.0. -Command-line tool is compatible with .net runtime 7.0, 6.0, 5.0, .net core runtime 3.1 and .net framework 4.5.2+. +Command-line tool is compatible with .net runtime 7.0, 6.0 and .net framework 4.5.2+. ### PowerShell, from gallery From bfc43c1ed6cf04470862d09f6b69545bced7399d Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 11:28:29 +0100 Subject: [PATCH 06/38] build remove netcore3.1 and net5.0 --- Build/README.md | 2 -- Build/build-tasks.ps1 | 14 ++------ Build/create-images-tasks.ps1 | 42 +---------------------- Build/image-dotnet-runtime-3.1.dockerfile | 8 ----- Build/image-dotnet-runtime-5.0.dockerfile | 8 ----- Build/image-dotnet-sdk-3.1.dockerfile | 8 ----- Build/image-dotnet-sdk-5.0.dockerfile | 8 ----- 7 files changed, 4 insertions(+), 86 deletions(-) delete mode 100644 Build/image-dotnet-runtime-3.1.dockerfile delete mode 100644 Build/image-dotnet-runtime-5.0.dockerfile delete mode 100644 Build/image-dotnet-sdk-3.1.dockerfile delete mode 100644 Build/image-dotnet-sdk-5.0.dockerfile diff --git a/Build/README.md b/Build/README.md index e4433b26..f827c40e 100644 --- a/Build/README.md +++ b/Build/README.md @@ -5,8 +5,6 @@ build.ps1 is designed to run on windows - PowerShell Desktop 5.1 - PowerShell [7.3.0](https://github.com/PowerShell/PowerShell/releases/tag/v7.3.0) for .net 7.0 tests - PowerShell [7.2.1](https://github.com/PowerShell/PowerShell/releases/tag/v7.2.1) for .net 6.0 tests -- PowerShell [7.1.5](https://github.com/PowerShell/PowerShell/releases/tag/v7.1.5) for .net 5.0 tests -- PowerShell [7.0.8](https://github.com/PowerShell/PowerShell/releases/tag/v7.0.8) for .net core 3.1 tests - Install-Module -Name [InvokeBuild](https://www.powershellgallery.com/packages/InvokeBuild/5.10.4) -RequiredVersion 5.10.4 - Install-Module -Name [ThirdPartyLibraries](https://www.powershellgallery.com/packages/ThirdPartyLibraries/3.4.1) -RequiredVersion 3.4.1 - .net framework 4.7.2+ sdk diff --git a/Build/build-tasks.ps1 b/Build/build-tasks.ps1 index 52261cd2..d6e22783 100644 --- a/Build/build-tasks.ps1 +++ b/Build/build-tasks.ps1 @@ -107,7 +107,7 @@ task PackManualDownload PackGlobalTool, PackPoweShellModule, { $source = Join-Path $settings.artifactsPowerShell "*" Compress-Archive -Path $source -DestinationPath $destination - $targets = "net452", "netcoreapp3.1", "net5.0", "net6.0", "net7.0" + $targets = "net452", "net6.0", "net7.0" foreach ($target in $targets) { $destination = Join-Path $out "SqlDatabase.$packageVersion-$target.zip" $source = Join-Path $settings.bin "SqlDatabase\$target\*" @@ -118,8 +118,6 @@ task PackManualDownload PackGlobalTool, PackPoweShellModule, { task UnitTest { $builds = @( @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net472" } - @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "netcoreapp3.1" } - @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net5.0" } @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net6.0" } @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net7.0" } ) @@ -211,9 +209,7 @@ task PsCoreTest { task SdkToolTest { $images = $( - "sqldatabase/dotnet_pwsh:3.1-sdk" - , "sqldatabase/dotnet_pwsh:5.0-sdk" - , "sqldatabase/dotnet_pwsh:6.0-sdk" + "sqldatabase/dotnet_pwsh:6.0-sdk" , "sqldatabase/dotnet_pwsh:7.0-sdk") $builds = @() @@ -234,9 +230,7 @@ task SdkToolTest { task NetRuntimeLinuxTest { $testCases = $( - @{ targetFramework = "netcoreapp3.1"; image = "sqldatabase/dotnet_pwsh:3.1-runtime" } - , @{ targetFramework = "net5.0"; image = "sqldatabase/dotnet_pwsh:5.0-runtime" } - , @{ targetFramework = "net6.0"; image = "sqldatabase/dotnet_pwsh:6.0-runtime" } + @{ targetFramework = "net6.0"; image = "sqldatabase/dotnet_pwsh:6.0-runtime" } , @{ targetFramework = "net7.0"; image = "sqldatabase/dotnet_pwsh:7.0-runtime" } ) @@ -260,8 +254,6 @@ task NetRuntimeLinuxTest { task NetRuntimeWindowsTest { $testCases = $( "net452" - , "netcoreapp3.1" - , "net5.0" , "net6.0" , "net7.0" ) diff --git a/Build/create-images-tasks.ps1 b/Build/create-images-tasks.ps1 index 0747aec6..1f9b0486 100644 --- a/Build/create-images-tasks.ps1 +++ b/Build/create-images-tasks.ps1 @@ -1,9 +1,5 @@ task Default ` - BuildDotnetSdk31 ` - , BuildDotnetRuntime31 ` - , BuildDotnetSdk50 ` - , BuildDotnetRuntime50 ` - , BuildDotnetSdk60 ` + BuildDotnetSdk60 ` , BuildDotnetRuntime60 ` , BuildDotnetSdk70 ` , BuildDotnetRuntime70 ` @@ -41,42 +37,6 @@ task BuildMySqlDatabase { } } -task BuildDotnetSdk31 { - exec { - docker build ` - -f image-dotnet-sdk-3.1.dockerfile ` - -t sqldatabase/dotnet_pwsh:3.1-sdk ` - . - } -} - -task BuildDotnetRuntime31 { - exec { - docker build ` - -f image-dotnet-runtime-3.1.dockerfile ` - -t sqldatabase/dotnet_pwsh:3.1-runtime ` - . - } -} - -task BuildDotnetSdk50 { - exec { - docker build ` - -f image-dotnet-sdk-5.0.dockerfile ` - -t sqldatabase/dotnet_pwsh:5.0-sdk ` - . - } -} - -task BuildDotnetRuntime50 { - exec { - docker build ` - -f image-dotnet-runtime-5.0.dockerfile ` - -t sqldatabase/dotnet_pwsh:5.0-runtime ` - . - } -} - task BuildDotnetSdk60 { exec { docker build ` diff --git a/Build/image-dotnet-runtime-3.1.dockerfile b/Build/image-dotnet-runtime-3.1.dockerfile deleted file mode 100644 index 82ddfa70..00000000 --- a/Build/image-dotnet-runtime-3.1.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/runtime:3.1 - -RUN apt-get update && \ - apt-get install -y liblttng-ust0 && \ - curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.0.5/powershell_7.0.5-1.debian.10_amd64.deb --output powershell_7.0.5-1.debian.10_amd64.deb && \ - dpkg -i powershell_7.0.5-1.debian.10_amd64.deb && \ - apt-get install -f && \ - rm -f powershell_7.0.5-1.debian.10_amd64.deb \ No newline at end of file diff --git a/Build/image-dotnet-runtime-5.0.dockerfile b/Build/image-dotnet-runtime-5.0.dockerfile deleted file mode 100644 index 3cca76ca..00000000 --- a/Build/image-dotnet-runtime-5.0.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/dotnet/runtime:5.0 - -RUN apt-get update && \ - apt-get install -y liblttng-ust0 curl && \ - curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.1.2/powershell_7.1.2-1.debian.10_amd64.deb --output powershell_7.1.2-1.debian.10_amd64.deb && \ - dpkg -i powershell_7.1.2-1.debian.10_amd64.deb && \ - apt-get install -f && \ - rm -f powershell_7.1.2-1.debian.10_amd64.deb \ No newline at end of file diff --git a/Build/image-dotnet-sdk-3.1.dockerfile b/Build/image-dotnet-sdk-3.1.dockerfile deleted file mode 100644 index b2e4803e..00000000 --- a/Build/image-dotnet-sdk-3.1.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.1 - -RUN apt-get update && \ - apt-get install -y liblttng-ust0 && \ - curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.0.5/powershell_7.0.5-1.debian.10_amd64.deb --output powershell_7.0.5-1.debian.10_amd64.deb && \ - dpkg -i powershell_7.0.5-1.debian.10_amd64.deb && \ - apt-get install -f && \ - rm -f powershell_7.0.5-1.debian.10_amd64.deb \ No newline at end of file diff --git a/Build/image-dotnet-sdk-5.0.dockerfile b/Build/image-dotnet-sdk-5.0.dockerfile deleted file mode 100644 index 9ecbea75..00000000 --- a/Build/image-dotnet-sdk-5.0.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0 - -RUN apt-get update && \ - apt-get install -y liblttng-ust0 && \ - curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.1.2/powershell_7.1.2-1.debian.10_amd64.deb --output powershell_7.1.2-1.debian.10_amd64.deb && \ - dpkg -i powershell_7.1.2-1.debian.10_amd64.deb && \ - apt-get install -f && \ - rm -f powershell_7.1.2-1.debian.10_amd64.deb \ No newline at end of file From 2e0f69cfe67be55fadab052dbb2b95cfd44271c2 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 11:28:47 +0100 Subject: [PATCH 07/38] tpl remove netcore3.1 and net5.0 --- .../nuget.org/castle.core/5.1.0/index.json | 12 +- .../nuget.org/castle.core/5.1.0/readme.md | 4 +- .../dapper.strongname/2.0.123/index.json | 10 +- .../dapper.strongname/2.0.123/readme.md | 2 +- .../nuget.org/diffengine/10.0.0/index.json | 16 +-- .../nuget.org/diffengine/10.0.0/readme.md | 2 +- .../nuget.org/emptyfiles/2.8.0/index.json | 16 +-- .../nuget.org/emptyfiles/2.8.0/readme.md | 2 +- .../microsoft.codecoverage/17.4.0/index.json | 16 +-- .../microsoft.codecoverage/17.4.0/readme.md | 2 +- .../microsoft.net.test.sdk/17.4.0/index.json | 16 +-- .../microsoft.net.test.sdk/17.4.0/readme.md | 2 +- .../17.4.0/index.json | 16 +-- .../17.4.0/readme.md | 2 +- .../17.4.0/index.json | 16 +-- .../17.4.0/readme.md | 2 +- .../microsoft.win32.registry/4.7.0/index.json | 8 +- .../microsoft.win32.registry/4.7.0/readme.md | 2 +- .../microsoft.win32.registry/5.0.0/index.json | 16 +-- .../microsoft.win32.registry/5.0.0/readme.md | 2 +- .../microsoft.wsman.runtime/7.0.5/index.json | 34 ----- .../7.0.5/package-LICENSE.txt | 21 --- .../7.0.5/package.nuspec | 23 ---- .../7.0.5/project-LICENSE.txt | 21 --- .../microsoft.wsman.runtime/7.0.5/readme.md | 26 ---- .../microsoft.wsman.runtime/7.0.5/remarks.md | 0 .../7.0.5/third-party-notices.txt | 0 .../microsoft.wsman.runtime/7.1.2/index.json | 34 ----- .../7.1.2/package.nuspec | 24 ---- .../7.1.2/project-LICENSE.txt | 21 --- .../microsoft.wsman.runtime/7.1.2/readme.md | 26 ---- .../microsoft.wsman.runtime/7.1.2/remarks.md | 0 .../7.1.2/third-party-notices.txt | 0 .../microsoft.wsman.runtime/7.2.0/index.json | 11 +- .../microsoft.wsman.runtime/7.2.0/readme.md | 2 +- .../microsoft.wsman.runtime/7.3.0/index.json | 11 +- .../microsoft.wsman.runtime/7.3.0/readme.md | 2 +- .../packages/nuget.org/moq/4.18.2/index.json | 7 +- .../packages/nuget.org/moq/4.18.2/readme.md | 2 +- .../mysqlconnector/1.3.10/index.json | 11 +- .../nuget.org/mysqlconnector/1.3.10/readme.md | 2 +- .../netstandard.library/2.0.3/index.json | 8 +- .../netstandard.library/2.0.3/readme.md | 2 +- .../newtonsoft.json/13.0.2/index.json | 13 +- .../newtonsoft.json/13.0.2/readme.md | 2 +- .../nuget.org/npgsql/4.0.11/index.json | 11 +- .../nuget.org/npgsql/4.0.11/readme.md | 2 +- .../nuget.frameworks/5.11.0/index.json | 10 +- .../nuget.frameworks/5.11.0/readme.md | 2 +- .../nuget.org/nunit/3.13.3/index.json | 13 +- .../packages/nuget.org/nunit/3.13.3/readme.md | 2 +- .../nunit3testadapter/4.3.1/index.json | 13 +- .../nunit3testadapter/4.3.1/readme.md | 2 +- .../5.1.0/index.json | 15 +- .../5.1.0/readme.md | 2 +- .../nuget.org/shouldly/4.1.0/index.json | 10 +- .../nuget.org/shouldly/4.1.0/readme.md | 2 +- .../1.2.0.435/index.json | 15 +- .../1.2.0.435/readme.md | 2 +- .../nuget.org/system.buffers/4.4.0/index.json | 8 +- .../nuget.org/system.buffers/4.4.0/readme.md | 2 +- .../nuget.org/system.buffers/4.5.1/index.json | 8 +- .../nuget.org/system.buffers/4.5.1/readme.md | 2 +- .../nuget.org/system.codedom/5.0.0/index.json | 16 +-- .../nuget.org/system.codedom/5.0.0/readme.md | 2 +- .../4.5.0/index.json | 8 +- .../4.5.0/readme.md | 2 +- .../system.data.sqlclient/4.8.5/index.json | 8 +- .../system.data.sqlclient/4.8.5/readme.md | 2 +- .../4.7.0/index.json | 8 +- .../4.7.0/readme.md | 2 +- .../4.7.0/index.json | 43 ------ .../4.7.0/package-LICENSE.txt | 23 ---- .../4.7.0/package.nuspec | 49 ------- .../4.7.0/readme.md | 35 ----- .../4.7.0/remarks.md | 0 .../4.7.0/third-party-notices.txt | 0 .../6.0.0/index.json | 13 +- .../6.0.0/readme.md | 2 +- .../system.management/5.0.0/index.json | 16 +-- .../system.management/5.0.0/readme.md | 2 +- .../nuget.org/system.memory/4.5.3/index.json | 8 +- .../nuget.org/system.memory/4.5.3/readme.md | 2 +- .../nuget.org/system.memory/4.5.4/index.json | 8 +- .../nuget.org/system.memory/4.5.4/readme.md | 2 +- .../system.numerics.vectors/4.4.0/index.json | 8 +- .../system.numerics.vectors/4.4.0/readme.md | 2 +- .../1.6.0/index.json | 10 +- .../1.6.0/readme.md | 2 +- .../4.5.2/index.json | 8 +- .../4.5.2/readme.md | 2 +- .../4.5.3/index.json | 10 +- .../4.5.3/readme.md | 2 +- .../4.7.0/index.json | 8 +- .../4.7.0/readme.md | 2 +- .../4.3.0/index.json | 10 +- .../4.3.0/package-dotnet_library_license.txt | 128 ++++++++++++++++++ .../4.3.0/readme.md | 2 +- .../system.runtime.loader/4.3.0/index.json | 8 +- .../4.3.0/package-dotnet_library_license.txt | 128 ++++++++++++++++++ .../system.runtime.loader/4.3.0/readme.md | 2 +- .../4.7.0/index.json | 8 +- .../4.7.0/readme.md | 2 +- .../5.0.0/index.json | 16 +-- .../5.0.0/readme.md | 2 +- .../4.5.0/index.json | 8 +- .../4.5.0/readme.md | 2 +- .../4.5.0/index.json | 7 +- .../4.5.0/readme.md | 2 +- .../4.7.0/index.json | 8 +- .../4.7.0/readme.md | 2 +- .../5.0.0/index.json | 16 +-- .../5.0.0/readme.md | 2 +- .../4.7.0/index.json | 8 +- .../4.7.0/readme.md | 2 +- .../4.5.2/index.json | 8 +- .../4.5.2/readme.md | 2 +- .../4.5.4/index.json | 10 +- .../4.5.4/readme.md | 2 +- .../system.valuetuple/4.5.0/index.json | 7 +- .../system.valuetuple/4.5.0/readme.md | 2 +- Build/third-party-libraries/readme.md | 7 +- 122 files changed, 517 insertions(+), 777 deletions(-) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/project-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/remarks.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/third-party-notices.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/project-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/remarks.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/third-party-notices.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/remarks.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/third-party-notices.txt create mode 100644 Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt create mode 100644 Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/package-dotnet_library_license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json index 8a94c743..b78b4fc3 100644 --- a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "Apache-2.0", "Status": "AutomaticallyApproved" @@ -8,16 +9,14 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { "Name": "System.Diagnostics.EventLog", - "Version": "4.7.0" + "Version": "6.0.0" } ] } @@ -26,8 +25,7 @@ { "Subject": "package", "Code": "Apache-2.0", - "HRef": "https://licenses.nuget.org/Apache-2.0", - "Description": null + "HRef": "https://licenses.nuget.org/Apache-2.0" }, { "Subject": "repository", diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md index 6d4882ed..f5dc4a03 100644 --- a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md @@ -3,7 +3,7 @@ Castle.Core [5.1.0](https://www.nuget.org/packages/Castle.Core/5.1.0) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [Apache-2.0](../../../../licenses/apache-2.0) @@ -25,6 +25,6 @@ Dependencies 1 |Name|Version| |----------|:----| -|[System.Diagnostics.EventLog](../../../../packages/nuget.org/system.diagnostics.eventlog/4.7.0)|4.7.0| +|[System.Diagnostics.EventLog](../../../../packages/nuget.org/system.diagnostics.eventlog/6.0.0)|6.0.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json index 0f1a186f..b637b6ac 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "Apache-2.0", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,8 +19,7 @@ { "Subject": "package", "Code": "Apache-2.0", - "HRef": "https://licenses.nuget.org/Apache-2.0", - "Description": null + "HRef": "https://licenses.nuget.org/Apache-2.0" }, { "Subject": "repository", diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md index d9ad4978..bde8638a 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md @@ -3,7 +3,7 @@ Dapper.StrongName [2.0.123](https://www.nuget.org/packages/Dapper.StrongName/2.0 Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [Apache-2.0](../../../../licenses/apache-2.0) diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json index 5c6c8151..9266c196 100644 --- a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/VerifyTests/DiffEngine.git", - "Description": null + "HRef": "https://github.com/VerifyTests/DiffEngine.git" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/VerifyTests/DiffEngine", - "Description": null + "HRef": "https://github.com/VerifyTests/DiffEngine" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md index 00489c79..793c1f12 100644 --- a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md @@ -3,7 +3,7 @@ DiffEngine [10.0.0](https://www.nuget.org/packages/DiffEngine/10.0.0) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json b/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json index 4d10c323..5c459e2d 100644 --- a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,20 +19,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/SimonCropp/EmptyFiles.git", - "Description": null + "HRef": "https://github.com/SimonCropp/EmptyFiles.git" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/SimonCropp/EmptyFiles", - "Description": null + "HRef": "https://github.com/SimonCropp/EmptyFiles" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md b/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md index 9cd0372b..b02ddfc5 100644 --- a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md @@ -3,7 +3,7 @@ EmptyFiles [2.8.0](https://www.nuget.org/packages/EmptyFiles/2.8.0) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json index 04920ef7..b3d3b24a 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,20 +19,17 @@ { "Subject": "package", "Code": null, - "HRef": null, - "Description": null + "HRef": "LICENSE_NET.txt" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest", - "Description": null + "HRef": "https://github.com/microsoft/vstest" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/", - "Description": null + "HRef": "https://github.com/microsoft/vstest/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md index 205a4366..e90f599e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md @@ -3,7 +3,7 @@ Microsoft.CodeCoverage [17.4.0](https://www.nuget.org/packages/Microsoft.CodeCov Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json index 48f4f38f..3c6651e9 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": null, - "HRef": null, - "Description": null + "HRef": "LICENSE_NET.txt" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest", - "Description": null + "HRef": "https://github.com/microsoft/vstest" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/", - "Description": null + "HRef": "https://github.com/microsoft/vstest/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md index 982ca39c..c3cbc857 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md @@ -3,7 +3,7 @@ Microsoft.NET.Test.Sdk [17.4.0](https://www.nuget.org/packages/Microsoft.NET.Tes Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json index dec14c1c..241c60d1 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": null, - "HRef": null, - "Description": null + "HRef": "LICENSE_NET.txt" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest", - "Description": null + "HRef": "https://github.com/microsoft/vstest" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/", - "Description": null + "HRef": "https://github.com/microsoft/vstest/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md index 57872dab..a5c7691d 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md @@ -3,7 +3,7 @@ Microsoft.TestPlatform.ObjectModel [17.4.0](https://www.nuget.org/packages/Micro Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json index 41da6a47..80643bd9 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": null, - "HRef": null, - "Description": null + "HRef": "LICENSE_NET.txt" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest", - "Description": null + "HRef": "https://github.com/microsoft/vstest" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/", - "Description": null + "HRef": "https://github.com/microsoft/vstest/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md index e4243974..a288876e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md @@ -3,7 +3,7 @@ Microsoft.TestPlatform.TestHost [17.4.0](https://www.nuget.org/packages/Microsof Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json index 023f66fe..40cf82a5 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +30,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md index bf195d65..24c6871f 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md @@ -3,7 +3,7 @@ Microsoft.Win32.Registry [4.7.0](https://www.nuget.org/packages/Microsoft.Win32. Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json index bfd0f20b..84f9e03b 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime", - "Description": null + "HRef": "git://github.com/dotnet/runtime" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md index a353f944..3f02b444 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md @@ -3,7 +3,7 @@ Microsoft.Win32.Registry [5.0.0](https://www.nuget.org/packages/Microsoft.Win32. Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/index.json deleted file mode 100644 index 56922b42..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/index.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "License": { - "Code": "MIT", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": false, - "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", - "net6.0", - "net7.0", - "net452", - "netstandard2.0" - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt", - "Description": null - }, - { - "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell", - "Description": null - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package-LICENSE.txt deleted file mode 100644 index b2f52a2b..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Microsoft Corporation. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package.nuspec deleted file mode 100644 index 931c7132..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/package.nuspec +++ /dev/null @@ -1,23 +0,0 @@ - - - - Microsoft.WSMan.Runtime - 7.0.5 - Microsoft - Microsoft,PowerShell - true - https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt - https://github.com/PowerShell/PowerShell - https://github.com/PowerShell/PowerShell/blob/master/assets/Powershell_black_64.png?raw=true - Runtime for hosting PowerShell - © Microsoft Corporation. All rights reserved. - en-US - PowerShell - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/project-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/project-LICENSE.txt deleted file mode 100644 index b2f52a2b..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/project-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Microsoft Corporation. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/readme.md deleted file mode 100644 index 86985d2d..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -Microsoft.WSMan.Runtime [7.0.5](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.0.5) --------------------- - -Used by: SqlDatabase - -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt) -- project license: [MIT](https://github.com/PowerShell/PowerShell) - -Description ------------ -Runtime for hosting PowerShell - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/remarks.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.0.5/third-party-notices.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/index.json deleted file mode 100644 index f207f9ee..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/index.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "License": { - "Code": "MIT", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": false, - "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", - "net6.0", - "net7.0", - "net452", - "netstandard2.0" - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null - }, - { - "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell", - "Description": null - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/package.nuspec deleted file mode 100644 index 8c9564b2..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/package.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Microsoft.WSMan.Runtime - 7.1.2 - Microsoft - Microsoft,PowerShell - false - MIT - https://licenses.nuget.org/MIT - Powershell_black_64.png - https://github.com/PowerShell/PowerShell - Runtime for hosting PowerShell - © Microsoft Corporation. All rights reserved. - en-US - PowerShell - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/project-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/project-LICENSE.txt deleted file mode 100644 index b2f52a2b..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/project-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Microsoft Corporation. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/readme.md deleted file mode 100644 index 50df30e6..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -Microsoft.WSMan.Runtime [7.1.2](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.1.2) --------------------- - -Used by: SqlDatabase - -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [MIT](https://github.com/PowerShell/PowerShell) - -Description ------------ -Runtime for hosting PowerShell - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/remarks.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.1.2/third-party-notices.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json index f207f9ee..cba86bce 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,14 +20,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell", - "Description": null + "HRef": "https://github.com/PowerShell/PowerShell" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md index b17c9a95..6f86499d 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.2.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json index f207f9ee..cba86bce 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,14 +20,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell", - "Description": null + "HRef": "https://github.com/PowerShell/PowerShell" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md index aa252a5e..6cab6615 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.3.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json index a604858f..5785d232 100644 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "BSD-3-Clause", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md index 5aedd54e..4fad4779 100644 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md @@ -3,7 +3,7 @@ Moq [4.18.2](https://www.nuget.org/packages/Moq/4.18.2) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [BSD-3-Clause](../../../../licenses/bsd-3-clause) diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json index 21b914d7..714bd7b5 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,14 +20,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/mysql-net/MySqlConnector.git", - "Description": null + "HRef": "https://github.com/mysql-net/MySqlConnector.git" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md index de5afb3d..0c05ebc1 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md @@ -3,7 +3,7 @@ MySqlConnector [1.3.10](https://www.nuget.org/packages/MySqlConnector/1.3.10) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json index d6322f13..993b048b 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/standard/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/standard/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md index 60dff056..3ca521de 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md @@ -3,7 +3,7 @@ NETStandard.Library [2.0.3](https://www.nuget.org/packages/NETStandard.Library/2 Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json index fd77bf70..68ca6e65 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,14 +19,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/JamesNK/Newtonsoft.Json", - "Description": null + "HRef": "https://github.com/JamesNK/Newtonsoft.Json" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md index af6f1f81..c0133f73 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md @@ -3,7 +3,7 @@ Newtonsoft.Json [13.0.2](https://www.nuget.org/packages/Newtonsoft.Json/13.0.2) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json index 467268bf..50a5d2ac 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "PostgreSQL", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,14 +26,12 @@ { "Subject": "package", "Code": "PostgreSQL", - "HRef": "https://licenses.nuget.org/PostgreSQL", - "Description": null + "HRef": "https://licenses.nuget.org/PostgreSQL" }, { "Subject": "repository", "Code": "PostgreSQL", - "HRef": "git://github.com/npgsql/npgsql", - "Description": null + "HRef": "git://github.com/npgsql/npgsql" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md index 75475b97..9666d82e 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md @@ -3,7 +3,7 @@ Npgsql [4.0.11](https://www.nuget.org/packages/Npgsql/4.0.11) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [PostgreSQL](../../../../licenses/postgresql) diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json index e2d3fe32..81aabac3 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "Apache-2.0", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,8 +19,7 @@ { "Subject": "package", "Code": "Apache-2.0", - "HRef": "https://licenses.nuget.org/Apache-2.0", - "Description": null + "HRef": "https://licenses.nuget.org/Apache-2.0" }, { "Subject": "repository", diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md index d812d5ac..7a067fec 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md @@ -3,7 +3,7 @@ NuGet.Frameworks [5.11.0](https://www.nuget.org/packages/NuGet.Frameworks/5.11.0 Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [Apache-2.0](../../../../licenses/apache-2.0) diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json b/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json index 5b0b9719..9b16bdaa 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,14 +19,12 @@ { "Subject": "package", "Code": null, - "HRef": null, - "Description": null + "HRef": "LICENSE.txt" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/nunit/nunit", - "Description": null + "HRef": "https://github.com/nunit/nunit" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md index b788b316..64527ef4 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md @@ -3,7 +3,7 @@ NUnit [3.13.3](https://www.nuget.org/packages/NUnit/3.13.3) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json index d8aa9087..ef0100e7 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,14 +19,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/nunit/nunit3-vs-adapter", - "Description": null + "HRef": "https://github.com/nunit/nunit3-vs-adapter" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md index bcec9301..73590804 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md @@ -3,7 +3,7 @@ NUnit3TestAdapter [4.3.1](https://www.nuget.org/packages/NUnit3TestAdapter/4.3.1 Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json index 13bf1f8a..8cab6d72 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,13 +9,11 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", + "net472", "net6.0", "net7.0", - "net452", - "netstandard2.0", - "net472" + "netstandard2.0" ] } ], @@ -22,14 +21,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt", - "Description": null + "HRef": "https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/PowerShell/PowerShellStandard", - "Description": null + "HRef": "https://github.com/PowerShell/PowerShellStandard" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md index 06c7815f..8948f8ad 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md @@ -3,7 +3,7 @@ PowerShellStandard.Library [5.1.0](https://www.nuget.org/packages/PowerShellStan Used by: SqlDatabase -Target frameworks: net452, net472, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json index 061e9015..3b1c4481 100644 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "BSD-2-Clause", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,8 +29,7 @@ { "Subject": "package", "Code": "BSD-2-Clause", - "HRef": "https://licenses.nuget.org/BSD-2-Clause", - "Description": null + "HRef": "https://licenses.nuget.org/BSD-2-Clause" }, { "Subject": "repository", diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md index 34644969..8e4162b8 100644 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md @@ -3,7 +3,7 @@ Shouldly [4.1.0](https://www.nuget.org/packages/Shouldly/4.1.0) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [BSD-2-Clause](../../../../licenses/bsd-2-clause) diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json index 64ec2c6e..9ac47f63 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,13 +9,11 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", + "net472", "net6.0", "net7.0", - "net452", - "netstandard2.0", - "net472" + "netstandard2.0" ] } ], @@ -22,14 +21,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/DotNetAnalyzers/StyleCopAnalyzers", - "Description": null + "HRef": "https://github.com/DotNetAnalyzers/StyleCopAnalyzers" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md index 207ab7dc..6515e0ec 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md @@ -3,7 +3,7 @@ StyleCop.Analyzers.Unstable [1.2.0.435](https://www.nuget.org/packages/StyleCop. Used by: SqlDatabase internal -Target frameworks: net452, net472, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json index 79494e46..4f760d7c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md index 914652b9..2dbb6293 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md @@ -3,7 +3,7 @@ System.Buffers [4.4.0](https://www.nuget.org/packages/System.Buffers/4.4.0) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json index 79494e46..4f760d7c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md index e50f8eb9..a5d390f7 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md @@ -3,7 +3,7 @@ System.Buffers [4.5.1](https://www.nuget.org/packages/System.Buffers/4.5.1) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json index cf67483a..8c27a13f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,20 +19,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime", - "Description": null + "HRef": "git://github.com/dotnet/runtime" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md index 296795bc..5663fd70 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md @@ -3,7 +3,7 @@ System.CodeDom [5.0.0](https://www.nuget.org/packages/System.CodeDom/5.0.0) Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json index ebc0d666..b266d6e4 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +30,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md index cccab090..fa45c43a 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Configuration.ConfigurationManager [4.5.0](https://www.nuget.org/packages Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json index b55c8262..019ec9fd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +30,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md index 67e11c15..effbf9e0 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md @@ -3,7 +3,7 @@ System.Data.SqlClient [4.8.5](https://www.nuget.org/packages/System.Data.SqlClie Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json index 5d326378..2b28712c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,8 +26,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md index 90f71dd7..6d9aadec 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Diagnostics.DiagnosticSource [4.7.0](https://www.nuget.org/packages/Syste Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json deleted file mode 100644 index 89590aa6..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "License": { - "Code": "MIT", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": true, - "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", - "net6.0", - "net7.0", - "net472" - ], - "Dependencies": [ - { - "Name": "Microsoft.Win32.Registry", - "Version": "5.0.0" - }, - { - "Name": "System.Security.Principal.Windows", - "Version": "5.0.0" - } - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null - }, - { - "Subject": "project", - "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.txt deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec deleted file mode 100644 index 3c247bb4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec +++ /dev/null @@ -1,49 +0,0 @@ - - - - System.Diagnostics.EventLog - 4.7.0 - System.Diagnostics.EventLog - Microsoft - microsoft,dotnetframework - false - MIT - https://licenses.nuget.org/MIT - https://github.com/dotnet/corefx - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. - -Commonly Used Types: -System.Diagnostics.EventLog - -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md deleted file mode 100644 index 608ab741..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md +++ /dev/null @@ -1,35 +0,0 @@ -System.Diagnostics.EventLog [4.7.0](https://www.nuget.org/packages/System.Diagnostics.EventLog/4.7.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx - -Description ------------ -Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. - -Commonly Used Types: -System.Diagnostics.EventLog - -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 2 ------------ - -|Name|Version| -|----------|:----| -|[Microsoft.Win32.Registry](../../../../packages/nuget.org/microsoft.win32.registry/5.0.0)|5.0.0| -|[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/5.0.0)|5.0.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/remarks.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/third-party-notices.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json index 3a4ffb5d..c78961c0 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,14 +19,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md index 4b61a19a..248e2b72 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md @@ -3,7 +3,7 @@ System.Diagnostics.EventLog [6.0.0](https://www.nuget.org/packages/System.Diagno Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json index 905d5fee..4c310736 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -30,20 +29,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime", - "Description": null + "HRef": "git://github.com/dotnet/runtime" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md index 668db812..d5420120 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md @@ -3,7 +3,7 @@ System.Management [5.0.0](https://www.nuget.org/packages/System.Management/5.0.0 Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json index 45273c52..0252f010 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +30,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md index 5f16d3a0..60db9e01 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md @@ -3,7 +3,7 @@ System.Memory [4.5.3](https://www.nuget.org/packages/System.Memory/4.5.3) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json index 490b41df..c3278cc3 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -35,8 +34,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md index 430ba24c..d13dbbf7 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md @@ -3,7 +3,7 @@ System.Memory [4.5.4](https://www.nuget.org/packages/System.Memory/4.5.4) Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json index 79494e46..4f760d7c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md index 90eaae20..155156f1 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md @@ -3,7 +3,7 @@ System.Numerics.Vectors [4.4.0](https://www.nuget.org/packages/System.Numerics.V Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json index 38ac01dc..89e227cd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,8 +19,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md index 305a9aab..98448f10 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md @@ -3,7 +3,7 @@ System.Reflection.Metadata [1.6.0](https://www.nuget.org/packages/System.Reflect Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json index 79494e46..4f760d7c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md index 90d09d50..7b0ac1b3 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md @@ -3,7 +3,7 @@ System.Runtime.CompilerServices.Unsafe [4.5.2](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json index 38ac01dc..89e227cd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,8 +19,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md index f088c659..a83acbfa 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md @@ -3,7 +3,7 @@ System.Runtime.CompilerServices.Unsafe [4.5.3](https://www.nuget.org/packages/Sy Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json index 385b2cc1..85f03f8d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md index 845ad510..08b41ef3 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Runtime.CompilerServices.Unsafe [4.7.0](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json index 167f0424..49f0f05b 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json @@ -1,4 +1,5 @@ { + "Source": "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,8 +19,7 @@ { "Subject": "package", "Code": "ms-net-library", - "HRef": "http://go.microsoft.com/fwlink/?LinkId=329770", - "Description": null + "HRef": "http://go.microsoft.com/fwlink/?LinkId=329770" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt new file mode 100644 index 00000000..92b6c443 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt @@ -0,0 +1,128 @@ + +MICROSOFT SOFTWARE LICENSE TERMS + + +MICROSOFT .NET LIBRARY + +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft + +· updates, + +· supplements, + +· Internet-based services, and + +· support services + +for this software, unless other terms accompany those items. If so, those terms apply. + +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. + + +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. + +1. INSTALLATION AND USE RIGHTS. + +a. Installation and Use. You may install and use any number of copies of the software to design, develop and test your programs. + +b. Third Party Programs. The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. + +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. + +a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in programs you develop if you comply with the terms below. + +i. Right to Use and Distribute. + +· You may copy and distribute the object code form of the software. + +· Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. + +ii. Distribution Requirements. For any Distributable Code you distribute, you must + +· add significant primary functionality to it in your programs; + +· require distributors and external end users to agree to terms that protect it at least as much as this agreement; + +· display your valid copyright notice on your programs; and + +· indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs. + +iii. Distribution Restrictions. You may not + +· alter any copyright, trademark or patent notice in the Distributable Code; + +· use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft; + +· include Distributable Code in malicious, deceptive or unlawful programs; or + +· modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that + +· the code be disclosed or distributed in source code form; or + +· others have the right to modify it. + +3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not + +· work around any technical limitations in the software; + +· reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; + +· publish the software for others to copy; + +· rent, lease or lend the software; + +· transfer the software or this agreement to any third party; or + +· use the software for commercial software hosting services. + +4. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. + +5. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. + +6. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. + +7. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. + +8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. + +9. APPLICABLE LAW. + +a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. + +b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. + +10. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. + +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. + +12. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. + +This limitation applies to + +· anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and + +· claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. + +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. + +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. + +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. + +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. + +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. + +Cette limitation concerne : + +· tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et + +· les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. + +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. + +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + + diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md index 1e34e11e..3e1deba7 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md @@ -3,7 +3,7 @@ System.Runtime.InteropServices.RuntimeInformation [4.3.0](https://www.nuget.org/ Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json index a5362ddb..e8116376 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "ms-net-library", - "HRef": "http://go.microsoft.com/fwlink/?LinkId=329770", - "Description": null + "HRef": "http://go.microsoft.com/fwlink/?LinkId=329770" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/package-dotnet_library_license.txt b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/package-dotnet_library_license.txt new file mode 100644 index 00000000..92b6c443 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/package-dotnet_library_license.txt @@ -0,0 +1,128 @@ + +MICROSOFT SOFTWARE LICENSE TERMS + + +MICROSOFT .NET LIBRARY + +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft + +· updates, + +· supplements, + +· Internet-based services, and + +· support services + +for this software, unless other terms accompany those items. If so, those terms apply. + +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. + + +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. + +1. INSTALLATION AND USE RIGHTS. + +a. Installation and Use. You may install and use any number of copies of the software to design, develop and test your programs. + +b. Third Party Programs. The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. + +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. + +a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in programs you develop if you comply with the terms below. + +i. Right to Use and Distribute. + +· You may copy and distribute the object code form of the software. + +· Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. + +ii. Distribution Requirements. For any Distributable Code you distribute, you must + +· add significant primary functionality to it in your programs; + +· require distributors and external end users to agree to terms that protect it at least as much as this agreement; + +· display your valid copyright notice on your programs; and + +· indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs. + +iii. Distribution Restrictions. You may not + +· alter any copyright, trademark or patent notice in the Distributable Code; + +· use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft; + +· include Distributable Code in malicious, deceptive or unlawful programs; or + +· modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that + +· the code be disclosed or distributed in source code form; or + +· others have the right to modify it. + +3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not + +· work around any technical limitations in the software; + +· reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; + +· publish the software for others to copy; + +· rent, lease or lend the software; + +· transfer the software or this agreement to any third party; or + +· use the software for commercial software hosting services. + +4. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. + +5. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. + +6. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. + +7. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. + +8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. + +9. APPLICABLE LAW. + +a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. + +b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. + +10. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. + +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. + +12. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. + +This limitation applies to + +· anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and + +· claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. + +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. + +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. + +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. + +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. + +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. + +Cette limitation concerne : + +· tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et + +· les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. + +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. + +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + + diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md index 7a0c1cde..1c4df2b1 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md @@ -3,7 +3,7 @@ System.Runtime.Loader [4.3.0](https://www.nuget.org/packages/System.Runtime.Load Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json index f50d9fc5..4ba7578c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,8 +26,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md index b00cf455..b9692d07 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.AccessControl [4.7.0](https://www.nuget.org/packages/System.Secu Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json index dd3e3159..f109c484 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -26,20 +25,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime", - "Description": null + "HRef": "git://github.com/dotnet/runtime" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md index aa1a2b52..633afc90 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md @@ -3,7 +3,7 @@ System.Security.AccessControl [5.0.0](https://www.nuget.org/packages/System.Secu Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json index 79494e46..4f760d7c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md index 1f0968e5..87925247 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Security.Cryptography.ProtectedData [4.5.0](https://www.nuget.org/package Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json index faff1fec..af6043f6 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json @@ -8,11 +8,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,8 +25,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md index 6d0b5d57..aeaebfbd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Security.Permissions [4.5.0](https://www.nuget.org/packages/System.Securi Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json index 385b2cc1..c50921e4 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +20,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md index 4c4644fa..19187cbe 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.Principal.Windows [4.7.0](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json index cf67483a..8c27a13f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ] } ], @@ -20,20 +19,17 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime", - "Description": null + "HRef": "git://github.com/dotnet/runtime" }, { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime", - "Description": null + "HRef": "https://github.com/dotnet/runtime" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md index 822481c5..ccbe4bd2 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md @@ -3,7 +3,7 @@ System.Security.Principal.Windows [5.0.0](https://www.nuget.org/packages/System. Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json index 4b2f1050..8b2eb597 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,8 +26,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT", - "Description": null + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md index 018b3667..a212e7a5 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Text.Encoding.CodePages [4.7.0](https://www.nuget.org/packages/System.Tex Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json index ff360d3b..98660a0d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ], "Dependencies": [ @@ -27,8 +26,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md index aa5792bd..4135e67f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md @@ -3,7 +3,7 @@ System.Threading.Tasks.Extensions [4.5.2](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json index 07520a84..6847e281 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json @@ -1,4 +1,5 @@ { + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -8,11 +9,9 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net472", "net6.0", - "net7.0", - "net472" + "net7.0" ], "Dependencies": [ { @@ -26,8 +25,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md index 05629083..426cca16 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md @@ -3,7 +3,7 @@ System.Threading.Tasks.Extensions [4.5.4](https://www.nuget.org/packages/System. Used by: SqlDatabase internal -Target frameworks: net472, net5.0, net6.0, net7.0, netcoreapp3.1 +Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json index 79494e46..cd1961dc 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json @@ -8,11 +8,9 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "netcoreapp3.1", - "net5.0", + "net452", "net6.0", "net7.0", - "net452", "netstandard2.0" ] } @@ -21,8 +19,7 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT", - "Description": null + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md index b989e0ee..7d8cd027 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md @@ -3,7 +3,7 @@ System.ValueTuple [4.5.0](https://www.nuget.org/packages/System.ValueTuple/4.5.0 Used by: SqlDatabase -Target frameworks: net452, net5.0, net6.0, net7.0, netcoreapp3.1, netstandard2.0 +Target frameworks: net452, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/readme.md b/Build/third-party-libraries/readme.md index 158778a0..71542df4 100644 --- a/Build/third-party-libraries/readme.md +++ b/Build/third-party-libraries/readme.md @@ -6,13 +6,13 @@ Licenses |[Apache-2.0](licenses/apache-2.0)|no|no|3| |[BSD-2-Clause](licenses/bsd-2-clause)|no|no|1| |[BSD-3-Clause](licenses/bsd-3-clause)|no|no|1| -|[MIT](licenses/mit)|no|no|41| +|[MIT](licenses/mit)|no|no|38| |[ms-net-library](licenses/ms-net-library)|no|no|6| |[PostgreSQL](licenses/postgresql)|no|no|1| -Packages 53 +Packages 50 -------- |Name|Version|Source|License|Used by| @@ -27,8 +27,6 @@ Packages 53 |[Microsoft.TestPlatform.TestHost](packages/nuget.org/microsoft.testplatform.testhost/17.4.0)|17.4.0|[nuget.org](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.4.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| |[Microsoft.Win32.Registry](packages/nuget.org/microsoft.win32.registry/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/Microsoft.Win32.Registry/4.7.0)|[MIT](licenses/mit)|SqlDatabase| |[Microsoft.Win32.Registry](packages/nuget.org/microsoft.win32.registry/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/Microsoft.Win32.Registry/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.0.5)|7.0.5|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.0.5)|[MIT](licenses/mit)|SqlDatabase| -|[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.1.2)|7.1.2|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.1.2)|[MIT](licenses/mit)|SqlDatabase| |[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.2.0)|7.2.0|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.2.0)|[MIT](licenses/mit)|SqlDatabase| |[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.3.0)|7.3.0|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.3.0)|[MIT](licenses/mit)|SqlDatabase| |[Moq](packages/nuget.org/moq/4.18.2)|4.18.2|[nuget.org](https://www.nuget.org/packages/Moq/4.18.2)|[BSD-3-Clause](licenses/bsd-3-clause)|SqlDatabase internal| @@ -48,7 +46,6 @@ Packages 53 |[System.Configuration.ConfigurationManager](packages/nuget.org/system.configuration.configurationmanager/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.5.0)|[MIT](licenses/mit)|SqlDatabase| |[System.Data.SqlClient](packages/nuget.org/system.data.sqlclient/4.8.5)|4.8.5|[nuget.org](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5)|[MIT](licenses/mit)|SqlDatabase| |[System.Diagnostics.DiagnosticSource](packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Diagnostics.EventLog](packages/nuget.org/system.diagnostics.eventlog/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.EventLog/4.7.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Diagnostics.EventLog](packages/nuget.org/system.diagnostics.eventlog/6.0.0)|6.0.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.EventLog/6.0.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Management](packages/nuget.org/system.management/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/System.Management/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Memory](packages/nuget.org/system.memory/4.5.3)|4.5.3|[nuget.org](https://www.nuget.org/packages/System.Memory/4.5.3)|[MIT](licenses/mit)|SqlDatabase| From d08d73ec1621af3d2864bcb23d6dbf572ef58b3e Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 12:47:59 +0100 Subject: [PATCH 08/38] .sln net452 => net472 --- .../SqlDatabase.Package.csproj | 2 +- .../SqlDatabase.PowerShell.csproj | 2 +- .../SqlDatabase.PowerShell/SqlDatabase.psd1 | Bin 2992 -> 2992 bytes .../Net472SubDomainTest.StepWithSubDomain.cs} | 4 ++-- .../Net472SubDomainTest.cs} | 8 ++++---- .../Scripts/AssemblyScriptTest.cs | 4 ++-- Sources/SqlDatabase/App.config | 2 +- ...t452.txt => CommandLine.create.net472.txt} | 0 ...452.txt => CommandLine.execute.net472.txt} | 0 ...t452.txt => CommandLine.export.net472.txt} | 0 ...452.txt => CommandLine.upgrade.net472.txt} | 0 Sources/SqlDatabase/Program.cs | 4 ++-- .../{Net452 => Net472}/DomainAgent.cs | 2 +- .../{Net452 => Net472}/DomainDirectory.cs | 2 +- .../{Net452 => Net472}/LoggerProxy.cs | 2 +- .../Net472SubDomain.cs} | 6 +++--- .../NetCore/AssemblyContext.cs | 2 +- .../NetCore/NetCoreSubDomain.cs | 2 +- Sources/SqlDatabase/Scripts/AssemblyScript.cs | 4 ++-- .../PowerShellInternal/DiagnosticsTools.cs | 6 +++--- .../PowerShellFactory.native.cs | 2 +- .../PowerShellStreamsListener.cs | 2 +- Sources/SqlDatabase/SqlDatabase.csproj | 18 +++++++++--------- 23 files changed, 37 insertions(+), 37 deletions(-) rename Sources/SqlDatabase.Test/Scripts/AssemblyInternal/{Net452/Net452SubDomainTest.StepWithSubDomain.cs => Net472/Net472SubDomainTest.StepWithSubDomain.cs} (95%) rename Sources/SqlDatabase.Test/Scripts/AssemblyInternal/{Net452/Net452SubDomainTest.cs => Net472/Net472SubDomainTest.cs} (94%) rename Sources/SqlDatabase/Configuration/{CommandLine.create.net452.txt => CommandLine.create.net472.txt} (100%) rename Sources/SqlDatabase/Configuration/{CommandLine.execute.net452.txt => CommandLine.execute.net472.txt} (100%) rename Sources/SqlDatabase/Configuration/{CommandLine.export.net452.txt => CommandLine.export.net472.txt} (100%) rename Sources/SqlDatabase/Configuration/{CommandLine.upgrade.net452.txt => CommandLine.upgrade.net472.txt} (100%) rename Sources/SqlDatabase/Scripts/AssemblyInternal/{Net452 => Net472}/DomainAgent.cs (97%) rename Sources/SqlDatabase/Scripts/AssemblyInternal/{Net452 => Net472}/DomainDirectory.cs (95%) rename Sources/SqlDatabase/Scripts/AssemblyInternal/{Net452 => Net472}/LoggerProxy.cs (94%) rename Sources/SqlDatabase/Scripts/AssemblyInternal/{Net452/Net452SubDomain.cs => Net472/Net472SubDomain.cs} (94%) diff --git a/Sources/SqlDatabase.Package/SqlDatabase.Package.csproj b/Sources/SqlDatabase.Package/SqlDatabase.Package.csproj index d4ff9caa..727d501d 100644 --- a/Sources/SqlDatabase.Package/SqlDatabase.Package.csproj +++ b/Sources/SqlDatabase.Package/SqlDatabase.Package.csproj @@ -1,6 +1,6 @@ - net452 + net472 diff --git a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj index 2a22b124..b22c5e11 100644 --- a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj +++ b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj @@ -30,7 +30,7 @@ - + diff --git a/Sources/SqlDatabase.PowerShell/SqlDatabase.psd1 b/Sources/SqlDatabase.PowerShell/SqlDatabase.psd1 index fc662ee3b6398a702e5183178adcd23f387673fa..85df07c38f99518bebb2829bf4d9f5d3f114720d 100644 GIT binary patch delta 14 WcmdlWzCnD$DP~6V&8L~4vI77s{splB delta 14 WcmdlWzCnD$DP~5~&8L~4vI77s@&&H| diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.StepWithSubDomain.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs similarity index 95% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.StepWithSubDomain.cs rename to Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs index c1552f81..dd36e244 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.StepWithSubDomain.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs @@ -4,9 +4,9 @@ using System.IO; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452 +namespace SqlDatabase.Scripts.AssemblyInternal.Net472 { - public partial class Net452SubDomainTest + public partial class Net472SubDomainTest { public sealed class StepWithSubDomain { diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs similarity index 94% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.cs rename to Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs index 34d6f8fa..1f5c8a60 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net452/Net452SubDomainTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs @@ -8,12 +8,12 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452 +namespace SqlDatabase.Scripts.AssemblyInternal.Net472 { [TestFixture] - public partial class Net452SubDomainTest + public partial class Net472SubDomainTest { - private Net452SubDomain _sut; + private Net472SubDomain _sut; private Variables _variables; private Mock _command; @@ -40,7 +40,7 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(0); - _sut = new Net452SubDomain { Logger = log.Object }; + _sut = new Net472SubDomain { Logger = log.Object }; _sut.AssemblyFileName = GetType().Assembly.Location; _sut.ReadAssemblyContent = () => File.ReadAllBytes(GetType().Assembly.Location); diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs index 84714044..48601b3a 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs @@ -57,7 +57,7 @@ public void ExecuteExampleMsSql() _sut.DisplayName = "2.1_2.2.dll"; _sut.ReadAssemblyContent = () => File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.1_2.2.dll")); -#if !NET452 +#if !NET472 using (new ConsoleListener(_log.Object)) #endif { @@ -87,7 +87,7 @@ public void ExecuteExamplePgSql() _sut.DisplayName = "2.1_2.2.dll"; _sut.ReadAssemblyContent = () => File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.1_2.2.dll")); -#if !NET452 +#if !NET472 using (new ConsoleListener(_log.Object)) #endif { diff --git a/Sources/SqlDatabase/App.config b/Sources/SqlDatabase/App.config index a9a94438..fb800a56 100644 --- a/Sources/SqlDatabase/App.config +++ b/Sources/SqlDatabase/App.config @@ -51,6 +51,6 @@ + sku=".NETFramework,Version=v4.7.2" /> \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/CommandLine.create.net452.txt b/Sources/SqlDatabase/Configuration/CommandLine.create.net472.txt similarity index 100% rename from Sources/SqlDatabase/Configuration/CommandLine.create.net452.txt rename to Sources/SqlDatabase/Configuration/CommandLine.create.net472.txt diff --git a/Sources/SqlDatabase/Configuration/CommandLine.execute.net452.txt b/Sources/SqlDatabase/Configuration/CommandLine.execute.net472.txt similarity index 100% rename from Sources/SqlDatabase/Configuration/CommandLine.execute.net452.txt rename to Sources/SqlDatabase/Configuration/CommandLine.execute.net472.txt diff --git a/Sources/SqlDatabase/Configuration/CommandLine.export.net452.txt b/Sources/SqlDatabase/Configuration/CommandLine.export.net472.txt similarity index 100% rename from Sources/SqlDatabase/Configuration/CommandLine.export.net452.txt rename to Sources/SqlDatabase/Configuration/CommandLine.export.net472.txt diff --git a/Sources/SqlDatabase/Configuration/CommandLine.upgrade.net452.txt b/Sources/SqlDatabase/Configuration/CommandLine.upgrade.net472.txt similarity index 100% rename from Sources/SqlDatabase/Configuration/CommandLine.upgrade.net452.txt rename to Sources/SqlDatabase/Configuration/CommandLine.upgrade.net472.txt diff --git a/Sources/SqlDatabase/Program.cs b/Sources/SqlDatabase/Program.cs index 7c095538..62969e17 100644 --- a/Sources/SqlDatabase/Program.cs +++ b/Sources/SqlDatabase/Program.cs @@ -131,8 +131,8 @@ private static bool TryWrapWithUsersLogger(ILogger logger, string[] args, out Co private static string GetHelpFileName(string commandName) { -#if NET452 - const string Runtime = ".net452"; +#if NET472 + const string Runtime = ".net472"; #else const string Runtime = null; #endif diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainAgent.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs similarity index 97% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainAgent.cs rename to Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs index 102ab1ed..43885132 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainAgent.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs @@ -5,7 +5,7 @@ using System.IO; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452; +namespace SqlDatabase.Scripts.AssemblyInternal.Net472; internal sealed class DomainAgent : MarshalByRefObject { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainDirectory.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainDirectory.cs rename to Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs index a38e4952..a62be8a9 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/DomainDirectory.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452; +namespace SqlDatabase.Scripts.AssemblyInternal.Net472; internal sealed class DomainDirectory : IDisposable { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/LoggerProxy.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/LoggerProxy.cs rename to Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs index e51b96bb..acf9bbac 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/LoggerProxy.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452; +namespace SqlDatabase.Scripts.AssemblyInternal.Net472; internal sealed class LoggerProxy : TraceListener, ILogger { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/Net452SubDomain.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/Net452SubDomain.cs rename to Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs index 5009005a..dec797bb 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net452/Net452SubDomain.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs @@ -1,11 +1,11 @@ -#if NET452 +#if NET472 using System; using System.Data; using System.IO; -namespace SqlDatabase.Scripts.AssemblyInternal.Net452 +namespace SqlDatabase.Scripts.AssemblyInternal.Net472 { - internal sealed class Net452SubDomain : ISubDomain + internal sealed class Net472SubDomain : ISubDomain { private DomainDirectory _appBase; private AppDomain _app; diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs index bce58315..b1b283e1 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs @@ -1,4 +1,4 @@ -#if !NET452 +#if !NET472 using System; using System.IO; using System.Reflection; diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs index 675df79c..7cab6bce 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs @@ -1,4 +1,4 @@ -#if !NET452 +#if !NET472 using System; using System.Data; diff --git a/Sources/SqlDatabase/Scripts/AssemblyScript.cs b/Sources/SqlDatabase/Scripts/AssemblyScript.cs index 49684069..0d1acc9b 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyScript.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyScript.cs @@ -80,8 +80,8 @@ internal void Execute(ISubDomain domain, IDbCommand command, IVariables variable private ISubDomain CreateSubDomain() { -#if NET452 - return new AssemblyInternal.Net452.Net452SubDomain(); +#if NET472 + return new AssemblyInternal.Net472.Net472SubDomain(); #else return new AssemblyInternal.NetCore.NetCoreSubDomain(); #endif diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs index dac673bc..e68d17e6 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs @@ -9,7 +9,7 @@ internal static class DiagnosticsTools { public static bool IsOSPlatformWindows() { -#if NET452 +#if NET472 return true; #else return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); @@ -18,7 +18,7 @@ public static bool IsOSPlatformWindows() public static int? GetParentProcessId(int processId) { -#if NET452 +#if NET472 return null; #else return IsOSPlatformWindows() ? GetParentProcessIdWindows(processId) : GetParentProcessIdLinux(processId); @@ -82,7 +82,7 @@ public static bool IsOSPlatformWindows() return null; } -#if !NET452 +#if !NET472 private static int? GetParentProcessIdLinux(int processId) { // /proc/[pid]/stat https://man7.org/linux/man-pages/man5/procfs.5.html diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs index b71e787b..cd32fcc0 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs @@ -1,4 +1,4 @@ -#if NET452 || NETSTANDARD +#if NET472 || NETSTANDARD namespace SqlDatabase.Scripts.PowerShellInternal { internal partial class PowerShellFactory diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs index 1024b823..b8232af4 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs @@ -35,7 +35,7 @@ public void Dispose() private static IList GetInformation(PSDataStreams streams) { -#if !NET452 +#if !NET472 return streams.Information; #else return ReflectionGetInformation(streams); diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 3a00cd67..9e2d7d75 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -1,7 +1,7 @@  - net452;net6.0;net7.0;netstandard2.0 + net472;net6.0;net7.0;netstandard2.0 net6.0;net7.0 @@ -35,15 +35,15 @@ - - - - - + + + + + - + @@ -51,7 +51,7 @@ - + @@ -71,7 +71,7 @@ - + From 0c065b8c720838f0589e8b538389f9ae055f60a0 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 12:48:42 +0100 Subject: [PATCH 09/38] docs net452 => net472 --- Examples/CSharpMirationStep/CSharpMirationStep.csproj | 2 +- Examples/CSharpMirationStep/readme.md | 4 ++-- .../SolutionScripts/SolutionScripts.csproj | 4 ++-- .../PackageManagerConsole/SolutionScripts/SqlDatabase.config | 2 +- Examples/PowerShellScript/readme.md | 4 ++-- README.md | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Examples/CSharpMirationStep/CSharpMirationStep.csproj b/Examples/CSharpMirationStep/CSharpMirationStep.csproj index 1f0d1218..3b11ece2 100644 --- a/Examples/CSharpMirationStep/CSharpMirationStep.csproj +++ b/Examples/CSharpMirationStep/CSharpMirationStep.csproj @@ -1,7 +1,7 @@ - net452 + net472 2.1_2.2 diff --git a/Examples/CSharpMirationStep/readme.md b/Examples/CSharpMirationStep/readme.md index a9a31bba..6551144b 100644 --- a/Examples/CSharpMirationStep/readme.md +++ b/Examples/CSharpMirationStep/readme.md @@ -3,12 +3,12 @@ Any assembly script is -- .exe or .dll for target framework is 4.5.2+ +- .exe or .dll for target framework is 4.7.2+ - .dll for .net 7.0 or 6.0 - has exactly one class with script implementation This project is an example of script implementation. -The build output is 2.1_2.2.dll with target framework 4.5.2. +The build output is 2.1_2.2.dll with target framework 4.7.2. Due to the current dependencies, 2.1_2.2.dll works well on .net 6.0+. ## Script source diff --git a/Examples/PackageManagerConsole/SolutionScripts/SolutionScripts.csproj b/Examples/PackageManagerConsole/SolutionScripts/SolutionScripts.csproj index d8e0fab3..d1629d38 100644 --- a/Examples/PackageManagerConsole/SolutionScripts/SolutionScripts.csproj +++ b/Examples/PackageManagerConsole/SolutionScripts/SolutionScripts.csproj @@ -1,6 +1,6 @@  - net452 + net472 false true AnyCPU @@ -10,7 +10,7 @@ - + diff --git a/Examples/PackageManagerConsole/SolutionScripts/SqlDatabase.config b/Examples/PackageManagerConsole/SolutionScripts/SqlDatabase.config index f6c9ad9c..9f051d6c 100644 --- a/Examples/PackageManagerConsole/SolutionScripts/SqlDatabase.config +++ b/Examples/PackageManagerConsole/SolutionScripts/SqlDatabase.config @@ -12,6 +12,6 @@ + sku=".NETFramework,Version=v4.7.2" /> \ No newline at end of file diff --git a/Examples/PowerShellScript/readme.md b/Examples/PowerShellScript/readme.md index 634e646c..15dfc6e8 100644 --- a/Examples/PowerShellScript/readme.md +++ b/Examples/PowerShellScript/readme.md @@ -61,9 +61,9 @@ use The version with which you run the module. -### .net framework 4.5.2 +### .net framework 4.7.2 -[![NuGet](https://img.shields.io/nuget/v/SqlDatabase.svg?style=flat-square&label=nuget%20net%204.5.2)](https://www.nuget.org/packages/SqlDatabase/) +[![NuGet](https://img.shields.io/nuget/v/SqlDatabase.svg?style=flat-square&label=nuget%20net%204.7.2)](https://www.nuget.org/packages/SqlDatabase/) Installed Powershell Desktop version. diff --git a/README.md b/README.md index aa48857b..7e7fc8e7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ SqlDatabase =========== -[![NuGet](https://img.shields.io/nuget/v/SqlDatabase.svg?style=flat-square&label=nuget%20net%204.5.2)](https://www.nuget.org/packages/SqlDatabase/) +[![NuGet](https://img.shields.io/nuget/v/SqlDatabase.svg?style=flat-square&label=nuget%20net%204.7.2)](https://www.nuget.org/packages/SqlDatabase/) [![NuGet](https://img.shields.io/nuget/v/SqlDatabase.GlobalTool.svg?style=flat-square&label=nuget%20dotnet%20tool)](https://www.nuget.org/packages/SqlDatabase.GlobalTool/) [![PowerShell Gallery](https://img.shields.io/powershellgallery/v/SqlDatabase.svg?style=flat-square)](https://www.powershellgallery.com/packages/SqlDatabase) [![GitHub release](https://img.shields.io/github/release/max-ieremenko/SqlDatabase.svg?style=flat-square&label=manual%20download)](https://github.com/max-ieremenko/SqlDatabase/releases) @@ -43,7 +43,7 @@ PowerShell module is compatible with Powershell Core 6.1+ and PowerShell Desktop .net tool is compatible with .net sdk 7.0, and 6.0. -Command-line tool is compatible with .net runtime 7.0, 6.0 and .net framework 4.5.2+. +Command-line tool is compatible with .net runtime 7.0, 6.0 and .net framework 4.7.2+. ### PowerShell, from gallery From 1dc86eca09f168474b2aa4f4533d2a5c0127d8ec Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 12:49:13 +0100 Subject: [PATCH 10/38] build net452 => net472 --- Build/build-tasks.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Build/build-tasks.ps1 b/Build/build-tasks.ps1 index d6e22783..5545729a 100644 --- a/Build/build-tasks.ps1 +++ b/Build/build-tasks.ps1 @@ -1,5 +1,5 @@ task Default Initialize, Clean, Build, ThirdPartyNotices, Pack, UnitTest, IntegrationTest -task Pack PackGlobalTool, PackPoweShellModule, PackNuget452, PackManualDownload +task Pack PackGlobalTool, PackPoweShellModule, PackNuget472, PackManualDownload task IntegrationTest InitializeIntegrationTest, PsDesktopTest, PsCoreTest, SdkToolTest, NetRuntimeLinuxTest, NetRuntimeWindowsTest . .\build-scripts.ps1 @@ -78,7 +78,7 @@ task PackPoweShellModule { Get-ChildItem $dest -Include *.pdb -Recurse | Remove-Item } -task PackNuget452 PackPoweShellModule, { +task PackNuget472 PackPoweShellModule, { $bin = $settings.artifactsPowerShell if (-not $bin.EndsWith("\")) { $bin += "\" @@ -107,7 +107,7 @@ task PackManualDownload PackGlobalTool, PackPoweShellModule, { $source = Join-Path $settings.artifactsPowerShell "*" Compress-Archive -Path $source -DestinationPath $destination - $targets = "net452", "net6.0", "net7.0" + $targets = "net472", "net6.0", "net7.0" foreach ($target in $targets) { $destination = Join-Path $out "SqlDatabase.$packageVersion-$target.zip" $source = Join-Path $settings.bin "SqlDatabase\$target\*" @@ -253,7 +253,7 @@ task NetRuntimeLinuxTest { task NetRuntimeWindowsTest { $testCases = $( - "net452" + "net472" , "net6.0" , "net7.0" ) From 31d2640008a1dc1ad92fc9c2d242b83473a9fed8 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 12:49:27 +0100 Subject: [PATCH 11/38] tpl net452 => net472 --- .../nuget.org/microsoft.win32.registry/4.7.0/index.json | 2 +- .../nuget.org/microsoft.win32.registry/4.7.0/readme.md | 2 +- .../nuget.org/microsoft.wsman.runtime/7.2.0/index.json | 2 +- .../nuget.org/microsoft.wsman.runtime/7.2.0/readme.md | 2 +- .../nuget.org/microsoft.wsman.runtime/7.3.0/index.json | 2 +- .../nuget.org/microsoft.wsman.runtime/7.3.0/readme.md | 2 +- .../packages/nuget.org/mysqlconnector/1.3.10/index.json | 2 +- .../packages/nuget.org/mysqlconnector/1.3.10/readme.md | 2 +- .../packages/nuget.org/netstandard.library/2.0.3/index.json | 2 +- .../packages/nuget.org/netstandard.library/2.0.3/readme.md | 2 +- .../packages/nuget.org/npgsql/4.0.11/index.json | 2 +- .../packages/nuget.org/npgsql/4.0.11/readme.md | 2 +- .../nuget.org/powershellstandard.library/5.1.0/index.json | 1 - .../nuget.org/powershellstandard.library/5.1.0/readme.md | 2 +- .../stylecop.analyzers.unstable/1.2.0.435/index.json | 1 - .../stylecop.analyzers.unstable/1.2.0.435/readme.md | 2 +- .../packages/nuget.org/system.buffers/4.4.0/index.json | 2 +- .../packages/nuget.org/system.buffers/4.4.0/readme.md | 2 +- .../packages/nuget.org/system.buffers/4.5.1/index.json | 2 +- .../packages/nuget.org/system.buffers/4.5.1/readme.md | 2 +- .../4.5.0/index.json | 2 +- .../4.5.0/readme.md | 2 +- .../nuget.org/system.data.sqlclient/4.8.5/index.json | 2 +- .../nuget.org/system.data.sqlclient/4.8.5/readme.md | 2 +- .../system.diagnostics.diagnosticsource/4.7.0/index.json | 2 +- .../system.diagnostics.diagnosticsource/4.7.0/readme.md | 2 +- .../packages/nuget.org/system.memory/4.5.3/index.json | 6 +++++- .../packages/nuget.org/system.memory/4.5.3/readme.md | 5 +++-- .../packages/nuget.org/system.memory/4.5.4/index.json | 2 +- .../packages/nuget.org/system.memory/4.5.4/readme.md | 2 +- .../nuget.org/system.numerics.vectors/4.4.0/index.json | 2 +- .../nuget.org/system.numerics.vectors/4.4.0/readme.md | 2 +- .../system.runtime.compilerservices.unsafe/4.5.2/index.json | 2 +- .../system.runtime.compilerservices.unsafe/4.5.2/readme.md | 2 +- .../system.runtime.compilerservices.unsafe/4.7.0/index.json | 2 +- .../system.runtime.compilerservices.unsafe/4.7.0/readme.md | 2 +- .../nuget.org/system.runtime.loader/4.3.0/index.json | 2 +- .../nuget.org/system.runtime.loader/4.3.0/readme.md | 2 +- .../system.security.accesscontrol/4.7.0/index.json | 2 +- .../nuget.org/system.security.accesscontrol/4.7.0/readme.md | 2 +- .../4.5.0/index.json | 2 +- .../4.5.0/readme.md | 2 +- .../nuget.org/system.security.permissions/4.5.0/index.json | 2 +- .../nuget.org/system.security.permissions/4.5.0/readme.md | 2 +- .../system.security.principal.windows/4.7.0/index.json | 2 +- .../system.security.principal.windows/4.7.0/readme.md | 2 +- .../system.text.encoding.codepages/4.7.0/index.json | 2 +- .../system.text.encoding.codepages/4.7.0/readme.md | 2 +- .../system.threading.tasks.extensions/4.5.2/index.json | 2 +- .../system.threading.tasks.extensions/4.5.2/readme.md | 2 +- .../packages/nuget.org/system.valuetuple/4.5.0/index.json | 2 +- .../packages/nuget.org/system.valuetuple/4.5.0/readme.md | 2 +- 52 files changed, 56 insertions(+), 53 deletions(-) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json index 40cf82a5..8406635e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md index 24c6871f..25d18ca8 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md @@ -3,7 +3,7 @@ Microsoft.Win32.Registry [4.7.0](https://www.nuget.org/packages/Microsoft.Win32. Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json index cba86bce..01467737 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md index 6f86499d..aad964dc 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.2.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json index cba86bce..01467737 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md index 6cab6615..2d195b40 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.3.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json index 714bd7b5..eff7203b 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md index 0c05ebc1..cdfe69ee 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md @@ -3,7 +3,7 @@ MySqlConnector [1.3.10](https://www.nuget.org/packages/MySqlConnector/1.3.10) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json index 993b048b..d2766dbc 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md index 3ca521de..cd57a863 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md @@ -3,7 +3,7 @@ NETStandard.Library [2.0.3](https://www.nuget.org/packages/NETStandard.Library/2 Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json index 50a5d2ac..f5a50375 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md index 9666d82e..a6d8363b 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md @@ -3,7 +3,7 @@ Npgsql [4.0.11](https://www.nuget.org/packages/Npgsql/4.0.11) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [PostgreSQL](../../../../licenses/postgresql) diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json index 8cab6d72..9bf2f045 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json @@ -9,7 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", "net472", "net6.0", "net7.0", diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md index 8948f8ad..848489f5 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md @@ -3,7 +3,7 @@ PowerShellStandard.Library [5.1.0](https://www.nuget.org/packages/PowerShellStan Used by: SqlDatabase -Target frameworks: net452, net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json index 9ac47f63..1c98ed25 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json @@ -9,7 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net452", "net472", "net6.0", "net7.0", diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md index 6515e0ec..7be889bc 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md @@ -3,7 +3,7 @@ StyleCop.Analyzers.Unstable [1.2.0.435](https://www.nuget.org/packages/StyleCop. Used by: SqlDatabase internal -Target frameworks: net452, net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json index 4f760d7c..77dc572f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md index 2dbb6293..800296fe 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md @@ -3,7 +3,7 @@ System.Buffers [4.4.0](https://www.nuget.org/packages/System.Buffers/4.4.0) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json index 4f760d7c..77dc572f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md index a5d390f7..487aa23d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md @@ -3,7 +3,7 @@ System.Buffers [4.5.1](https://www.nuget.org/packages/System.Buffers/4.5.1) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json index b266d6e4..a6561819 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md index fa45c43a..ad43b471 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Configuration.ConfigurationManager [4.5.0](https://www.nuget.org/packages Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json index 019ec9fd..bc976533 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md index effbf9e0..1390bd7f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md @@ -3,7 +3,7 @@ System.Data.SqlClient [4.8.5](https://www.nuget.org/packages/System.Data.SqlClie Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json index 2b28712c..be21d781 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md index 6d9aadec..b0859969 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Diagnostics.DiagnosticSource [4.7.0](https://www.nuget.org/packages/Syste Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json index 0252f010..922821ce 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" @@ -19,6 +19,10 @@ "Name": "System.Buffers", "Version": "4.4.0" }, + { + "Name": "System.Numerics.Vectors", + "Version": "4.4.0" + }, { "Name": "System.Runtime.CompilerServices.Unsafe", "Version": "4.5.2" diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md index 60db9e01..3fcd6956 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md @@ -3,7 +3,7 @@ System.Memory [4.5.3](https://www.nuget.org/packages/System.Memory/4.5.3) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) @@ -32,12 +32,13 @@ Remarks no remarks -Dependencies 2 +Dependencies 3 ----------- |Name|Version| |----------|:----| |[System.Buffers](../../../../packages/nuget.org/system.buffers/4.4.0)|4.4.0| +|[System.Numerics.Vectors](../../../../packages/nuget.org/system.numerics.vectors/4.4.0)|4.4.0| |[System.Runtime.CompilerServices.Unsafe](../../../../packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2)|4.5.2| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json index c3278cc3..e65a5a26 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md index d13dbbf7..81196829 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md @@ -3,7 +3,7 @@ System.Memory [4.5.4](https://www.nuget.org/packages/System.Memory/4.5.4) Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json index 4f760d7c..77dc572f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md index 155156f1..20bdd093 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md @@ -3,7 +3,7 @@ System.Numerics.Vectors [4.4.0](https://www.nuget.org/packages/System.Numerics.V Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json index 4f760d7c..77dc572f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md index 7b0ac1b3..67a2f6e0 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md @@ -3,7 +3,7 @@ System.Runtime.CompilerServices.Unsafe [4.5.2](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json index 85f03f8d..3b766d86 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md index 08b41ef3..3b50540d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Runtime.CompilerServices.Unsafe [4.7.0](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json index e8116376..a0a61f27 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md index 1c4df2b1..3e8f44ef 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md @@ -3,7 +3,7 @@ System.Runtime.Loader [4.3.0](https://www.nuget.org/packages/System.Runtime.Load Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json index 4ba7578c..a4c139cd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md index b9692d07..2edfda84 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.AccessControl [4.7.0](https://www.nuget.org/packages/System.Secu Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json index 4f760d7c..77dc572f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md index 87925247..4e0d3383 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Security.Cryptography.ProtectedData [4.5.0](https://www.nuget.org/package Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json index af6043f6..97431699 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json @@ -8,7 +8,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md index aeaebfbd..f35b7f79 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md @@ -3,7 +3,7 @@ System.Security.Permissions [4.5.0](https://www.nuget.org/packages/System.Securi Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json index c50921e4..0b94fd18 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md index 19187cbe..b62a6500 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.Principal.Windows [4.7.0](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json index 8b2eb597..d5613468 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md index a212e7a5..819dc5f6 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Text.Encoding.CodePages [4.7.0](https://www.nuget.org/packages/System.Tex Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json index 98660a0d..529624a0 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json @@ -9,7 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md index 4135e67f..e57f2b1d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md @@ -3,7 +3,7 @@ System.Threading.Tasks.Extensions [4.5.2](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json index cd1961dc..d8ec4970 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json @@ -8,7 +8,7 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net452", + "net472", "net6.0", "net7.0", "netstandard2.0" diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md index 7d8cd027..e30be422 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md @@ -3,7 +3,7 @@ System.ValueTuple [4.5.0](https://www.nuget.org/packages/System.ValueTuple/4.5.0 Used by: SqlDatabase -Target frameworks: net452, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) From ef173c18d3fc0d88d1166344465156b4d51a5c33 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sat, 4 Nov 2023 14:46:50 +0100 Subject: [PATCH 12/38] remove GlobalAssemblyInfo.cs --- Build/build-scripts.ps1 | 185 ------------------ Build/build-tasks.it-linux.ps1 | 2 +- Build/build-tasks.it-ps-core.ps1 | 2 +- Build/build-tasks.it-ps-desktop.ps1 | 2 +- Build/build-tasks.it-tool-linux.ps1 | 2 +- Build/build-tasks.it-win.ps1 | 2 +- Build/build-tasks.ps1 | 6 +- Build/build-tasks.unit-test.ps1 | 4 +- Build/scripts/Get-Version.ps1 | 13 ++ Build/scripts/Start-Container.ps1 | 36 ++++ Build/scripts/Start-Mssql.ps1 | 24 +++ Build/scripts/Start-Mysql.ps1 | 28 +++ Build/scripts/Start-Pgsql.ps1 | 28 +++ Build/scripts/Wait-Connection.ps1 | 42 ++++ Build/scripts/Wait-Mssql.ps1 | 9 + Build/scripts/Wait-Mysql.ps1 | 9 + Build/scripts/Wait-Pgsql.ps1 | 9 + Sources/Directory.Build.props | 27 ++- Sources/GlobalAssemblyInfo.cs | 13 -- .../SqlDatabase.Package/nuget/package.nuspec | 2 +- .../Properties/AssemblyInfo.cs | 7 +- .../Properties/AssemblyInfo.cs | 4 - .../Properties/AssemblyInfo.cs | 7 +- .../InstallationSeekerTest.cs | 3 +- .../SqlDatabase/Properties/AssemblyInfo.cs | 8 +- Sources/SqlDatabase/SqlDatabase.csproj | 20 +- 26 files changed, 237 insertions(+), 257 deletions(-) delete mode 100644 Build/build-scripts.ps1 create mode 100644 Build/scripts/Get-Version.ps1 create mode 100644 Build/scripts/Start-Container.ps1 create mode 100644 Build/scripts/Start-Mssql.ps1 create mode 100644 Build/scripts/Start-Mysql.ps1 create mode 100644 Build/scripts/Start-Pgsql.ps1 create mode 100644 Build/scripts/Wait-Connection.ps1 create mode 100644 Build/scripts/Wait-Mssql.ps1 create mode 100644 Build/scripts/Wait-Mysql.ps1 create mode 100644 Build/scripts/Wait-Pgsql.ps1 delete mode 100644 Sources/GlobalAssemblyInfo.cs diff --git a/Build/build-scripts.ps1 b/Build/build-scripts.ps1 deleted file mode 100644 index 08afa64c..00000000 --- a/Build/build-scripts.ps1 +++ /dev/null @@ -1,185 +0,0 @@ -function Get-AssemblyVersion($assemblyInfoCsPath) { - $Anchor = "AssemblyVersion("""; - $lines = Get-Content -Path $assemblyInfoCsPath - - foreach ($line in $lines) { - $index = $line.IndexOf($Anchor); - if ($index -lt 0) { - continue; - } - - $text = $line.Substring($index + $Anchor.Length); - - $index = $text.IndexOf('"'); - $text = $text.Substring(0, $index); - - $version = New-Object -TypeName System.Version -ArgumentList $text - $build = $version.Build - if ($build -le 0) { - $build = 0 - } - - $text = (New-Object -TypeName System.Version -ArgumentList $version.Major, $version.Minor, $build).ToString(); - return $text; - } -} - -function Get-RepositoryCommitId { - git rev-parse HEAD -} - -function Start-Mssql { - $container = Start-Container sqldatabase/mssql:2017 1433 - $port = $container.port - - $builder = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder - $builder["Initial Catalog"] = "SqlDatabaseTest" - $builder["User Id"] = "sa" - $builder["Password"] = "P@ssw0rd" - $builder["Connect Timeout"] = 5 - - $builder["Data Source"] = ".,$port" - $connectionString = $builder.ToString() - - $builder["Data Source"] = $container.ip - $remoteConnectionString = $builder.ToString() - - return @{ - containerId = $container.containerId - connectionString = $connectionString - remoteConnectionString = $remoteConnectionString - } -} - -function Wait-Mssql($connectionString) { - Wait-Connection System.Data.SqlClient.SqlConnection $connectionString -} - -function Start-Pgsql { - $npgsqldll = Join-Path $env:USERPROFILE ".nuget\packages\npgsql\4.0.11\lib\netstandard2.0\Npgsql.dll" - Add-Type -Path $npgsqldll - - $container = Start-Container sqldatabase/postgres:13.3 5432 - - $builder = New-Object -TypeName Npgsql.NpgsqlConnectionStringBuilder - $builder["Database"] = "sqldatabasetest" - $builder["Username"] = "postgres" - $builder["Password"] = "qwerty" - $builder["Timeout"] = 5 - - $builder.Host = "localhost" - $builder.Port = $container.port.ToString() - $connectionString = $builder.ToString() - - $builder.Host = $container.ip.ToString() - $builder.Port = 5432 - $remoteConnectionString = $builder.ToString() - - return @{ - containerId = $container.containerId - connectionString = $connectionString - remoteConnectionString = $remoteConnectionString - } -} - -function Wait-Pgsql($connectionString) { - Wait-Connection Npgsql.NpgsqlConnection $connectionString -} - -function Start-Mysql { - $sqlConnectordll = Join-Path $env:USERPROFILE "\.nuget\packages\mysqlconnector\1.3.10\lib\netstandard2.0\MySqlConnector.dll" - Add-Type -Path $sqlConnectordll - - $container = Start-Container sqldatabase/mysql:8.0.25 3306 - - $builder = New-Object -TypeName MySqlConnector.MySqlConnectionStringBuilder - $builder["Database"] = "sqldatabasetest" - $builder["User ID"] = "root" - $builder["Password"] = "qwerty" - $builder["ConnectionTimeout"] = 5 - - $builder.Server = "localhost" - $builder.Port = $container.port.ToString() - $connectionString = $builder.ToString() - - $builder.Server = $container.ip.ToString() - $builder.Port = 3306 - $remoteConnectionString = $builder.ToString() - - return @{ - containerId = $container.containerId - connectionString = $connectionString - remoteConnectionString = $remoteConnectionString - } -} - -function Wait-Mysql($connectionString) { - Wait-Connection MySqlConnector.MySqlConnection $connectionString -} - -function Start-Container { - param ( - $image, - $containerPort - ) - - $containerId = exec { - docker run ` - -d ` - -p $containerPort ` - $image - } - - $ip = exec { - docker inspect ` - --format "{{.NetworkSettings.Networks.bridge.IPAddress}}" ` - $containerId - } - - $hostPort = exec { - docker inspect ` - --format "{{(index (index .NetworkSettings.Ports \""$containerPort/tcp\"") 0).HostPort}}" ` - $containerId - } - - return @{ - containerId = $containerId - ip = $ip - port = $hostPort - } -} - -function Wait-Connection { - param ( - $connectionName, - $connectionString, - $timeout = 50 - ) - - function Test-Connection { - $connection = New-Object -TypeName $connectionName -ArgumentList $connectionString - try { - $connection.Open() - } - finally { - $connection.Dispose() - } - } - - for ($i = 0; $i -lt $timeout; $i++) { - try { - Test-Connection - return - } - catch { - Start-Sleep -Seconds 1 - } - } - - try { - Test-Connection - } - catch { - throw "$connectionName $connectionString" - } -} \ No newline at end of file diff --git a/Build/build-tasks.it-linux.ps1 b/Build/build-tasks.it-linux.ps1 index 1a6c2534..50aee137 100644 --- a/Build/build-tasks.it-linux.ps1 +++ b/Build/build-tasks.it-linux.ps1 @@ -7,7 +7,7 @@ param( task Test StartDatabase, UnZip, RunTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-ps-core.ps1 b/Build/build-tasks.it-ps-core.ps1 index 8140595e..1718ca79 100644 --- a/Build/build-tasks.it-ps-core.ps1 +++ b/Build/build-tasks.it-ps-core.ps1 @@ -6,7 +6,7 @@ param( task Test StartDatabase, RunTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-ps-desktop.ps1 b/Build/build-tasks.it-ps-desktop.ps1 index c4590e3e..aae0bec4 100644 --- a/Build/build-tasks.it-ps-desktop.ps1 +++ b/Build/build-tasks.it-ps-desktop.ps1 @@ -5,7 +5,7 @@ param( task Test RunContainers, CopyModule, PublishModule, RunTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-tool-linux.ps1 b/Build/build-tasks.it-tool-linux.ps1 index 65431c39..6b0f3cd3 100644 --- a/Build/build-tasks.it-tool-linux.ps1 +++ b/Build/build-tasks.it-tool-linux.ps1 @@ -6,7 +6,7 @@ param( task Test StartDatabase, RunTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-win.ps1 b/Build/build-tasks.it-win.ps1 index 70a4a607..fd83a9dd 100644 --- a/Build/build-tasks.it-win.ps1 +++ b/Build/build-tasks.it-win.ps1 @@ -6,7 +6,7 @@ param( task Test StartDatabase, UnZip, RunTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.ps1 b/Build/build-tasks.ps1 index 5545729a..93712fe9 100644 --- a/Build/build-tasks.ps1 +++ b/Build/build-tasks.ps1 @@ -2,7 +2,7 @@ task Default Initialize, Clean, Build, ThirdPartyNotices, Pack, UnitTest, Integr task Pack PackGlobalTool, PackPoweShellModule, PackNuget472, PackManualDownload task IntegrationTest InitializeIntegrationTest, PsDesktopTest, PsCoreTest, SdkToolTest, NetRuntimeLinuxTest, NetRuntimeWindowsTest -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } task Initialize { $sources = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\Sources")) @@ -16,8 +16,8 @@ task Initialize { artifacts = $artifacts artifactsPowerShell = Join-Path $artifacts "PowerShell" integrationTests = Join-Path $bin "IntegrationTests" - version = Get-AssemblyVersion (Join-Path $sources "GlobalAssemblyInfo.cs"); - repositoryCommitId = Get-RepositoryCommitId; + version = Get-Version -SourcePath $sources; + repositoryCommitId = git rev-parse HEAD; } $script:databases = $("MsSql", "PgSql", "MySql") diff --git a/Build/build-tasks.unit-test.ps1 b/Build/build-tasks.unit-test.ps1 index 2e543e05..acbfcd0a 100644 --- a/Build/build-tasks.unit-test.ps1 +++ b/Build/build-tasks.unit-test.ps1 @@ -5,7 +5,7 @@ param( task Test RunContainers, UpdateConfig, RunTests -. .\build-scripts.ps1 +Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $mssqlContainerId = "" $mssqlConnectionString = "empty" @@ -71,7 +71,7 @@ task RunTests { | Where-Object FullName -NotMatch \\ref\\ ` | ForEach-Object {$_.FullName} - if (-not $testList.Count) { + if (-not $testList) { throw "Test list is empty." } diff --git a/Build/scripts/Get-Version.ps1 b/Build/scripts/Get-Version.ps1 new file mode 100644 index 00000000..2fc8122a --- /dev/null +++ b/Build/scripts/Get-Version.ps1 @@ -0,0 +1,13 @@ +function Get-Version { + param ( + [Parameter(Mandatory)] + [ValidateScript({ Test-Path $_ })] + [string] + $SourcePath + ) + + $buildProps = Join-Path $SourcePath 'Directory.Build.props' + $xml = Select-Xml -Path $buildProps -XPath 'Project/PropertyGroup/SqlDatabaseVersion' + + $xml.Node.InnerText +} \ No newline at end of file diff --git a/Build/scripts/Start-Container.ps1 b/Build/scripts/Start-Container.ps1 new file mode 100644 index 00000000..f1e39472 --- /dev/null +++ b/Build/scripts/Start-Container.ps1 @@ -0,0 +1,36 @@ +function Start-Container { + param ( + [Parameter(Mandatory)] + [string] + $Image, + + [Parameter(Mandatory)] + [int] + $ContainerPort + ) + + $containerId = exec { + docker run ` + -d ` + -p $ContainerPort ` + $Image + } + + $ip = exec { + docker inspect ` + --format "{{.NetworkSettings.Networks.bridge.IPAddress}}" ` + $containerId + } + + $hostPort = exec { + docker inspect ` + --format "{{(index (index .NetworkSettings.Ports \""$ContainerPort/tcp\"") 0).HostPort}}" ` + $containerId + } + + return @{ + containerId = $containerId + ip = $ip + port = $hostPort + } +} \ No newline at end of file diff --git a/Build/scripts/Start-Mssql.ps1 b/Build/scripts/Start-Mssql.ps1 new file mode 100644 index 00000000..e21b0f8c --- /dev/null +++ b/Build/scripts/Start-Mssql.ps1 @@ -0,0 +1,24 @@ +function Start-Mssql { + param () + + $container = Start-Container -Image sqldatabase/mssql:2017 -ContainerPort 1433 + $port = $container.port + + $builder = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder + $builder["Initial Catalog"] = "SqlDatabaseTest" + $builder["User Id"] = "sa" + $builder["Password"] = "P@ssw0rd" + $builder["Connect Timeout"] = 5 + + $builder["Data Source"] = ".,$port" + $connectionString = $builder.ToString() + + $builder["Data Source"] = $container.ip + $remoteConnectionString = $builder.ToString() + + return @{ + containerId = $container.containerId + connectionString = $connectionString + remoteConnectionString = $remoteConnectionString + } +} \ No newline at end of file diff --git a/Build/scripts/Start-Mysql.ps1 b/Build/scripts/Start-Mysql.ps1 new file mode 100644 index 00000000..8bc4727b --- /dev/null +++ b/Build/scripts/Start-Mysql.ps1 @@ -0,0 +1,28 @@ +function Start-Mysql { + param () + + $sqlConnectordll = Join-Path $env:USERPROFILE "\.nuget\packages\mysqlconnector\1.3.10\lib\netstandard2.0\MySqlConnector.dll" + Add-Type -Path $sqlConnectordll + + $container = Start-Container -Image sqldatabase/mysql:8.0.25 -ContainerPort 3306 + + $builder = New-Object -TypeName MySqlConnector.MySqlConnectionStringBuilder + $builder["Database"] = "sqldatabasetest" + $builder["User ID"] = "root" + $builder["Password"] = "qwerty" + $builder["ConnectionTimeout"] = 5 + + $builder.Server = "localhost" + $builder.Port = $container.port.ToString() + $connectionString = $builder.ToString() + + $builder.Server = $container.ip.ToString() + $builder.Port = 3306 + $remoteConnectionString = $builder.ToString() + + return @{ + containerId = $container.containerId + connectionString = $connectionString + remoteConnectionString = $remoteConnectionString + } +} \ No newline at end of file diff --git a/Build/scripts/Start-Pgsql.ps1 b/Build/scripts/Start-Pgsql.ps1 new file mode 100644 index 00000000..d1a0d01c --- /dev/null +++ b/Build/scripts/Start-Pgsql.ps1 @@ -0,0 +1,28 @@ +function Start-Pgsql { + param () + + $npgsqldll = Join-Path $env:USERPROFILE ".nuget\packages\npgsql\4.0.11\lib\netstandard2.0\Npgsql.dll" + Add-Type -Path $npgsqldll + + $container = Start-Container -Image sqldatabase/postgres:13.3 -ContainerPort 5432 + + $builder = New-Object -TypeName Npgsql.NpgsqlConnectionStringBuilder + $builder["Database"] = "sqldatabasetest" + $builder["Username"] = "postgres" + $builder["Password"] = "qwerty" + $builder["Timeout"] = 5 + + $builder.Host = "localhost" + $builder.Port = $container.port.ToString() + $connectionString = $builder.ToString() + + $builder.Host = $container.ip.ToString() + $builder.Port = 5432 + $remoteConnectionString = $builder.ToString() + + return @{ + containerId = $container.containerId + connectionString = $connectionString + remoteConnectionString = $remoteConnectionString + } +} \ No newline at end of file diff --git a/Build/scripts/Wait-Connection.ps1 b/Build/scripts/Wait-Connection.ps1 new file mode 100644 index 00000000..e4468c41 --- /dev/null +++ b/Build/scripts/Wait-Connection.ps1 @@ -0,0 +1,42 @@ +function Wait-Connection { + param ( + [Parameter(Mandatory)] + [string] + $ConnectionName, + + [Parameter(Mandatory)] + [string] + $ConnectionString, + + [Parameter()] + [int] + $Timeout = 50 + ) + + function Test-Connection { + $connection = New-Object -TypeName $ConnectionName -ArgumentList $ConnectionString + try { + $connection.Open() + } + finally { + $connection.Dispose() + } + } + + for ($i = 0; $i -lt $timeout; $i++) { + try { + Test-Connection + return + } + catch { + Start-Sleep -Seconds 1 + } + } + + try { + Test-Connection + } + catch { + throw "$ConnectionName $ConnectionString" + } +} \ No newline at end of file diff --git a/Build/scripts/Wait-Mssql.ps1 b/Build/scripts/Wait-Mssql.ps1 new file mode 100644 index 00000000..1e7ca67c --- /dev/null +++ b/Build/scripts/Wait-Mssql.ps1 @@ -0,0 +1,9 @@ +function Wait-Mssql { + param ( + [Parameter(Mandatory)] + [string] + $ConnectionString + ) + + Wait-Connection -ConnectionName System.Data.SqlClient.SqlConnection -ConnectionString $ConnectionString +} \ No newline at end of file diff --git a/Build/scripts/Wait-Mysql.ps1 b/Build/scripts/Wait-Mysql.ps1 new file mode 100644 index 00000000..0a3ec755 --- /dev/null +++ b/Build/scripts/Wait-Mysql.ps1 @@ -0,0 +1,9 @@ +function Wait-Mysql { + param ( + [Parameter(Mandatory)] + [string] + $ConnectionString + ) + + Wait-Connection -ConnectionName MySqlConnector.MySqlConnection -ConnectionString $ConnectionString +} \ No newline at end of file diff --git a/Build/scripts/Wait-Pgsql.ps1 b/Build/scripts/Wait-Pgsql.ps1 new file mode 100644 index 00000000..dc2ea406 --- /dev/null +++ b/Build/scripts/Wait-Pgsql.ps1 @@ -0,0 +1,9 @@ +function Wait-Pgsql { + param ( + [Parameter(Mandatory)] + [string] + $ConnectionString + ) + + Wait-Connection -ConnectionName Npgsql.NpgsqlConnection -ConnectionString $ConnectionString +} \ No newline at end of file diff --git a/Sources/Directory.Build.props b/Sources/Directory.Build.props index 8a286147..342d94a1 100644 --- a/Sources/Directory.Build.props +++ b/Sources/Directory.Build.props @@ -1,6 +1,6 @@ - false + true true AnyCPU @@ -14,12 +14,27 @@ false - - - + + 4.2.0 + $(SqlDatabaseVersion) + $(SqlDatabaseVersion).0 + $(SqlDatabaseVersion).0 + SqlDatabase + Max Ieremenko + SqlDatabase is a tool for MSSQL Server, PostgreSQL and MySQL, allows executing scripts, database migrations and data export. + https://github.com/max-ieremenko/SqlDatabase/releases + https://github.com/max-ieremenko/SqlDatabase + https://github.com/max-ieremenko/SqlDatabase + https://github.com/max-ieremenko/SqlDatabase/raw/master/icon-32.png + icon-32.png + MIT + (C) 2018-2023 Max Ieremenko. + git + sqlserver database postgresql mysql mysql-database sqlcmd migration-tool c-sharp command-line-tool miration-step sql-script sql-database database-migrations export-data + false + - + - \ No newline at end of file diff --git a/Sources/GlobalAssemblyInfo.cs b/Sources/GlobalAssemblyInfo.cs deleted file mode 100644 index 40467503..00000000 --- a/Sources/GlobalAssemblyInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SqlDatabase")] -[assembly: AssemblyCopyright("Copyright � 2018-2022 Max Ieremenko")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] - -[assembly: AssemblyVersion("4.2.0.0")] -[assembly: AssemblyFileVersion("4.2.0.0")] diff --git a/Sources/SqlDatabase.Package/nuget/package.nuspec b/Sources/SqlDatabase.Package/nuget/package.nuspec index 8ac4b68f..7e94f6dd 100644 --- a/Sources/SqlDatabase.Package/nuget/package.nuspec +++ b/Sources/SqlDatabase.Package/nuget/package.nuspec @@ -14,7 +14,7 @@ Command-line tool and PowerShell module for MSSQL Server, PostgreSQL and MySQL. SqlDatabase is a tool for MSSQL Server, PostgreSQL and MySQL, allows to execute scripts, database migrations and export data. https://github.com/max-ieremenko/SqlDatabase/releases - (C) 2018-2022 Max Ieremenko. + (C) 2018-2023 Max Ieremenko. sqlserver postgresql mysql mysql-database sqlcmd migration-tool c-sharp command-line-tool miration-step sql-script sql-database database-migrations export-data diff --git a/Sources/SqlDatabase.PowerShell.Test/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.PowerShell.Test/Properties/AssemblyInfo.cs index 7a516c57..5f282702 100644 --- a/Sources/SqlDatabase.PowerShell.Test/Properties/AssemblyInfo.cs +++ b/Sources/SqlDatabase.PowerShell.Test/Properties/AssemblyInfo.cs @@ -1,6 +1 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SqlDatabase.PowerShell.Test")] -[assembly: AssemblyDescription("")] -[assembly: Guid("26DEB773-3811-4AA9-897C-A2A700923F7A")] + \ No newline at end of file diff --git a/Sources/SqlDatabase.PowerShell/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.PowerShell/Properties/AssemblyInfo.cs index 94a20fc0..5a6f68ea 100644 --- a/Sources/SqlDatabase.PowerShell/Properties/AssemblyInfo.cs +++ b/Sources/SqlDatabase.PowerShell/Properties/AssemblyInfo.cs @@ -1,8 +1,4 @@ -using System.Reflection; using System.Runtime.CompilerServices; -[assembly: AssemblyTitle("SqlDatabase.PowerShell")] -[assembly: AssemblyDescription("")] - [assembly: InternalsVisibleTo("SqlDatabase.PowerShell.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Test/Properties/AssemblyInfo.cs index b25181af..5f282702 100644 --- a/Sources/SqlDatabase.Test/Properties/AssemblyInfo.cs +++ b/Sources/SqlDatabase.Test/Properties/AssemblyInfo.cs @@ -1,6 +1 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SqlDatabase.Test")] -[assembly: AssemblyDescription("")] -[assembly: Guid("615bdfb2-2b5a-4758-ba70-ee93d22ead7d")] + \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs index 58351bb4..cb3229da 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Reflection; using Moq; using NUnit.Framework; using Shouldly; @@ -55,7 +56,7 @@ public void TryGetInfo() actual.Location.ShouldBe(dir.Location); actual.Version.ShouldBe(GetType().Assembly.GetName().Version); - actual.ProductVersion.ShouldBe(actual.Version.ToString()); + actual.ProductVersion.ShouldBe(GetType().Assembly.GetCustomAttribute().InformationalVersion); } } diff --git a/Sources/SqlDatabase/Properties/AssemblyInfo.cs b/Sources/SqlDatabase/Properties/AssemblyInfo.cs index a31a6ab5..d0e8c551 100644 --- a/Sources/SqlDatabase/Properties/AssemblyInfo.cs +++ b/Sources/SqlDatabase/Properties/AssemblyInfo.cs @@ -1,10 +1,4 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SqlDatabase")] -[assembly: AssemblyDescription("SqlDatabase is a tool for SQL Server, allows executing scripts, database migrations and data export.")] -[assembly: Guid("5ee10884-32f2-443b-b136-66e9a1a3c393")] +using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("SqlDatabase.PowerShell, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] [assembly: InternalsVisibleTo("SqlDatabase.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 9e2d7d75..7facba5d 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -1,32 +1,16 @@  - net472;net6.0;net7.0;netstandard2.0 - net6.0;net7.0 - + net6.0;net7.0 - + Exe ..\..\bin\SqlDatabase - - SqlDatabase SqlDatabase.GlobalTool - - Max Ieremenko - SqlDatabase is a tool for MSSQL Server, PostgreSQL and MySQL, allows executing scripts, database migrations and data export. - https://github.com/max-ieremenko/SqlDatabase/releases - https://github.com/max-ieremenko/SqlDatabase - https://github.com/max-ieremenko/SqlDatabase - https://github.com/max-ieremenko/SqlDatabase/raw/master/icon-32.png - icon-32.png - MIT - (C) 2018-2022 Max Ieremenko. - git - sqlserver database postgresql mysql mysql-database sqlcmd migration-tool c-sharp command-line-tool miration-step sql-script sql-database database-migrations export-data From 7582ae4d5e4b18f71a49e2d7a1653d63adae048b Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 5 Nov 2023 14:10:52 +0100 Subject: [PATCH 13/38] enable --- Sources/Directory.Build.props | 1 + .../Internal/DependencyResolverFactoryTest.cs | 2 +- .../TestApi/SqlDatabaseCmdLetTest.cs | 4 +- .../SqlDatabase.PowerShell/CreateCmdLet.cs | 10 +- .../SqlDatabase.PowerShell/ExecuteCmdLet.cs | 12 +- .../SqlDatabase.PowerShell/ExportCmdLet.cs | 16 +- .../Internal/AssemblyCache.cs | 8 +- .../Internal/CmdletExtensions.cs | 16 +- .../Internal/PSVersionTable.cs | 4 +- .../Internal/PowerShellCommandBase.cs | 2 +- .../PowerShellCoreDependencyResolver.cs | 2 +- .../PowerShellDesktopDependencyResolver.cs | 2 +- .../SqlDatabase.PowerShell/UpgradeCmdLet.cs | 10 +- .../Commands/DatabaseCreateCommandTest.cs | 26 ++- .../Commands/DatabaseExecuteCommandTest.cs | 24 ++- .../Commands/DatabaseExportCommandTest.cs | 20 +- .../Commands/DatabaseUpgradeCommandTest.cs | 26 ++- .../Configuration/CommandLineBaseTest.cs | 12 +- .../Configuration/CommandLineFactoryTest.cs | 6 +- .../Configuration/CommandLineParserTest.cs | 4 +- .../Configuration/ConfigurationManagerTest.cs | 4 +- .../Configuration/CreateCommandLineTest.cs | 8 +- .../Configuration/ExecuteCommandLineTest.cs | 8 +- .../Configuration/ExportCommandLineTest.cs | 6 +- .../GenericCommandLineBuilderTest.cs | 2 +- .../Configuration/UpgradeCommandLineTest.cs | 8 +- .../Export/DataExportLoggerTest.cs | 4 +- .../Export/MsSqlDataExporterTest.cs | 12 +- .../Export/MySqlDataExporterTest.cs | 4 +- .../Export/PgSqlDataExporterTest.cs | 12 +- Sources/SqlDatabase.Test/IO/ZipFolderTest.cs | 8 +- .../IntegrationTests/MsSql/ProgramTest.cs | 18 +- .../IntegrationTests/MySql/ProgramTest.cs | 17 +- .../IntegrationTests/PgSql/ProgramTest.cs | 17 +- .../Log/CombinedLoggerTest.cs | 6 +- .../SqlDatabase.Test/Log/FileLoggerTest.cs | 2 +- .../SqlDatabase.Test/Log/LoggerBaseTest.cs | 6 +- .../Scripts/AssemblyInternal/DbCommandStub.cs | 4 +- .../AssemblyInternal/DefaultEntryPointTest.cs | 12 +- .../EntryPointResolverTest.cs | 12 +- ...cuteMethodResolverCommandDictionaryTest.cs | 14 +- .../ExecuteMethodResolverCommandTest.cs | 10 +- .../ExecuteMethodResolverDbConnectionTest.cs | 11 +- ...cuteMethodResolverDictionaryCommandTest.cs | 14 +- .../ExecuteMethodResolverSqlConnectionTest.cs | 10 +- .../Net472/Net472SubDomainTest.cs | 179 +++++++++--------- .../Scripts/AssemblyScriptTest.cs | 15 +- .../Scripts/CreateScriptSequenceTest.cs | 23 +-- .../Scripts/DatabaseAdapterFactoryTest.cs | 4 +- .../SqlDatabase.Test/Scripts/DatabaseTest.cs | 24 +-- .../Scripts/DependencyParserTest.cs | 2 +- .../Scripts/MsSql/MsSqlDatabaseAdapterTest.cs | 11 +- .../Scripts/MsSql/MsSqlTextReaderTest.cs | 2 +- .../Scripts/MsSql/MsSqlWriterTest.cs | 4 +- .../MsSql/TextScriptOutputMsSqlTest.cs | 19 +- .../Scripts/MySql/MySqlDatabaseAdapterTest.cs | 11 +- .../Scripts/MySql/MySqlTextReaderTest.cs | 2 +- .../Scripts/MySql/MySqlWriterTest.cs | 4 +- .../MySql/TextScriptOutputMySqlTest.cs | 19 +- .../Scripts/PgSql/PgSqlDatabaseAdapterTest.cs | 11 +- .../Scripts/PgSql/PgSqlTextReaderTest.cs | 2 +- .../Scripts/PgSql/PgSqlWriterTest.cs | 10 +- .../PgSql/TextScriptOutputPgSqlTest.cs | 19 +- .../InstallationSeekerTest.cs | 2 +- .../PowerShellInternal/PowerShellTest.cs | 22 +-- .../Scripts/PowerShellScriptTest.cs | 19 +- .../Scripts/ScriptFactoryTest.cs | 21 +- .../Scripts/SqlScriptVariableParserTest.cs | 8 +- .../Scripts/SqlTestCases/ResourceReader.cs | 4 +- .../Scripts/TextScriptTest.cs | 23 +-- .../ModuleVersionResolverTest.cs | 12 +- .../Scripts/UpgradeScriptSequenceTest.cs | 47 ++--- .../SqlDatabase.Test/Scripts/VariablesTest.cs | 2 +- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 3 +- .../SqlDatabase.Test/TestApi/FileFactory.cs | 11 +- .../SqlDatabase.Test/TestApi/MsSqlQuery.cs | 2 +- .../SqlDatabase.Test/TestApi/MySqlQuery.cs | 2 +- .../SqlDatabase.Test/TestApi/PgSqlQuery.cs | 2 +- .../SqlDatabase.Test/TestApi/TempDirectory.cs | 10 +- .../TestApi/TestPowerShellHost.cs | 2 +- .../CodeAnalysis/AllowNullAttribute.cs | 8 + .../CodeAnalysis/NotNullWhenAttribute.cs | 10 + .../Commands/DatabaseCommandBase.cs | 10 +- .../Commands/DatabaseCreateCommand.cs | 15 +- .../Commands/DatabaseExecuteCommand.cs | 15 +- .../Commands/DatabaseExportCommand.cs | 19 +- .../Commands/DatabaseUpgradeCommand.cs | 15 +- Sources/SqlDatabase/Commands/EchoCommand.cs | 17 +- Sources/SqlDatabase/Configuration/Arg.cs | 8 +- .../SqlDatabase/Configuration/CommandLine.cs | 6 +- .../Configuration/CommandLineBase.cs | 35 ++-- .../Configuration/CommandLineFactory.cs | 10 +- .../Configuration/CommandLineParser.cs | 4 +- .../Configuration/ConfigurationManager.cs | 13 +- .../Configuration/CreateCommandLine.cs | 25 +-- .../Configuration/EchoCommandLine.cs | 9 +- .../Configuration/ExecuteCommandLine.cs | 28 +-- .../Configuration/ExportCommandLine.cs | 26 +-- .../Configuration/GenericCommandLine.cs | 12 +- .../GenericCommandLineBuilder.cs | 26 +-- .../InvalidCommandLineException.cs | 2 +- .../Configuration/UpgradeCommandLine.cs | 41 ++-- .../SqlDatabase/Export/DataExportLogger.cs | 4 +- Sources/SqlDatabase/Export/DataExporter.cs | 6 +- Sources/SqlDatabase/Export/DataReaderTools.cs | 2 +- Sources/SqlDatabase/Export/ExportTable.cs | 10 +- Sources/SqlDatabase/Export/SqlWriterBase.cs | 8 +- Sources/SqlDatabase/IO/FileSystemFactory.cs | 14 +- Sources/SqlDatabase/IO/FileSystemFile.cs | 2 +- Sources/SqlDatabase/IO/FileTools.cs | 4 +- Sources/SqlDatabase/IO/IFile.cs | 2 +- Sources/SqlDatabase/IO/IFileSystemFactory.cs | 2 +- Sources/SqlDatabase/IO/InLineScriptFile.cs | 2 +- Sources/SqlDatabase/IO/ZipFolder.cs | 6 +- Sources/SqlDatabase/IO/ZipFolderFile.cs | 2 +- Sources/SqlDatabase/Log/CombinedLogger.cs | 10 +- Sources/SqlDatabase/Log/DisposableAction.cs | 2 +- Sources/SqlDatabase/Log/FileLogger.cs | 4 +- Sources/SqlDatabase/Log/LoggerBase.cs | 4 +- Sources/SqlDatabase/LoggerExtensions.cs | 4 +- Sources/SqlDatabase/Program.cs | 12 +- .../AssemblyInternal/ConsoleListener.cs | 10 +- .../AssemblyInternal/DefaultEntryPoint.cs | 15 +- .../AssemblyInternal/EntryPointResolver.cs | 54 +++--- .../ExecuteMethodResolverBase.cs | 2 +- .../ExecuteMethodResolverCommand.cs | 2 +- .../ExecuteMethodResolverCommandDictionary.cs | 6 +- .../ExecuteMethodResolverDbConnection.cs | 4 +- .../ExecuteMethodResolverDictionaryCommand.cs | 6 +- .../ExecuteMethodResolverSqlConnection.cs | 4 +- .../Scripts/AssemblyInternal/IEntryPoint.cs | 2 +- .../Scripts/AssemblyInternal/ISubDomain.cs | 6 - .../AssemblyInternal/Net472/DomainAgent.cs | 29 ++- .../AssemblyInternal/Net472/LoggerProxy.cs | 20 +- .../Net472/Net472SubDomain.cs | 100 +++++----- .../NetCore/AssemblyContext.cs | 36 ++-- .../NetCore/NetCoreSubDomain.cs | 77 ++++---- .../AssemblyInternal/VariablesProxy.cs | 9 +- Sources/SqlDatabase/Scripts/AssemblyScript.cs | 36 ++-- .../Scripts/CreateScriptSequence.cs | 12 +- Sources/SqlDatabase/Scripts/Database.cs | 22 ++- .../SqlDatabase/Scripts/DependencyParser.cs | 9 +- Sources/SqlDatabase/Scripts/IDatabase.cs | 2 +- .../SqlDatabase/Scripts/IPowerShellFactory.cs | 2 +- Sources/SqlDatabase/Scripts/IScript.cs | 2 +- Sources/SqlDatabase/Scripts/ISqlTextReader.cs | 2 +- Sources/SqlDatabase/Scripts/IVariables.cs | 2 +- .../Scripts/MsSql/MsSqlTextReader.cs | 4 +- .../SqlDatabase/Scripts/MsSql/MsSqlWriter.cs | 6 +- .../Scripts/MySql/MySqlTextReader.cs | 9 +- .../SqlDatabase/Scripts/MySql/MySqlWriter.cs | 6 +- .../Scripts/PgSql/PgSqlTextReader.cs | 6 +- .../SqlDatabase/Scripts/PgSql/PgSqlWriter.cs | 14 +- .../PowerShellInternal/DiagnosticsTools.cs | 8 +- .../Scripts/PowerShellInternal/IPowerShell.cs | 2 +- .../PowerShellInternal/InstallationSeeker.cs | 11 +- .../Scripts/PowerShellInternal/PowerShell.cs | 2 +- .../PowerShellInternal/PowerShellFactory.cs | 8 +- .../PowerShellFactory.hosted.cs | 127 ++++++------- .../PowerShellStreamsListener.cs | 24 +-- .../PowerShellInternal/VariablesProxy.cs | 7 +- .../SqlDatabase/Scripts/PowerShellScript.cs | 32 +++- .../SqlDatabase/Scripts/ScriptDependency.cs | 2 +- Sources/SqlDatabase/Scripts/ScriptFactory.cs | 46 +++-- Sources/SqlDatabase/Scripts/TextScript.cs | 21 +- .../UpgradeInternal/IModuleVersionResolver.cs | 2 +- .../UpgradeInternal/ModuleVersionResolver.cs | 12 +- .../UpgradeScriptCollection.cs | 17 +- .../Scripts/UpgradeScriptSequence.cs | 32 +++- Sources/SqlDatabase/Scripts/Variables.cs | 22 +-- Sources/SqlDatabase/StringExtensions.cs | 2 +- 171 files changed, 1203 insertions(+), 1133 deletions(-) create mode 100644 Sources/SqlDatabase/CodeAnalysis/AllowNullAttribute.cs create mode 100644 Sources/SqlDatabase/CodeAnalysis/NotNullWhenAttribute.cs diff --git a/Sources/Directory.Build.props b/Sources/Directory.Build.props index 342d94a1..43bcdf3e 100644 --- a/Sources/Directory.Build.props +++ b/Sources/Directory.Build.props @@ -8,6 +8,7 @@ true ..\SqlDatabase.snk latest + enable false en diff --git a/Sources/SqlDatabase.PowerShell.Test/Internal/DependencyResolverFactoryTest.cs b/Sources/SqlDatabase.PowerShell.Test/Internal/DependencyResolverFactoryTest.cs index 763d1b73..6044cd5a 100644 --- a/Sources/SqlDatabase.PowerShell.Test/Internal/DependencyResolverFactoryTest.cs +++ b/Sources/SqlDatabase.PowerShell.Test/Internal/DependencyResolverFactoryTest.cs @@ -12,7 +12,7 @@ public class DependencyResolverFactoryTest [TestCase("Desktop", typeof(PowerShellDesktopDependencyResolver))] [TestCase(null, typeof(PowerShellDesktopDependencyResolver))] [TestCase("Core", typeof(PowerShellCoreDependencyResolver))] - public void CreateProgram(string psEdition, Type expected) + public void CreateProgram(string? psEdition, Type expected) { var psVersionTable = new Hashtable(); if (psEdition != null) diff --git a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs index 7c3e756b..a28e9df6 100644 --- a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs +++ b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs @@ -17,8 +17,8 @@ namespace SqlDatabase.PowerShell.TestApi; public abstract class SqlDatabaseCmdLetTest { private readonly IList _commandLines = new List(); - private Runspace _runSpace; - private System.Management.Automation.PowerShell _powerShell; + private Runspace _runSpace = null!; + private System.Management.Automation.PowerShell _powerShell = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.PowerShell/CreateCmdLet.cs b/Sources/SqlDatabase.PowerShell/CreateCmdLet.cs index f66c2d0b..4051027b 100644 --- a/Sources/SqlDatabase.PowerShell/CreateCmdLet.cs +++ b/Sources/SqlDatabase.PowerShell/CreateCmdLet.cs @@ -10,25 +10,25 @@ public sealed class CreateCmdLet : PSCmdlet { [Parameter(Mandatory = true, Position = 1, HelpMessage = "Connection string to target database.")] [Alias("d")] - public string Database { get; set; } + public string Database { get; set; } = null!; [Parameter(Mandatory = true, Position = 2, ValueFromPipeline = true, HelpMessage = "A path to a folder or zip archive with sql scripts or path to a sql script file. Repeat -from to setup several sources.")] [Alias("f")] - public string[] From { get; set; } + public string[] From { get; set; } = null!; [Parameter(Position = 3, HelpMessage = "A path to application configuration file. Default is current SqlDatabase.exe.config.")] [Alias("c")] - public string Configuration { get; set; } + public string? Configuration { get; set; } [Parameter(Position = 4, HelpMessage = "Shows what would happen if the command runs. The command is not run.")] public SwitchParameter WhatIf { get; set; } [Parameter(ValueFromRemainingArguments = true, HelpMessage = "Set a variable in format \"[name of variable]=[value of variable]\".")] [Alias("v")] - public string[] Var { get; set; } + public string[]? Var { get; set; } [Parameter(HelpMessage = "Optional path to log file.")] - public string Log { get; set; } + public string? Log { get; set; } protected override void ProcessRecord() { diff --git a/Sources/SqlDatabase.PowerShell/ExecuteCmdLet.cs b/Sources/SqlDatabase.PowerShell/ExecuteCmdLet.cs index 0dcba5bd..a2bdcc8a 100644 --- a/Sources/SqlDatabase.PowerShell/ExecuteCmdLet.cs +++ b/Sources/SqlDatabase.PowerShell/ExecuteCmdLet.cs @@ -10,15 +10,15 @@ public sealed class ExecuteCmdLet : PSCmdlet { [Parameter(Mandatory = true, Position = 1, HelpMessage = "Connection string to target database.")] [Alias("d")] - public string Database { get; set; } + public string Database { get; set; } = null!; [Parameter(Position = 2, ValueFromPipeline = true, HelpMessage = "A path to a folder or zip archive with sql scripts or path to a sql script file. Repeat -from to setup several sources.")] [Alias("f")] - public string[] From { get; set; } + public string[]? From { get; set; } [Parameter(HelpMessage = "An sql script text. Repeat -fromSql to setup several scripts.")] [Alias("s")] - public string[] FromSql { get; set; } + public string[]? FromSql { get; set; } [Parameter(Position = 3, HelpMessage = "Transaction mode. Possible values: none, perStep. Default is none.")] [Alias("t")] @@ -26,17 +26,17 @@ public sealed class ExecuteCmdLet : PSCmdlet [Parameter(Position = 4, HelpMessage = "A path to application configuration file. Default is current SqlDatabase.exe.config.")] [Alias("c")] - public string Configuration { get; set; } + public string? Configuration { get; set; } [Parameter(Position = 5, HelpMessage = "Shows what would happen if the command runs. The command is not run.")] public SwitchParameter WhatIf { get; set; } [Parameter(ValueFromRemainingArguments = true, HelpMessage = "Set a variable in format \"[name of variable]=[value of variable]\".")] [Alias("v")] - public string[] Var { get; set; } + public string[]? Var { get; set; } [Parameter(HelpMessage = "Optional path to log file.")] - public string Log { get; set; } + public string? Log { get; set; } protected override void ProcessRecord() { diff --git a/Sources/SqlDatabase.PowerShell/ExportCmdLet.cs b/Sources/SqlDatabase.PowerShell/ExportCmdLet.cs index 78a37db8..e3b2d386 100644 --- a/Sources/SqlDatabase.PowerShell/ExportCmdLet.cs +++ b/Sources/SqlDatabase.PowerShell/ExportCmdLet.cs @@ -8,32 +8,32 @@ public sealed class ExportCmdLet : PSCmdlet { [Parameter(Mandatory = true, Position = 1, HelpMessage = "Connection string to target database.")] [Alias("d")] - public string Database { get; set; } + public string Database { get; set; } = null!; [Parameter(Position = 2, HelpMessage = "An sql script to select export data. Repeat -fromSql to setup several scripts.")] [Alias("s")] - public string[] FromSql { get; set; } + public string[]? FromSql { get; set; } [Parameter(HelpMessage = "A path to a folder or zip archive with sql scripts or path to a sql script file. Repeat -from to setup several sources.")] [Alias("f")] - public string[] From { get; set; } + public string[]? From { get; set; } [Parameter(Position = 3, HelpMessage = "Write sql scripts into a file. By default write into information stream.")] - public string ToFile { get; set; } + public string? ToFile { get; set; } [Parameter(Position = 4, HelpMessage = "A path to application configuration file. Default is current SqlDatabase.exe.config.")] [Alias("c")] - public string Configuration { get; set; } + public string? Configuration { get; set; } [Parameter(HelpMessage = "Setup \"INSERT INTO\" table name. Default is dbo.SqlDatabaseExport.")] - public string ToTable { get; set; } + public string? ToTable { get; set; } [Parameter(ValueFromRemainingArguments = true, HelpMessage = "Set a variable in format \"[name of variable]=[value of variable]\".")] [Alias("v")] - public string[] Var { get; set; } + public string[]? Var { get; set; } [Parameter(HelpMessage = "Optional path to log file.")] - public string Log { get; set; } + public string? Log { get; set; } protected override void ProcessRecord() { diff --git a/Sources/SqlDatabase.PowerShell/Internal/AssemblyCache.cs b/Sources/SqlDatabase.PowerShell/Internal/AssemblyCache.cs index 53fb0f2c..5287de6d 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/AssemblyCache.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/AssemblyCache.cs @@ -8,7 +8,7 @@ namespace SqlDatabase.PowerShell.Internal; internal sealed class AssemblyCache : IDisposable { private readonly string[] _probingPaths; - private readonly IDictionary _assemblyByName; + private readonly IDictionary _assemblyByName; public AssemblyCache(params string[] probingPaths) { @@ -19,10 +19,10 @@ public AssemblyCache(params string[] probingPaths) _probingPaths[i + 1] = probingPaths[i]; } - _assemblyByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + _assemblyByName = new Dictionary(StringComparer.OrdinalIgnoreCase); } - public Assembly Load(AssemblyName assemblyName, Func loader) + public Assembly? Load(AssemblyName assemblyName, Func loader) { var fileName = assemblyName.Name + ".dll"; if (_assemblyByName.TryGetValue(fileName, out var assembly)) @@ -40,7 +40,7 @@ public void Dispose() _assemblyByName.Clear(); } - private Assembly TryFindAndLoad(string fileName, Func loader) + private Assembly? TryFindAndLoad(string fileName, Func loader) { for (var i = 0; i < _probingPaths.Length; i++) { diff --git a/Sources/SqlDatabase.PowerShell/Internal/CmdletExtensions.cs b/Sources/SqlDatabase.PowerShell/Internal/CmdletExtensions.cs index 66c48a99..75019134 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/CmdletExtensions.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/CmdletExtensions.cs @@ -17,7 +17,7 @@ public static string GetWorkingDirectory(this PSCmdlet cmdlet) return root; } - public static string RootPath(this PSCmdlet cmdlet, string path) + public static string? RootPath(this PSCmdlet cmdlet, string? path) { if (string.IsNullOrEmpty(path) || Path.IsPathRooted(path)) { @@ -40,13 +40,19 @@ public static bool TryGetPSVersionTable(this PSCmdlet cmdlet, out PSVersionTable return true; } - public static void AppendFrom(this PSCmdlet cmdlet, string[] from, GenericCommandLineBuilder target) + public static void AppendFrom(this PSCmdlet cmdlet, string[]? from, GenericCommandLineBuilder target) { - if (from != null) + if (from == null) { - for (var i = 0; i < from.Length; i++) + return; + } + + for (var i = 0; i < from.Length; i++) + { + var path = cmdlet.RootPath(from[i]); + if (path != null) { - target.SetScripts(cmdlet.RootPath(from[i])); + target.SetScripts(path); } } } diff --git a/Sources/SqlDatabase.PowerShell/Internal/PSVersionTable.cs b/Sources/SqlDatabase.PowerShell/Internal/PSVersionTable.cs index 4c44dbb2..051dfd21 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/PSVersionTable.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/PSVersionTable.cs @@ -26,7 +26,7 @@ public PSVersionTable(object value) } } - public string PSEdition { get; } + public string? PSEdition { get; } - public string PSVersion { get; } + public string? PSVersion { get; } } \ No newline at end of file diff --git a/Sources/SqlDatabase.PowerShell/Internal/PowerShellCommandBase.cs b/Sources/SqlDatabase.PowerShell/Internal/PowerShellCommandBase.cs index 9b54c92f..9bfb5f80 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/PowerShellCommandBase.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/PowerShellCommandBase.cs @@ -14,7 +14,7 @@ protected PowerShellCommandBase(PSCmdlet cmdlet) public PSCmdlet Cmdlet { get; } // only for tests - internal static ISqlDatabaseProgram Program { get; set; } + internal static ISqlDatabaseProgram? Program { get; set; } public void Execute() { diff --git a/Sources/SqlDatabase.PowerShell/Internal/PowerShellCoreDependencyResolver.cs b/Sources/SqlDatabase.PowerShell/Internal/PowerShellCoreDependencyResolver.cs index 72ef5288..5a8bdd60 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/PowerShellCoreDependencyResolver.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/PowerShellCoreDependencyResolver.cs @@ -30,7 +30,7 @@ public void Dispose() _cache.Dispose(); } - private Assembly AssemblyResolving(AssemblyLoadContext context, AssemblyName assemblyName) + private Assembly? AssemblyResolving(AssemblyLoadContext context, AssemblyName assemblyName) { return _cache.Load(assemblyName, context.LoadFromAssemblyPath); } diff --git a/Sources/SqlDatabase.PowerShell/Internal/PowerShellDesktopDependencyResolver.cs b/Sources/SqlDatabase.PowerShell/Internal/PowerShellDesktopDependencyResolver.cs index 80a295b2..9e033675 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/PowerShellDesktopDependencyResolver.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/PowerShellDesktopDependencyResolver.cs @@ -25,7 +25,7 @@ public void Dispose() _cache.Dispose(); } - private Assembly AssemblyResolve(object sender, ResolveEventArgs args) + private Assembly? AssemblyResolve(object sender, ResolveEventArgs args) { return _cache.Load(new AssemblyName(args.Name), Assembly.LoadFrom); } diff --git a/Sources/SqlDatabase.PowerShell/UpgradeCmdLet.cs b/Sources/SqlDatabase.PowerShell/UpgradeCmdLet.cs index 95b921ff..1080221f 100644 --- a/Sources/SqlDatabase.PowerShell/UpgradeCmdLet.cs +++ b/Sources/SqlDatabase.PowerShell/UpgradeCmdLet.cs @@ -10,11 +10,11 @@ public sealed class UpgradeCmdLet : PSCmdlet { [Parameter(Mandatory = true, Position = 1, HelpMessage = "Connection string to target database.")] [Alias("d")] - public string Database { get; set; } + public string Database { get; set; } = null!; [Parameter(Mandatory = true, Position = 2, ValueFromPipeline = true, HelpMessage = "A path to a folder or zip archive with migration steps. Repeat -from to setup several sources.")] [Alias("f")] - public string[] From { get; set; } + public string[]? From { get; set; } [Parameter(Position = 3, HelpMessage = "Transaction mode. Possible values: none, perStep. Default is none.")] [Alias("t")] @@ -22,7 +22,7 @@ public sealed class UpgradeCmdLet : PSCmdlet [Parameter(Position = 4, HelpMessage = "A path to application configuration file. Default is current SqlDatabase.exe.config.")] [Alias("c")] - public string Configuration { get; set; } + public string? Configuration { get; set; } [Parameter(Position = 5, HelpMessage = "Shows what would happen if the command runs. The command is not run.")] public SwitchParameter WhatIf { get; set; } @@ -32,10 +32,10 @@ public sealed class UpgradeCmdLet : PSCmdlet [Parameter(ValueFromRemainingArguments = true, HelpMessage = "Set a variable in format \"[name of variable]=[value of variable]\".")] [Alias("v")] - public string[] Var { get; set; } + public string[]? Var { get; set; } [Parameter(HelpMessage = "Optional path to log file.")] - public string Log { get; set; } + public string? Log { get; set; } protected override void ProcessRecord() { diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index de378fc0..2c5aea2c 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -9,11 +9,11 @@ namespace SqlDatabase.Commands; [TestFixture] public class DatabaseCreateCommandTest { - private DatabaseCreateCommand _sut; - private Mock _database; - private Mock _scriptSequence; - private Mock _powerShellFactory; - private Mock _log; + private DatabaseCreateCommand _sut = null!; + private Mock _database = null!; + private Mock _scriptSequence = null!; + private Mock _powerShellFactory = null!; + private Mock _log = null!; [SetUp] public void BeforeEachTest() @@ -32,7 +32,7 @@ public void BeforeEachTest() _powerShellFactory = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); - _log.Setup(l => l.Indent()).Returns((IDisposable)null); + _log.Setup(l => l.Indent()).Returns((IDisposable)null!); _log .Setup(l => l.Error(It.IsAny())) .Callback(m => @@ -46,19 +46,17 @@ public void BeforeEachTest() Console.WriteLine("Info: {0}", m); }); - _sut = new DatabaseCreateCommand - { - Database = _database.Object, - Log = _log.Object, - ScriptSequence = _scriptSequence.Object, - PowerShellFactory = _powerShellFactory.Object - }; + _sut = new DatabaseCreateCommand( + _scriptSequence.Object, + _powerShellFactory.Object, + _database.Object, + _log.Object); } [Test] public void ScriptsNotFound() { - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new IScript[0]); + _scriptSequence.Setup(s => s.BuildSequence()).Returns(Array.Empty()); Assert.Throws(_sut.Execute); diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs index ba302585..4d32f0b3 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs @@ -8,11 +8,11 @@ namespace SqlDatabase.Commands; [TestFixture] public class DatabaseExecuteCommandTest { - private DatabaseExecuteCommand _sut; - private Mock _database; - private Mock _scriptSequence; - private Mock _powerShellFactory; - private Mock _log; + private DatabaseExecuteCommand _sut = null!; + private Mock _database = null!; + private Mock _scriptSequence = null!; + private Mock _powerShellFactory = null!; + private Mock _log = null!; [SetUp] public void BeforeEachTest() @@ -31,7 +31,7 @@ public void BeforeEachTest() _powerShellFactory = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); - _log.Setup(l => l.Indent()).Returns((IDisposable)null); + _log.Setup(l => l.Indent()).Returns((IDisposable)null!); _log .Setup(l => l.Info(It.IsAny())) .Callback(m => @@ -39,13 +39,11 @@ public void BeforeEachTest() Console.WriteLine("Info: {0}", m); }); - _sut = new DatabaseExecuteCommand - { - Database = _database.Object, - Log = _log.Object, - ScriptSequence = _scriptSequence.Object, - PowerShellFactory = _powerShellFactory.Object - }; + _sut = new DatabaseExecuteCommand( + _scriptSequence.Object, + _powerShellFactory.Object, + _database.Object, + _log.Object); } [Test] diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index 150e3039..7c501619 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -12,10 +12,10 @@ namespace SqlDatabase.Commands; [TestFixture] public class DatabaseExportCommandTest { - private DatabaseExportCommand _sut; - private Mock _database; - private Mock _scriptSequence; - private Mock _exporter; + private DatabaseExportCommand _sut = null!; + private Mock _database = null!; + private Mock _scriptSequence = null!; + private Mock _exporter = null!; [SetUp] public void BeforeEachTest() @@ -35,7 +35,7 @@ public void BeforeEachTest() _scriptSequence = new Mock(MockBehavior.Strict); var log = new Mock(MockBehavior.Strict); - log.Setup(l => l.Indent()).Returns((IDisposable)null); + log.Setup(l => l.Indent()).Returns((IDisposable)null!); log .Setup(l => l.Info(It.IsAny())) .Callback(m => @@ -49,13 +49,13 @@ public void BeforeEachTest() _exporter .SetupSet(e => e.Log = log.Object); - _sut = new DatabaseExportCommand + _sut = new DatabaseExportCommand( + _scriptSequence.Object, + () => Console.Out, + _database.Object, + log.Object) { - Database = _database.Object, - Log = log.Object, - ScriptSequence = _scriptSequence.Object, ExporterFactory = () => _exporter.Object, - OpenOutput = () => Console.Out }; } diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs index b391967b..1205edef 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs @@ -8,11 +8,11 @@ namespace SqlDatabase.Commands; [TestFixture] public class DatabaseUpgradeCommandTest { - private DatabaseUpgradeCommand _sut; - private Mock _database; - private Mock _scriptSequence; - private Mock _powerShellFactory; - private Mock _log; + private DatabaseUpgradeCommand _sut = null!; + private Mock _database = null!; + private Mock _scriptSequence = null!; + private Mock _powerShellFactory = null!; + private Mock _log = null!; [SetUp] public void BeforeEachTest() @@ -31,7 +31,7 @@ public void BeforeEachTest() _powerShellFactory = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); - _log.Setup(l => l.Indent()).Returns((IDisposable)null); + _log.Setup(l => l.Indent()).Returns((IDisposable)null!); _log .Setup(l => l.Error(It.IsAny())) .Callback(m => @@ -45,19 +45,17 @@ public void BeforeEachTest() Console.WriteLine("Info: {0}", m); }); - _sut = new DatabaseUpgradeCommand - { - Database = _database.Object, - Log = _log.Object, - ScriptSequence = _scriptSequence.Object, - PowerShellFactory = _powerShellFactory.Object - }; + _sut = new DatabaseUpgradeCommand( + _scriptSequence.Object, + _powerShellFactory.Object, + _database.Object, + _log.Object); } [Test] public void DatabaseIsUpToDate() { - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new ScriptStep[0]); + _scriptSequence.Setup(s => s.BuildSequence()).Returns(Array.Empty()); _sut.Execute(); diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs index d2690f9b..cfdc3283 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs @@ -11,11 +11,11 @@ namespace SqlDatabase.Configuration; [TestFixture] public class CommandLineBaseTest { - private Mock _log; - private Mock _configurationManager; - private AppConfiguration _configuration; - private Mock _fs; - private CommandLineBase _sut; + private Mock _log = null!; + private Mock _configurationManager = null!; + private AppConfiguration _configuration = null!; + private Mock _fs = null!; + private CommandLineBase _sut = null!; [SetUp] public void BeforeEachTest() @@ -72,7 +72,7 @@ public void CreateDatabaseValidateVariables() var ex = Assert.Throws(() => _sut.CreateDatabase(_log.Object, _configurationManager.Object, TransactionMode.None, false)); - ex.Message.ShouldContain("a b"); + ex!.Message.ShouldContain("a b"); ex.Message.ShouldContain("c d"); } diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineFactoryTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineFactoryTest.cs index d153ca9e..27b3e0f9 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineFactoryTest.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.Configuration; [TestFixture] public class CommandLineFactoryTest { - private CommandLineFactory _sut; + private CommandLineFactory _sut = null!; [SetUp] public void BeforeEachTest() @@ -36,7 +36,7 @@ public void Bind(string command, Type commandLine) [Test] public void BindEmptyCommandLine() { - _sut.Args = new CommandLine(new Arg[0], new string[0]); + _sut.Args = new CommandLine(Array.Empty(), Array.Empty()); _sut.Bind().ShouldBeFalse(); } @@ -48,7 +48,7 @@ public void BindUnknownCommand() var ex = Assert.Throws(() => _sut.Bind()); - ex.Message.ShouldContain("[Unknown]"); + ex?.Message.ShouldContain("[Unknown]"); } [Test] diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineParserTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineParserTest.cs index a31c9db8..66a7baa6 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineParserTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineParserTest.cs @@ -6,7 +6,7 @@ namespace SqlDatabase.Configuration; [TestFixture] public class CommandLineParserTest { - private CommandLineParser _sut; + private CommandLineParser _sut = null!; [SetUp] public void BeforeEachTest() @@ -22,7 +22,7 @@ public void BeforeEachTest() [TestCase("-=x", null, null, false)] [TestCase("-=", null, null, false)] [TestCase("-", null, null, false)] - public void SplitArg(string keyValue, string expectedKey, string expectedValue, bool isValid) + public void SplitArg(string keyValue, string? expectedKey, string? expectedValue, bool isValid) { CommandLineParser.ParseArg(keyValue, out var actual).ShouldBe(isValid); if (isValid) diff --git a/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs b/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs index 0380c5d2..f923e30f 100644 --- a/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs @@ -22,7 +22,7 @@ public class ConfigurationManagerTest "; - private ConfigurationManager _sut; + private ConfigurationManager _sut = null!; [SetUp] public void BeforeEachTest() @@ -33,7 +33,7 @@ public void BeforeEachTest() [Test] public void LoadFromCurrentConfiguration() { - _sut.LoadFrom((string)null); + _sut.LoadFrom((string?)null); _sut.SqlDatabase.ShouldNotBeNull(); _sut.SqlDatabase.Variables.AllKeys.ShouldBe(new[] { nameof(ConfigurationManagerTest) }); diff --git a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs index c8d770c3..07c02066 100644 --- a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs @@ -11,9 +11,9 @@ namespace SqlDatabase.Configuration; [TestFixture] public class CreateCommandLineTest { - private Mock _log; - private Mock _fs; - private CreateCommandLine _sut; + private Mock _log = null!; + private Mock _fs = null!; + private CreateCommandLine _sut = null!; [SetUp] public void BeforeEachTest() @@ -76,7 +76,7 @@ public void CreateCommand() database.WhatIf.ShouldBeTrue(); var scriptFactory = actual.ScriptSequence.ShouldBeOfType().ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory.InstallationPath.ShouldBe(@"c:\PowerShell"); + scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); } diff --git a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs index e8ad6fea..96058492 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs @@ -11,9 +11,9 @@ namespace SqlDatabase.Configuration; [TestFixture] public class ExecuteCommandLineTest { - private Mock _log; - private Mock _fs; - private ExecuteCommandLine _sut; + private Mock _log = null!; + private Mock _fs = null!; + private ExecuteCommandLine _sut = null!; [SetUp] public void BeforeEachTest() @@ -86,7 +86,7 @@ public void CreateCommand() database.WhatIf.ShouldBeTrue(); var scriptFactory = actual.ScriptSequence.ShouldBeOfType().ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory.InstallationPath.ShouldBe(@"c:\PowerShell"); + scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); } diff --git a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs index 5e0538c5..c9387d3f 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs @@ -13,9 +13,9 @@ namespace SqlDatabase.Configuration; [TestFixture] public class ExportCommandLineTest { - private Mock _log; - private Mock _fs; - private ExportCommandLine _sut; + private Mock _log = null!; + private Mock _fs = null!; + private ExportCommandLine _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs index 9f176ed8..44d24951 100644 --- a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.Configuration; [TestFixture] public class GenericCommandLineBuilderTest { - private GenericCommandLineBuilder _sut; + private GenericCommandLineBuilder _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs index 58abace4..35da86ac 100644 --- a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs @@ -11,9 +11,9 @@ namespace SqlDatabase.Configuration; [TestFixture] public class UpgradeCommandLineTest { - private Mock _log; - private Mock _fs; - private UpgradeCommandLine _sut; + private Mock _log = null!; + private Mock _fs = null!; + private UpgradeCommandLine _sut = null!; [SetUp] public void BeforeEachTest() @@ -86,7 +86,7 @@ public void CreateCommand() sequence.FolderAsModuleName.ShouldBeTrue(); var scriptFactory = sequence.ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory.InstallationPath.ShouldBe(@"c:\PowerShell"); + scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); } diff --git a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs b/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs index ccaa66fe..11be0955 100644 --- a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs @@ -8,8 +8,8 @@ namespace SqlDatabase.Export; [TestFixture] public class DataExportLoggerTest { - private DataExportLogger _sut; - private IList _output; + private DataExportLogger _sut = null!; + private IList _output = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs index 99e67446..48cb9dbe 100644 --- a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs @@ -14,8 +14,8 @@ namespace SqlDatabase.Export; [TestFixture] public class MsSqlDataExporterTest { - private StringBuilder _output; - private DataExporter _sut; + private StringBuilder _output = null!; + private DataExporter _sut = null!; [SetUp] public void BeforeEachTest() @@ -244,11 +244,11 @@ private static IEnumerable GetExportCases() yield return new TestCaseData("BINARY", new[] { byte.MinValue }, new[] { byte.MaxValue }) { TestName = "BINARY" }; yield return new TestCaseData("BINARY(2)", new[] { byte.MinValue, byte.MinValue }, new[] { byte.MaxValue, byte.MaxValue }) { TestName = "BINARY(2)" }; - yield return new TestCaseData("VARBINARY", new byte[0], new[] { byte.MinValue }) { TestName = "VARBINARY" }; - yield return new TestCaseData("VARBINARY(3)", new byte[0], new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "VARBINARY(3)" }; - yield return new TestCaseData("VARBINARY(MAX)", new byte[0], new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "VARBINARY(MAX)" }; + yield return new TestCaseData("VARBINARY", Array.Empty(), new[] { byte.MinValue }) { TestName = "VARBINARY" }; + yield return new TestCaseData("VARBINARY(3)", Array.Empty(), new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "VARBINARY(3)" }; + yield return new TestCaseData("VARBINARY(MAX)", Array.Empty(), new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "VARBINARY(MAX)" }; - yield return new TestCaseData("IMAGE", new byte[0], new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "IMAGE" }; + yield return new TestCaseData("IMAGE", Array.Empty(), new byte[] { byte.MinValue, 2, byte.MaxValue }) { TestName = "IMAGE" }; var date = new DateTime(2019, 04, 22, 15, 42, 30); yield return new TestCaseData("DATE", date.Date, date.Date) { TestName = "DATE" }; diff --git a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs index f6e0bbe7..76ba48e1 100644 --- a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs @@ -13,8 +13,8 @@ namespace SqlDatabase.Export; [TestFixture] public class MySqlDataExporterTest { - private StringBuilder _output; - private DataExporter _sut; + private StringBuilder _output = null!; + private DataExporter _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs index 752b47dc..b99e8cb2 100644 --- a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs @@ -17,8 +17,8 @@ namespace SqlDatabase.Export; [TestFixture] public class PgSqlDataExporterTest { - private StringBuilder _output; - private DataExporter _sut; + private StringBuilder _output = null!; + private DataExporter _sut = null!; [SetUp] public void BeforeEachTest() @@ -121,14 +121,14 @@ private static void CompareValues(string dataType, object expected, object actua if (dataType.Equals("tsquery", StringComparison.OrdinalIgnoreCase)) { - actual.ShouldBeAssignableTo().ToString().ShouldBe(NpgsqlTsQuery.Parse((string)expected).ToString()); + actual.ShouldBeAssignableTo()!.ToString().ShouldBe(NpgsqlTsQuery.Parse((string)expected).ToString()); return; } if (expected is IDictionary compositeExpected) { var compositeActual = actual.ShouldBeAssignableTo>(); - compositeActual.Keys.ShouldBe(compositeExpected.Keys); + compositeActual!.Keys.ShouldBe(compositeExpected.Keys); foreach (var key in compositeExpected.Keys) { compositeActual[key].ShouldBe(compositeExpected[key]); @@ -180,7 +180,7 @@ private static IEnumerable GetExportCases() yield return new TestCaseData("public.citext", "abc", "d", true, null) { TestName = "public.citext" }; // Binary Data Types - yield return new TestCaseData("bytea", new byte[0], new[] { byte.MinValue, byte.MaxValue, (byte)10 }, true, null) { TestName = "bytea" }; + yield return new TestCaseData("bytea", Array.Empty(), new[] { byte.MinValue, byte.MaxValue, (byte)10 }, true, null) { TestName = "bytea" }; // Date/Time Types var date = new DateTime(2021, 05, 13, 18, 31, 30, 10); @@ -222,7 +222,7 @@ private static IEnumerable GetExportCases() yield return new TestCaseData("integer[3]", new[] { 1, 2, 3 }, new[] { -1, -2, 3 }, true, "integer[]") { TestName = "integer[3]" }; // Composite Types - IDictionary composite = new ExpandoObject(); + IDictionary composite = new ExpandoObject(); composite.Add("name", "fuzzy dice"); composite.Add("supplier_id", 42); composite.Add("price", 1.99); diff --git a/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs b/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs index b865f165..049338ab 100644 --- a/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs +++ b/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs @@ -9,8 +9,8 @@ namespace SqlDatabase.IO; [TestFixture] public class ZipFolderTest { - private TempDirectory _temp; - private ZipFolder _sut; + private TempDirectory _temp = null!; + private ZipFolder _sut = null!; [SetUp] public void BeforeEachTest() @@ -55,7 +55,7 @@ public void GetFiles() Assert.AreEqual("11", reader.ReadToEnd()); } - files[0].GetParent().GetFiles().OrderBy(i => i.Name).First().ShouldBe(files[0]); + files[0].GetParent()!.GetFiles().OrderBy(i => i.Name).First().ShouldBe(files[0]); } [Test] @@ -98,6 +98,6 @@ public void ReadContentOfEmbeddedZip() Assert.AreEqual("11", reader.ReadToEnd()); } - files[0].GetParent().GetFiles().OrderBy(i => i.Name).First().ShouldBe(files[0]); + files[0].GetParent()!.GetFiles().OrderBy(i => i.Name).First().ShouldBe(files[0]); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs index 5fec0140..67e26ba5 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs @@ -19,16 +19,16 @@ public class ProgramTest { private readonly string _connectionString = new SqlConnectionStringBuilder(MsSqlQuery.ConnectionString) { InitialCatalog = "SqlDatabaseIT" }.ToString(); - private string _scriptsLocation; - private AppConfiguration _configuration; - private TempFile _logFile; + private string _scriptsLocation = null!; + private AppConfiguration _configuration = null!; + private TempFile _logFile = null!; [SetUp] public void BeforeEachTest() { TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["MsSql.IntegrationTestsScriptsLocation"]; + _scriptsLocation = ConfigurationManager.AppSettings["MsSql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); @@ -266,11 +266,11 @@ private void InvokeExecuteCommand(Action builder) Program.Main(args).ShouldBe(0); } - private IDatabase CreateDatabaseObject(AppConfiguration configuration = null) + private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) { - return new Database - { - Adapter = new MsSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, new Mock(MockBehavior.Strict).Object) - }; + var log = new Mock(MockBehavior.Strict).Object; + var adapter = new MsSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); + + return new Database(adapter, log, TransactionMode.None, false); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs index b02b765d..ac585cc6 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs @@ -19,16 +19,16 @@ public class ProgramTest { private readonly string _connectionString = new MySqlConnectionStringBuilder(MySqlQuery.ConnectionString) { Database = "sqldatabasetest_it" }.ToString(); - private string _scriptsLocation; - private AppConfiguration _configuration; - private TempFile _logFile; + private string _scriptsLocation = null!; + private AppConfiguration _configuration = null!; + private TempFile _logFile = null!; [SetUp] public void BeforeEachTest() { TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["MySql.IntegrationTestsScriptsLocation"]; + _scriptsLocation = ConfigurationManager.AppSettings["MySql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); @@ -267,11 +267,10 @@ private void InvokeExecuteCommand(Action builder) Program.Main(args).ShouldBe(0); } - private IDatabase CreateDatabaseObject(AppConfiguration configuration = null) + private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) { - return new Database - { - Adapter = new MySqlDatabaseAdapter(_connectionString, configuration ?? _configuration, new Mock(MockBehavior.Strict).Object) - }; + var log = new Mock(MockBehavior.Strict).Object; + var adapter = new MySqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); + return new Database(adapter, log, TransactionMode.None, false); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs index dbd52775..f5167c33 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs @@ -19,16 +19,16 @@ public class ProgramTest { private readonly string _connectionString = new NpgsqlConnectionStringBuilder(PgSqlQuery.ConnectionString) { Database = "sqldatabasetest_it" }.ToString(); - private string _scriptsLocation; - private AppConfiguration _configuration; - private TempFile _logFile; + private string _scriptsLocation = null!; + private AppConfiguration _configuration = null!; + private TempFile _logFile = null!; [SetUp] public void BeforeEachTest() { TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["PgSql.IntegrationTestsScriptsLocation"]; + _scriptsLocation = ConfigurationManager.AppSettings["PgSql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); @@ -267,11 +267,10 @@ private void InvokeExecuteCommand(Action builder) Program.Main(args).ShouldBe(0); } - private IDatabase CreateDatabaseObject(AppConfiguration configuration = null) + private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) { - return new Database - { - Adapter = new PgSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, new Mock(MockBehavior.Strict).Object) - }; + var log = new Mock(MockBehavior.Strict).Object; + var adapter = new PgSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); + return new Database(adapter, log, TransactionMode.None, false); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs b/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs index 665bf7b4..73f191b3 100644 --- a/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs @@ -8,9 +8,9 @@ namespace SqlDatabase.Log; [TestFixture] public class CombinedLoggerTest { - private CombinedLogger _sut; - private Mock _logger1; - private Mock _logger2; + private CombinedLogger _sut = null!; + private Mock _logger1 = null!; + private Mock _logger2 = null!; public interface IDisposableLogger : ILogger, IDisposable { diff --git a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs index 7cd4e8b0..e0b05f2a 100644 --- a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs @@ -9,7 +9,7 @@ namespace SqlDatabase.Log; [TestFixture] public class FileLoggerTest { - private TempFile _file; + private TempFile _file = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Log/LoggerBaseTest.cs b/Sources/SqlDatabase.Test/Log/LoggerBaseTest.cs index 09d27d13..09cef943 100644 --- a/Sources/SqlDatabase.Test/Log/LoggerBaseTest.cs +++ b/Sources/SqlDatabase.Test/Log/LoggerBaseTest.cs @@ -8,9 +8,9 @@ namespace SqlDatabase.Log; [TestFixture] public class LoggerBaseTest { - private IList _info; - private IList _error; - private LoggerBase _sut; + private IList _info = null!; + private IList _error = null!; + private LoggerBase _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs index aa28051f..fb8ce8c2 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs @@ -2,6 +2,8 @@ using System.Data; using System.Data.Common; +#pragma warning disable CS8765 // Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes). + namespace SqlDatabase.Scripts.AssemblyInternal; internal sealed class DbCommandStub : DbCommand @@ -72,7 +74,7 @@ public override int ExecuteNonQuery() return _command.ExecuteNonQuery(); } - public override object ExecuteScalar() + public override object? ExecuteScalar() { return _command.ExecuteScalar(); } diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs index 45177d1d..500af1a6 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs @@ -9,16 +9,16 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class DefaultEntryPointTest { - private DefaultEntryPoint _sut; - private IList _logOutput; - private Mock _command; - private Mock> _variables; + private DefaultEntryPoint _sut = null!; + private IList _logOutput = null!; + private Mock _command = null!; + private Mock> _variables = null!; [SetUp] public void BeforeEachTest() { _command = new Mock(MockBehavior.Strict); - _variables = new Mock>(MockBehavior.Strict); + _variables = new Mock>(MockBehavior.Strict); _logOutput = new List(); @@ -38,7 +38,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new DefaultEntryPoint { Log = log.Object }; + _sut = new DefaultEntryPoint(log.Object, null!, null!); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs index e5764739..9de06b3c 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs @@ -9,8 +9,8 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public partial class EntryPointResolverTest { - private EntryPointResolver _sut; - private IList _logErrorOutput; + private EntryPointResolver _sut = null!; + private IList _logErrorOutput = null!; [SetUp] public void BeforeEachTest() @@ -32,7 +32,7 @@ public void BeforeEachTest() _logErrorOutput.Add(m); }); - _sut = new EntryPointResolver { Log = log.Object }; + _sut = new EntryPointResolver(log.Object, null!, null!); } [Test] @@ -50,7 +50,7 @@ public void ResolveFromExample(string className) CollectionAssert.IsEmpty(_logErrorOutput); Assert.IsInstanceOf(actual); - var entryPoint = (DefaultEntryPoint)actual; + var entryPoint = (DefaultEntryPoint)actual!; entryPoint.Log.ShouldNotBeNull(); entryPoint.ScriptInstance.ShouldBeOfType(); entryPoint.Method.Method.Name.ShouldBe(nameof(ExampleSqlDatabaseScript.Execute)); @@ -76,7 +76,7 @@ public void ResolveExecuteWithCommandOnly() CollectionAssert.IsEmpty(_logErrorOutput); Assert.IsInstanceOf(actual); - var entryPoint = (DefaultEntryPoint)actual; + var entryPoint = (DefaultEntryPoint)actual!; Assert.IsNotNull(entryPoint.Log); Assert.IsInstanceOf(entryPoint.ScriptInstance); Assert.IsNotNull(entryPoint.Method); @@ -92,7 +92,7 @@ public void ResolveExecuteWithConnection() CollectionAssert.IsEmpty(_logErrorOutput); Assert.IsInstanceOf(actual); - var entryPoint = (DefaultEntryPoint)actual; + var entryPoint = (DefaultEntryPoint)actual!; Assert.IsNotNull(entryPoint.Log); Assert.IsInstanceOf(entryPoint.ScriptInstance); Assert.IsNotNull(entryPoint.Method); diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs index e772b882..c9376acb 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs @@ -9,9 +9,9 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class ExecuteMethodResolverCommandDictionaryTest { - private ExecuteMethodResolverCommandDictionary _sut; - private IDbCommand _executeCommand; - private IReadOnlyDictionary _executeVariables; + private ExecuteMethodResolverCommandDictionary _sut = null!; + private IDbCommand? _executeCommand; + private IReadOnlyDictionary? _executeVariables; [SetUp] public void BeforeEachTest() @@ -23,18 +23,18 @@ public void BeforeEachTest() public void IsMatch() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method)); + Assert.IsTrue(_sut.IsMatch(method!)); } [Test] public void CreateDelegate() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method); + var actual = _sut.CreateDelegate(this, method!); Assert.IsNotNull(actual); var command = new Mock(MockBehavior.Strict); - var variables = new Mock>(MockBehavior.Strict); + var variables = new Mock>(MockBehavior.Strict); actual(command.Object, variables.Object); @@ -42,7 +42,7 @@ public void CreateDelegate() Assert.AreEqual(_executeVariables, variables.Object); } - private void Execute(IDbCommand command, IReadOnlyDictionary variables) + private void Execute(IDbCommand command, IReadOnlyDictionary variables) { Assert.IsNull(_executeCommand); _executeCommand = command; diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs index 596c9f4e..3f02f075 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs @@ -8,8 +8,8 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class ExecuteMethodResolverCommandTest { - private ExecuteMethodResolverCommand _sut; - private IDbCommand _executeCommand; + private ExecuteMethodResolverCommand _sut = null!; + private IDbCommand? _executeCommand; [SetUp] public void BeforeEachTest() @@ -21,18 +21,18 @@ public void BeforeEachTest() public void IsMatch() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method)); + Assert.IsTrue(_sut.IsMatch(method!)); } [Test] public void CreateDelegate() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method); + var actual = _sut.CreateDelegate(this, method!); Assert.IsNotNull(actual); var command = new Mock(MockBehavior.Strict); - actual(command.Object, null); + actual(command.Object, null!); Assert.AreEqual(_executeCommand, command.Object); } diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs index bce6318b..3b5dde95 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs @@ -1,5 +1,4 @@ using System.Data; -using System.Data.SqlClient; using System.Reflection; using Moq; using NUnit.Framework; @@ -9,8 +8,8 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class ExecuteMethodResolverDbConnectionTest { - private ExecuteMethodResolverDbConnection _sut; - private IDbConnection _executeConnection; + private ExecuteMethodResolverDbConnection _sut = null!; + private IDbConnection? _executeConnection; [SetUp] public void BeforeEachTest() @@ -22,14 +21,14 @@ public void BeforeEachTest() public void IsMatch() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method)); + Assert.IsTrue(_sut.IsMatch(method!)); } [Test] public void CreateDelegate() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method); + var actual = _sut.CreateDelegate(this, method!); Assert.IsNotNull(actual); var connection = new Mock(MockBehavior.Strict); @@ -39,7 +38,7 @@ public void CreateDelegate() .SetupGet(c => c.Connection) .Returns(connection.Object); - actual(command.Object, null); + actual(command.Object, null!); Assert.AreEqual(_executeConnection, connection.Object); } diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs index c5a19fe7..01efd735 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs @@ -9,9 +9,9 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class ExecuteMethodResolverDictionaryCommandTest { - private ExecuteMethodResolverDictionaryCommand _sut; - private IDbCommand _executeCommand; - private IReadOnlyDictionary _executeVariables; + private ExecuteMethodResolverDictionaryCommand _sut = null!; + private IDbCommand? _executeCommand; + private IReadOnlyDictionary? _executeVariables; [SetUp] public void BeforeEachTest() @@ -23,18 +23,18 @@ public void BeforeEachTest() public void IsMatch() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method)); + Assert.IsTrue(_sut.IsMatch(method!)); } [Test] public void CreateDelegate() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method); + var actual = _sut.CreateDelegate(this, method!); Assert.IsNotNull(actual); var command = new Mock(MockBehavior.Strict); - var variables = new Mock>(MockBehavior.Strict); + var variables = new Mock>(MockBehavior.Strict); actual(command.Object, variables.Object); @@ -42,7 +42,7 @@ public void CreateDelegate() Assert.AreEqual(_executeVariables, variables.Object); } - private void Execute(IReadOnlyDictionary variables, IDbCommand command) + private void Execute(IReadOnlyDictionary variables, IDbCommand command) { Assert.IsNull(_executeCommand); _executeCommand = command; diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs index ffb4d9f4..3b8aba0b 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs @@ -9,8 +9,8 @@ namespace SqlDatabase.Scripts.AssemblyInternal; [TestFixture] public class ExecuteMethodResolverSqlConnectionTest { - private ExecuteMethodResolverSqlConnection _sut; - private SqlConnection _executeConnection; + private ExecuteMethodResolverSqlConnection _sut = null!; + private SqlConnection? _executeConnection; [SetUp] public void BeforeEachTest() @@ -22,14 +22,14 @@ public void BeforeEachTest() public void IsMatch() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method)); + Assert.IsTrue(_sut.IsMatch(method!)); } [Test] public void CreateDelegate() { var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method); + var actual = _sut.CreateDelegate(this, method!); Assert.IsNotNull(actual); var connection = new SqlConnection(); @@ -39,7 +39,7 @@ public void CreateDelegate() .SetupGet(c => c.Connection) .Returns(connection); - actual(command.Object, null); + actual(command.Object, null!); Assert.AreEqual(_executeConnection, connection); } diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs index 1f5c8a60..294c9940 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs @@ -8,98 +8,97 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472 +namespace SqlDatabase.Scripts.AssemblyInternal.Net472; + +[TestFixture] +public partial class Net472SubDomainTest { - [TestFixture] - public partial class Net472SubDomainTest + private Net472SubDomain _sut = null!; + private Variables _variables = null!; + private Mock _command = null!; + + private IList _executedScripts = null!; + + [SetUp] + public void BeforeEachTest() + { + _variables = new Variables(); + + var log = new Mock(MockBehavior.Strict); + log + .Setup(l => l.Info(It.IsAny())) + .Callback(m => Console.WriteLine("Info: {0}", m)); + log + .Setup(l => l.Error(It.IsAny())) + .Callback(m => Console.WriteLine("Error: {0}", m)); + + _executedScripts = new List(); + _command = new Mock(MockBehavior.Strict); + _command.SetupProperty(c => c.CommandText); + _command + .Setup(c => c.ExecuteNonQuery()) + .Callback(() => _executedScripts.Add(_command.Object.CommandText)) + .Returns(0); + + _sut = new Net472SubDomain( + log.Object, + GetType().Assembly.Location, + () => File.ReadAllBytes(GetType().Assembly.Location)); + + _sut.Initialize(); + } + + [TearDown] + public void AfterEachTest() + { + _sut?.Unload(); + _sut?.Dispose(); + } + + [Test] + public void ValidateScriptDomainAppBase() + { + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowAppBase)); + _sut.Execute(new DbCommandStub(_command.Object), _variables); + _sut.Unload(); + _sut.Dispose(); + + _executedScripts.Count.ShouldBe(2); + + var assemblyFileName = _executedScripts[0]; + FileAssert.DoesNotExist(assemblyFileName); + Path.GetFileName(GetType().Assembly.Location).ShouldBe(Path.GetFileName(assemblyFileName)); + + var appBase = _executedScripts[1]; + DirectoryAssert.DoesNotExist(appBase); + Path.GetDirectoryName(assemblyFileName).ShouldBe(appBase); + } + + [Test] + public void ValidateScriptDomainConfiguration() { - private Net472SubDomain _sut; - private Variables _variables; - private Mock _command; - - private IList _executedScripts; - - [SetUp] - public void BeforeEachTest() - { - _variables = new Variables(); - - var log = new Mock(MockBehavior.Strict); - log - .Setup(l => l.Info(It.IsAny())) - .Callback(m => Console.WriteLine("Info: {0}", m)); - log - .Setup(l => l.Error(It.IsAny())) - .Callback(m => Console.WriteLine("Error: {0}", m)); - - _executedScripts = new List(); - _command = new Mock(MockBehavior.Strict); - _command.SetupProperty(c => c.CommandText); - _command - .Setup(c => c.ExecuteNonQuery()) - .Callback(() => _executedScripts.Add(_command.Object.CommandText)) - .Returns(0); - - _sut = new Net472SubDomain { Logger = log.Object }; - - _sut.AssemblyFileName = GetType().Assembly.Location; - _sut.ReadAssemblyContent = () => File.ReadAllBytes(GetType().Assembly.Location); - - _sut.Initialize(); - } - - [TearDown] - public void AfterEachTest() - { - _sut?.Unload(); - _sut?.Dispose(); - } - - [Test] - public void ValidateScriptDomainAppBase() - { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowAppBase)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); - _sut.Unload(); - _sut.Dispose(); - - _executedScripts.Count.ShouldBe(2); - - var assemblyFileName = _executedScripts[0]; - FileAssert.DoesNotExist(assemblyFileName); - Path.GetFileName(GetType().Assembly.Location).ShouldBe(Path.GetFileName(assemblyFileName)); - - var appBase = _executedScripts[1]; - DirectoryAssert.DoesNotExist(appBase); - Path.GetDirectoryName(assemblyFileName).ShouldBe(appBase); - } - - [Test] - public void ValidateScriptDomainConfiguration() - { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowConfiguration)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); - _sut.Unload(); - _sut.Dispose(); - - Assert.AreEqual(2, _executedScripts.Count); - - var configurationFile = _executedScripts[0]; - configurationFile.ShouldBe(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); - - var connectionString = _executedScripts[1]; - connectionString.ShouldBe(MsSqlQuery.ConnectionString); - } - - [Test] - public void ValidateScriptDomainCreateSubDomain() - { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.Execute)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); - - _executedScripts.Count.ShouldBe(1); - _executedScripts[0].ShouldBe("hello"); - } + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowConfiguration)); + _sut.Execute(new DbCommandStub(_command.Object), _variables); + _sut.Unload(); + _sut.Dispose(); + + Assert.AreEqual(2, _executedScripts.Count); + + var configurationFile = _executedScripts[0]; + configurationFile.ShouldBe(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); + + var connectionString = _executedScripts[1]; + connectionString.ShouldBe(MsSqlQuery.ConnectionString); + } + + [Test] + public void ValidateScriptDomainCreateSubDomain() + { + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.Execute)); + _sut.Execute(new DbCommandStub(_command.Object), _variables); + + _executedScripts.Count.ShouldBe(1); + _executedScripts[0].ShouldBe("hello"); } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs index 48601b3a..f3b6e895 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs @@ -14,13 +14,13 @@ namespace SqlDatabase.Scripts; [TestFixture] public class AssemblyScriptTest { - private AssemblyScript _sut; - private Variables _variables; - private Mock _log; - private Mock _command; + private AssemblyScript _sut = null!; + private Variables _variables = null!; + private Mock _log = null!; + private Mock _command = null!; - private IList _logOutput; - private IList _executedScripts; + private IList _logOutput = null!; + private IList _executedScripts = null!; [SetUp] public void BeforeEachTest() @@ -41,8 +41,7 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(0); - _sut = new AssemblyScript(); - _sut.Configuration = new AssemblyScriptConfiguration(); + _sut = new AssemblyScript("dummy", null!, null!, new AssemblyScriptConfiguration()); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs index c280e843..0fbb8840 100644 --- a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs @@ -1,4 +1,5 @@ -using System.IO; +using System.Collections.Generic; +using System.IO; using System.Linq; using Moq; using NUnit.Framework; @@ -10,7 +11,7 @@ namespace SqlDatabase.Scripts; [TestFixture] public class CreateScriptSequenceTest { - private CreateScriptSequence _sut; + private CreateScriptSequence _sut = null!; [SetUp] public void BeforeEachTest() @@ -30,10 +31,7 @@ public void BeforeEachTest() return script.Object; }); - _sut = new CreateScriptSequence - { - ScriptFactory = scriptFactory.Object - }; + _sut = new CreateScriptSequence(new List(), scriptFactory.Object); } [Test] @@ -68,7 +66,7 @@ public void BuildSequenceFromOneFolder() .Concat(files) .ToArray(); - _sut.Sources = new IFileSystemInfo[] { FileFactory.Folder("root", content) }; + _sut.Sources.Add(FileFactory.Folder("root", content)); var actual = _sut.BuildSequence(); @@ -89,13 +87,10 @@ public void BuildSequenceFromOneFolder() [Test] public void BuildSequenceFromFolderAndFile() { - _sut.Sources = new IFileSystemInfo[] - { - FileFactory.Folder("root", FileFactory.File("20.sql"), FileFactory.File("10.sql")), - FileFactory.File("02.sql"), - FileFactory.File("01.sql"), - FileFactory.File("ignore") - }; + _sut.Sources.Add(FileFactory.Folder("root", FileFactory.File("20.sql"), FileFactory.File("10.sql"))); + _sut.Sources.Add(FileFactory.File("02.sql")); + _sut.Sources.Add(FileFactory.File("01.sql")); + _sut.Sources.Add(FileFactory.File("ignore")); var actual = _sut.BuildSequence(); diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index 22161e2c..d26e4a35 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -14,8 +14,8 @@ namespace SqlDatabase.Scripts; [TestFixture] public class DatabaseAdapterFactoryTest { - private ILogger _log; - private AppConfiguration _configuration; + private ILogger _log = null!; + private AppConfiguration _configuration = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs index a4472766..aa74ddc0 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs @@ -13,12 +13,12 @@ namespace SqlDatabase.Scripts; [TestFixture] public class DatabaseTest { - private Database _sut; - private Mock _adapter; - private Mock _command; - private Mock _connection; - private Mock _transaction; - private IList _logOutput; + private Database _sut = null!; + private Mock _adapter = null!; + private Mock _command = null!; + private Mock _connection = null!; + private Mock _transaction = null!; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -63,11 +63,7 @@ public void BeforeEachTest() _adapter = new Mock(MockBehavior.Strict); - _sut = new Database - { - Adapter = _adapter.Object, - Log = log.Object - }; + _sut = new Database(_adapter.Object, log.Object, TransactionMode.None, false); } [Test] @@ -150,7 +146,7 @@ public void GetCurrentVersionInvalidScript() var actual = Assert.Throws(() => _sut.GetCurrentVersion(null)); - actual.InnerException.ShouldBe(ex.Object); + actual!.InnerException.ShouldBe(ex.Object); actual.Message.ShouldContain("select 1"); } @@ -172,7 +168,7 @@ public void GetCurrentVersionInvalidVersion() var actual = Assert.Throws(() => _sut.GetCurrentVersion(null)); - actual.Message.ShouldContain("abc"); + actual!.Message.ShouldContain("abc"); } [Test] @@ -193,7 +189,7 @@ public void GetCurrentVersionModuleNameInvalidVersion() var actual = Assert.Throws(() => _sut.GetCurrentVersion("my module-name")); - actual.Message.ShouldContain("abc"); + actual!.Message.ShouldContain("abc"); actual.Message.ShouldContain("my module-name"); } diff --git a/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs b/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs index c86dd3e5..624f2c8e 100644 --- a/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs @@ -27,7 +27,7 @@ public void ExtractDependenciesInvalidVersion(string versionText) var input = "-- module dependency: moduleName " + versionText; var ex = Assert.Throws(() => DependencyParser.ExtractDependencies(new StringReader(input), "file name").ToArray()); - ex.Message.ShouldContain("moduleName"); + ex!.Message.ShouldContain("moduleName"); ex.Message.ShouldContain(versionText); } diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs index dce00f37..387924dc 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs @@ -16,9 +16,9 @@ public class MsSqlDatabaseAdapterTest private const string SelectModuleVersion = "SELECT value from sys.fn_listextendedproperty('version-{{ModuleName}}', default, default, default, default, default, default)"; private const string UpdateModuleVersion = "EXEC sys.sp_updateextendedproperty @name=N'version-{{ModuleName}}', @value=N'{{TargetVersion}}'"; - private MsSqlDatabaseAdapter _sut; - private AppConfiguration _configuration; - private IList _logOutput; + private MsSqlDatabaseAdapter _sut = null!; + private AppConfiguration _configuration = null!; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -35,10 +35,7 @@ public void BeforeEachTest() _configuration = new AppConfiguration(); - _sut = new MsSqlDatabaseAdapter( - MsSqlQuery.ConnectionString, - _configuration, - log.Object); + _sut = new MsSqlDatabaseAdapter(MsSqlQuery.ConnectionString, _configuration, log.Object); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs index f26600df..12a136ee 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs @@ -10,7 +10,7 @@ namespace SqlDatabase.Scripts.MsSql; [TestFixture] public class MsSqlTextReaderTest { - private MsSqlTextReader _sut; + private MsSqlTextReader _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs index 88ca1fea..bc1bf8e9 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs @@ -10,8 +10,8 @@ namespace SqlDatabase.Scripts.MsSql; [TestFixture] public class MsSqlWriterTest { - private StringBuilder _output; - private MsSqlWriter _sut; + private StringBuilder _output = null!; + private MsSqlWriter _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs index 394eabb5..c45bbd58 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs @@ -11,13 +11,13 @@ namespace SqlDatabase.Scripts.MsSql; [TestFixture] public class TextScriptOutputMsSqlTest { - private SqlConnection _connection; - private SqlCommand _command; - private Mock _logger; - private Variables _variables; - private TextScript _sut; + private SqlConnection _connection = null!; + private SqlCommand _command = null!; + private Mock _logger = null!; + private Variables _variables = null!; + private TextScript _sut = null!; - private IList _logOutput; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -28,7 +28,7 @@ public void BeforeEachTest() _logger = new Mock(MockBehavior.Strict); _logger .Setup(l => l.Indent()) - .Returns((IDisposable)null); + .Returns((IDisposable)null!); _logger .Setup(l => l.Info(It.IsAny())) .Callback(m => @@ -37,10 +37,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript - { - TextReader = new MsSqlTextReader() - }; + _sut = new TextScript("dummy", null!, new MsSqlTextReader()); _connection = MsSqlQuery.Open(); _command = _connection.CreateCommand(); } diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs index aa8f123c..1c845605 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs @@ -16,9 +16,9 @@ public class MySqlDatabaseAdapterTest private const string SelectModuleVersion = "SELECT version FROM version WHERE module_name = '{{ModuleName}}'"; private const string UpdateModuleVersion = "UPDATE version SET version='{{TargetVersion}}' WHERE module_name = '{{ModuleName}}'"; - private MySqlDatabaseAdapter _sut; - private AppConfiguration _configuration; - private IList _logOutput; + private MySqlDatabaseAdapter _sut = null!; + private AppConfiguration _configuration = null!; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -35,10 +35,7 @@ public void BeforeEachTest() _configuration = new AppConfiguration(); - _sut = new MySqlDatabaseAdapter( - MySqlQuery.ConnectionString, - _configuration, - log.Object); + _sut = new MySqlDatabaseAdapter(MySqlQuery.ConnectionString, _configuration, log.Object); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs index ce6f18b4..906cab30 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.Scripts.MySql; [TestFixture] public class MySqlTextReaderTest { - private MySqlTextReader _sut; + private MySqlTextReader _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs index 7a1e8366..2cbbc8a4 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs @@ -10,8 +10,8 @@ namespace SqlDatabase.Scripts.MySql; [TestFixture] public class MySqlWriterTest { - private StringBuilder _output; - private MySqlWriter _sut; + private StringBuilder _output = null!; + private MySqlWriter _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs index 526f57de..9af69c77 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs @@ -11,13 +11,13 @@ namespace SqlDatabase.Scripts.MySql; [TestFixture] public class TextScriptOutputMySqlTest { - private MySqlConnection _connection; - private MySqlCommand _command; - private Mock _logger; - private Variables _variables; - private TextScript _sut; + private MySqlConnection _connection = null!; + private MySqlCommand _command = null!; + private Mock _logger = null!; + private Variables _variables = null!; + private TextScript _sut = null!; - private IList _logOutput; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -28,7 +28,7 @@ public void BeforeEachTest() _logger = new Mock(MockBehavior.Strict); _logger .Setup(l => l.Indent()) - .Returns((IDisposable)null); + .Returns((IDisposable)null!); _logger .Setup(l => l.Info(It.IsAny())) .Callback(m => @@ -37,10 +37,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript - { - TextReader = new MySqlTextReader() - }; + _sut = new TextScript("dummy", null!, new MySqlTextReader()); _connection = MySqlQuery.Open(); _command = _connection.CreateCommand(); diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs index 2a8f41bd..04d6caeb 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs @@ -16,9 +16,9 @@ public class PgSqlDatabaseAdapterTest private const string SelectModuleVersion = "SELECT version FROM public.version WHERE module_name = '{{ModuleName}}'"; private const string UpdateModuleVersion = "UPDATE public.version SET version='{{TargetVersion}}' WHERE module_name = '{{ModuleName}}'"; - private PgSqlDatabaseAdapter _sut; - private AppConfiguration _configuration; - private IList _logOutput; + private PgSqlDatabaseAdapter _sut = null!; + private AppConfiguration _configuration = null!; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -35,10 +35,7 @@ public void BeforeEachTest() _configuration = new AppConfiguration(); - _sut = new PgSqlDatabaseAdapter( - PgSqlQuery.ConnectionString, - _configuration, - log.Object); + _sut = new PgSqlDatabaseAdapter(PgSqlQuery.ConnectionString, _configuration, log.Object); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs index 6223be85..3a2b5f44 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.Scripts.PgSql; [TestFixture] public class PgSqlTextReaderTest { - private PgSqlTextReader _sut; + private PgSqlTextReader _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs index b2843eb8..691948ef 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs @@ -14,8 +14,8 @@ namespace SqlDatabase.Scripts.PgSql; [TestFixture] public class PgSqlWriterTest { - private StringBuilder _output; - private PgSqlWriter _sut; + private StringBuilder _output = null!; + private PgSqlWriter _sut = null!; [SetUp] public void BeforeEachTest() @@ -137,7 +137,7 @@ public void ValueTsQuery(string value) .Text("::tsquery"); var actual = PgSqlQuery.ExecuteScalar(_output.ToString()).ShouldBeAssignableTo(); - actual.ToString().ShouldBe(expected.ToString()); + actual!.ToString().ShouldBe(expected!.ToString()); } [Test] @@ -177,7 +177,7 @@ public void Value2dArray(string type, object value11, object value12, object val [Test] public void ValueCompositeType() { - IDictionary expected = new ExpandoObject(); + IDictionary expected = new ExpandoObject(); expected.Add("name", "fuzzy dice"); expected.Add("supplier_id", 42); expected.Add("price", 1.99); @@ -187,7 +187,7 @@ public void ValueCompositeType() .Value(expected) .Text("::public.inventory_item"); - IDictionary actual = PgSqlQuery.ExecuteScalar(_output.ToString()).ShouldBeOfType(); + IDictionary actual = PgSqlQuery.ExecuteScalar(_output.ToString()).ShouldBeOfType(); actual.Keys.ShouldBe(expected.Keys); foreach (var key in actual.Keys) { diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs index 9f78b194..89f36e68 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs @@ -11,13 +11,13 @@ namespace SqlDatabase.Scripts.PgSql; [TestFixture] public class TextScriptOutputPgSqlTest { - private NpgsqlConnection _connection; - private NpgsqlCommand _command; - private Mock _logger; - private Variables _variables; - private TextScript _sut; + private NpgsqlConnection _connection = null!; + private NpgsqlCommand _command = null!; + private Mock _logger = null!; + private Variables _variables = null!; + private TextScript _sut = null!; - private IList _logOutput; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -28,7 +28,7 @@ public void BeforeEachTest() _logger = new Mock(MockBehavior.Strict); _logger .Setup(l => l.Indent()) - .Returns((IDisposable)null); + .Returns((IDisposable)null!); _logger .Setup(l => l.Info(It.IsAny())) .Callback(m => @@ -37,10 +37,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript - { - TextReader = new PgSqlTextReader() - }; + _sut = new TextScript("dummy", null!, new PgSqlTextReader()); _connection = PgSqlQuery.Open(); _command = _connection.CreateCommand(); diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs index cb3229da..95889e96 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs @@ -56,7 +56,7 @@ public void TryGetInfo() actual.Location.ShouldBe(dir.Location); actual.Version.ShouldBe(GetType().Assembly.GetName().Version); - actual.ProductVersion.ShouldBe(GetType().Assembly.GetCustomAttribute().InformationalVersion); + actual.ProductVersion.ShouldBe(GetType().Assembly.GetCustomAttribute()!.InformationalVersion); } } diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs index 1043bf25..d5ee5e28 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs @@ -12,12 +12,12 @@ namespace SqlDatabase.Scripts.PowerShellInternal; [TestFixture] public class PowerShellTest { - private IPowerShellFactory _factory; - private IPowerShell _sut; - private Mock _logger; - private Mock _variables; - private Mock _command; - private List _logOutput; + private IPowerShellFactory _factory = null!; + private IPowerShell _sut = null!; + private Mock _logger = null!; + private Mock _variables = null!; + private Mock _command = null!; + private List _logOutput = null!; [OneTimeSetUp] public void BeforeAllTests() @@ -33,7 +33,7 @@ public void BeforeAllTests() .Callback(m => _logOutput.Add("error: " + m)); _logger .Setup(l => l.Indent()) - .Returns((IDisposable)null); + .Returns((IDisposable)null!); _factory = TestPowerShellHost.GetOrCreateFactory(); } @@ -175,12 +175,12 @@ private static string LoadScript(string name) private void InvokeExecute(string script, bool whatIf) { - var parameters = new KeyValuePair[2 + (whatIf ? 1 : 0)]; - parameters[0] = new KeyValuePair(PowerShellScript.ParameterCommand, _command.Object); - parameters[1] = new KeyValuePair(PowerShellScript.ParameterVariables, new VariablesProxy(_variables.Object)); + var parameters = new KeyValuePair[2 + (whatIf ? 1 : 0)]; + parameters[0] = new KeyValuePair(PowerShellScript.ParameterCommand, _command.Object); + parameters[1] = new KeyValuePair(PowerShellScript.ParameterVariables, new VariablesProxy(_variables.Object)); if (whatIf) { - parameters[2] = new KeyValuePair(PowerShellScript.ParameterWhatIf, null); + parameters[2] = new KeyValuePair(PowerShellScript.ParameterWhatIf, null); } _sut.Invoke(script, _logger.Object, parameters); diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs index df954346..4a0f3835 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs @@ -13,11 +13,11 @@ namespace SqlDatabase.Scripts; [TestFixture] public class PowerShellScriptTest { - private PowerShellScript _sut; - private Mock _powerShell; - private Mock _variables; - private Mock _command; - private Mock _log; + private PowerShellScript _sut = null!; + private Mock _powerShell = null!; + private Mock _variables = null!; + private Mock _command = null!; + private Mock _log = null!; [SetUp] public void BeforeEachTest() @@ -32,17 +32,14 @@ public void BeforeEachTest() .Setup(f => f.Create()) .Returns(_powerShell.Object); - _sut = new PowerShellScript - { - PowerShellFactory = factory.Object - }; + _sut = new PowerShellScript(null!, null!, null!, factory.Object); } [Test] public void Execute() { _powerShell - .Setup(p => p.Invoke("script content", _log.Object, It.IsNotNull[]>())) + .Setup(p => p.Invoke("script content", _log.Object, It.IsNotNull[]>())) .Callback[]>((_, _, parameters) => { parameters.Length.ShouldBe(2); @@ -66,7 +63,7 @@ public void ExecuteWhatIf() .Setup(p => p.SupportsShouldProcess("script content")) .Returns(true); _powerShell - .Setup(p => p.Invoke("script content", _log.Object, It.IsNotNull[]>())) + .Setup(p => p.Invoke("script content", _log.Object, It.IsNotNull[]>())) .Callback[]>((_, _, parameters) => { parameters.Length.ShouldBe(3); diff --git a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs index fd736588..4927b34f 100644 --- a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs @@ -11,10 +11,10 @@ namespace SqlDatabase.Scripts; [TestFixture] public class ScriptFactoryTest { - private ScriptFactory _sut; - private Mock _powerShellFactory; - private AssemblyScriptConfiguration _configuration; - private Mock _textReader; + private ScriptFactory _sut = null!; + private Mock _powerShellFactory = null!; + private AssemblyScriptConfiguration _configuration = null!; + private Mock _textReader = null!; [SetUp] public void BeforeEachTest() @@ -23,12 +23,7 @@ public void BeforeEachTest() _powerShellFactory = new Mock(MockBehavior.Strict); _textReader = new Mock(MockBehavior.Strict); - _sut = new ScriptFactory - { - AssemblyScriptConfiguration = _configuration, - PowerShellFactory = _powerShellFactory.Object, - TextReader = _textReader.Object - }; + _sut = new ScriptFactory(_configuration, _powerShellFactory.Object, _textReader.Object); } [Test] @@ -57,10 +52,10 @@ public void FromDllFile() var script = _sut.FromFile(file).ShouldBeOfType(); - script.DisplayName.ShouldBe("11.dll"); + script!.DisplayName.ShouldBe("11.dll"); script.Configuration.ShouldBe(_configuration); script.ReadAssemblyContent().ShouldBe(new byte[] { 1, 2, 3 }); - new StreamReader(script.ReadDescriptionContent()).ReadToEnd().ShouldBe("3, 2, 1"); + new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); } [Test] @@ -99,7 +94,7 @@ public void FromPs1File() script.PowerShellFactory.ShouldBe(_powerShellFactory.Object); script.DisplayName.ShouldBe("11.ps1"); new StreamReader(script.ReadScriptContent()).ReadToEnd().ShouldBe("some script"); - new StreamReader(script.ReadDescriptionContent()).ReadToEnd().ShouldBe("3, 2, 1"); + new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); _powerShellFactory.VerifyAll(); } diff --git a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs b/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs index 31f6b67e..30bba272 100644 --- a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs @@ -8,8 +8,8 @@ namespace SqlDatabase.Scripts; [TestFixture] public class SqlScriptVariableParserTest { - private Mock _variables; - private SqlScriptVariableParser _sut; + private Mock _variables = null!; + private SqlScriptVariableParser _sut = null!; [SetUp] public void BeforeEachTest() @@ -99,11 +99,11 @@ public void ApplyVariablesFailsOnUnknownVariable() { _variables .Setup(v => v.GetValue(It.IsAny())) - .Returns((string)null); + .Returns((string?)null); var ex = Assert.Throws(() => _sut.ApplyVariables("{{Value_1}}")); - ex.Message.ShouldContain("Value_1"); + ex!.Message.ShouldContain("Value_1"); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs b/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs index 2ddcebee..978512f6 100644 --- a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs +++ b/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs @@ -22,7 +22,7 @@ internal static class ResourceReader foreach (var sourceName in sources) { using (var stream = anchor.Assembly.GetManifestResourceStream(sourceName)) - using (var reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream!)) { var name = Path.GetFileNameWithoutExtension(sourceName.Substring(prefix.Length)); var (input, expected) = ParseResource(reader); @@ -42,7 +42,7 @@ private static (string Input, string[] Expected) ParseResource(TextReader reader var isInput = true; - string line; + string? line; while ((line = reader.ReadLine()) != null) { if (line == Separator) diff --git a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs index 9a5a2cb3..0468e90d 100644 --- a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs @@ -15,14 +15,14 @@ namespace SqlDatabase.Scripts; [TestFixture] public class TextScriptTest { - private Mock _logger; - private Variables _variables; - private Mock _command; - private TextScript _sut; + private Mock _logger = null!; + private Variables _variables = null!; + private Mock _command = null!; + private TextScript _sut = null!; - private IList _logOutput; - private IList _executedScripts; - private Mock _executedReader; + private IList _logOutput = null!; + private IList _executedScripts = null!; + private Mock _executedReader = null!; [SetUp] public void BeforeEachTest() @@ -52,10 +52,7 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(_executedReader.Object); - _sut = new TextScript - { - TextReader = new MsSqlTextReader() - }; + _sut = new TextScript(null!, null!, new MsSqlTextReader()); _variables.SetValue(VariableSource.CommandLine, "var1", "[some value]"); } @@ -66,7 +63,7 @@ public void ExecuteShowVariableReplacement() _executedReader .Setup(r => r.GetSchemaTable()) - .Returns((DataTable)null); + .Returns((DataTable)null!); _executedReader .Setup(r => r.Read()) .Returns(false); @@ -96,7 +93,7 @@ public void Execute() _executedReader .Setup(r => r.GetSchemaTable()) - .Returns((DataTable)null); + .Returns((DataTable)null!); _executedReader .Setup(r => r.Read()) .Returns(false); diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs b/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs index bf74b9d9..9983f71d 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs @@ -9,9 +9,9 @@ namespace SqlDatabase.Scripts.UpgradeInternal; [TestFixture] public class ModuleVersionResolverTest { - private ModuleVersionResolver _sut; - private Mock _database; - private IList _logOutput; + private ModuleVersionResolver _sut = null!; + private Mock _database = null!; + private IList _logOutput = null!; [SetUp] public void BeforeEachTest() @@ -28,11 +28,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new ModuleVersionResolver - { - Database = _database.Object, - Log = log.Object - }; + _sut = new ModuleVersionResolver(log.Object, _database.Object); } [Test] diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs index 401f0ddd..e9bf838a 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs @@ -15,10 +15,10 @@ namespace SqlDatabase.Scripts; [TestFixture] public class UpgradeScriptSequenceTest { - private UpgradeScriptSequence _sut; - private SourceFolder _root; - private Mock _versionResolver; - private Mock _scriptFactory; + private UpgradeScriptSequence _sut = null!; + private SourceFolder _root = null!; + private Mock _versionResolver = null!; + private Mock _scriptFactory = null!; [SetUp] public void BeforeEachTest() @@ -32,12 +32,13 @@ public void BeforeEachTest() _versionResolver = new Mock(MockBehavior.Strict); - _sut = new UpgradeScriptSequence - { - Sources = { _root }, - ScriptFactory = _scriptFactory.Object, - VersionResolver = _versionResolver.Object - }; + _sut = new UpgradeScriptSequence( + _scriptFactory.Object, + _versionResolver.Object, + new IFileSystemInfo[] { _root }, + new Mock(MockBehavior.Strict).Object, + false, + false); } [Test] @@ -48,7 +49,7 @@ public void BuildSequence(BuildSequenceCase testCase) { var file = AddFile(_root, sourceFile.Name); - var dependencies = new ScriptDependency[0]; + var dependencies = Array.Empty(); if (sourceFile.Dependencies != null) { dependencies = sourceFile.Dependencies.Select(i => new ScriptDependency(i.Module, new Version(i.Version))).ToArray(); @@ -80,7 +81,7 @@ public void BuildSequence(BuildSequenceCase testCase) else { var ex = Assert.Throws(() => _sut.BuildSequence()); - Console.WriteLine(ex.Message); + Console.WriteLine(ex!.Message); foreach (var tag in testCase.Exception) { ex.Message.ShouldContain(tag); @@ -103,9 +104,9 @@ private static IEnumerable GetBuildSequence() { BuildSequenceCase[] testCases; using (var stream = anchor.Assembly.GetManifestResourceStream(sourceName)) - using (var reader = new JsonTextReader(new StreamReader(stream))) + using (var reader = new JsonTextReader(new StreamReader(stream!))) { - testCases = new JsonSerializer().Deserialize(reader); + testCases = new JsonSerializer().Deserialize(reader)!; } foreach (var testCase in testCases) @@ -131,31 +132,31 @@ private static IFile AddFile(SourceFolder root, string fileName) public sealed class BuildSequenceCase { - public string Name { get; set; } + public string Name { get; set; } = null!; public bool FolderAsModuleName { get; set; } - public ModuleVersion[] Version { get; set; } + public ModuleVersion[] Version { get; set; } = null!; - public SourceFile[] Files { get; set; } + public SourceFile[] Files { get; set; } = null!; - public string[] Sequence { get; set; } + public string[] Sequence { get; set; } = null!; - public string[] Exception { get; set; } + public string[]? Exception { get; set; } } public sealed class ModuleVersion { - public string Module { get; set; } + public string Module { get; set; } = null!; - public string Version { get; set; } + public string Version { get; set; } = null!; } public sealed class SourceFile { - public string Name { get; set; } + public string Name { get; set; } = null!; - public ModuleVersion[] Dependencies { get; set; } + public ModuleVersion[]? Dependencies { get; set; } } private sealed class SourceFolder : IFolder diff --git a/Sources/SqlDatabase.Test/Scripts/VariablesTest.cs b/Sources/SqlDatabase.Test/Scripts/VariablesTest.cs index fc0950da..4d4cfb53 100644 --- a/Sources/SqlDatabase.Test/Scripts/VariablesTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/VariablesTest.cs @@ -6,7 +6,7 @@ namespace SqlDatabase.Scripts; [TestFixture] public class VariablesTest { - private Variables _sut; + private Variables _sut = null!; [SetUp] public void BeforeEachTest() diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 5439355a..34d2ef62 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -22,11 +22,12 @@ - + + diff --git a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs b/Sources/SqlDatabase.Test/TestApi/FileFactory.cs index d21981f1..77431b20 100644 --- a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs +++ b/Sources/SqlDatabase.Test/TestApi/FileFactory.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Linq; using System.Text; using Moq; @@ -9,7 +10,7 @@ namespace SqlDatabase.TestApi; internal static class FileFactory { - public static IFile File(string name, byte[] content, IFolder parent) + public static IFile File(string name, byte[]? content, IFolder? parent) { var file = new Mock(MockBehavior.Strict); @@ -25,15 +26,15 @@ public static IFile File(string name, byte[] content, IFolder parent) return file.Object; } - public static IFile File(string name, byte[] content = null) => File(name, content, null); + public static IFile File(string name, byte[]? content = null) => File(name, content, null); public static IFile File(string name, string content) => File(name, content, null); - public static IFile File(string name, string content, IFolder parent) + public static IFile File(string name, string content, IFolder? parent) { return File( name, - string.IsNullOrEmpty(content) ? new byte[0] : Encoding.UTF8.GetBytes(content), + string.IsNullOrEmpty(content) ? Array.Empty() : Encoding.UTF8.GetBytes(content), parent); } diff --git a/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs b/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs index 9578653d..dd314e58 100644 --- a/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs +++ b/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs @@ -17,7 +17,7 @@ public static SqlConnection Open() return con; } - public static object ExecuteScalar(string sql) + public static object? ExecuteScalar(string sql) { using (var connection = Open()) using (var cmd = connection.CreateCommand()) diff --git a/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs b/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs index 85fc1f75..bf1bdd4c 100644 --- a/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs +++ b/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs @@ -17,7 +17,7 @@ public static MySqlConnection Open() return con; } - public static object ExecuteScalar(string sql) + public static object? ExecuteScalar(string sql) { using (var connection = Open()) using (var cmd = connection.CreateCommand()) diff --git a/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs b/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs index 9faaebf2..908db6d7 100644 --- a/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs +++ b/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs @@ -17,7 +17,7 @@ public static NpgsqlConnection Open() return con; } - public static object ExecuteScalar(string sql) + public static object? ExecuteScalar(string sql) { using (var connection = Open()) using (var cmd = connection.CreateCommand()) diff --git a/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs b/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs index f42cec74..880fa961 100644 --- a/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs +++ b/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.TestApi; internal sealed class TempDirectory : IDisposable { - public TempDirectory(string name = null) + public TempDirectory(string? name = null) { Location = Path.Combine(Path.GetTempPath(), name ?? Guid.NewGuid().ToString()); Directory.CreateDirectory(Location); @@ -15,14 +15,14 @@ public TempDirectory(string name = null) public string Location { get; } - public string CopyFileFromResources(string resourceName, Type resourceAnchor = null) + public string CopyFileFromResources(string resourceName, Type? resourceAnchor = null) { if (resourceAnchor == null) { - resourceAnchor = new StackTrace().GetFrame(1).GetMethod().DeclaringType; + resourceAnchor = new StackTrace().GetFrame(1)!.GetMethod()!.DeclaringType; } - var source = resourceAnchor.Assembly.GetManifestResourceStream(resourceAnchor.Namespace + "." + resourceName); + var source = resourceAnchor!.Assembly.GetManifestResourceStream(resourceAnchor.Namespace + "." + resourceName); Assert.IsNotNull(source, resourceName); var fileName = Path.Combine(Location, resourceName); @@ -30,7 +30,7 @@ public string CopyFileFromResources(string resourceName, Type resourceAnchor = n using (source) using (var dest = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite)) { - source.CopyTo(dest); + source!.CopyTo(dest); } return fileName; diff --git a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs b/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs index a757c04f..629caaf5 100644 --- a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs +++ b/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs @@ -28,7 +28,7 @@ private static IPowerShellFactory CreateFactory() .Callback(m => Console.WriteLine("error: " + m)); logger .Setup(l => l.Indent()) - .Returns((IDisposable)null); + .Returns((IDisposable)null!); var factory = PowerShellFactory.Create(null); factory.Request(); diff --git a/Sources/SqlDatabase/CodeAnalysis/AllowNullAttribute.cs b/Sources/SqlDatabase/CodeAnalysis/AllowNullAttribute.cs new file mode 100644 index 00000000..39be8db8 --- /dev/null +++ b/Sources/SqlDatabase/CodeAnalysis/AllowNullAttribute.cs @@ -0,0 +1,8 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] +internal sealed class AllowNullAttribute : Attribute +{ +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase/CodeAnalysis/NotNullWhenAttribute.cs b/Sources/SqlDatabase/CodeAnalysis/NotNullWhenAttribute.cs new file mode 100644 index 00000000..e3d56cf7 --- /dev/null +++ b/Sources/SqlDatabase/CodeAnalysis/NotNullWhenAttribute.cs @@ -0,0 +1,10 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +internal sealed class NotNullWhenAttribute : Attribute +{ + public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; + + public bool ReturnValue { get; } +} +#endif diff --git a/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs b/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs index 55af56cf..97a5041e 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs @@ -4,9 +4,15 @@ namespace SqlDatabase.Commands; internal abstract class DatabaseCommandBase : ICommand { - public ILogger Log { get; set; } + protected DatabaseCommandBase(IDatabase database, ILogger log) + { + Database = database; + Log = log; + } + + public ILogger Log { get; } - public IDatabase Database { get; set; } + public IDatabase Database { get; } public void Execute() { diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index fe7a1f4d..e6aef975 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -6,9 +6,20 @@ namespace SqlDatabase.Commands; internal sealed class DatabaseCreateCommand : DatabaseCommandBase { - public ICreateScriptSequence ScriptSequence { get; set; } + public DatabaseCreateCommand( + ICreateScriptSequence scriptSequence, + IPowerShellFactory powerShellFactory, + IDatabase database, + ILogger log) + : base(database, log) + { + ScriptSequence = scriptSequence; + PowerShellFactory = powerShellFactory; + } + + public ICreateScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; set; } + public IPowerShellFactory PowerShellFactory { get; } protected override void Greet(string databaseLocation) { diff --git a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs index 395c041e..27bb145f 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs @@ -5,9 +5,20 @@ namespace SqlDatabase.Commands; internal sealed class DatabaseExecuteCommand : DatabaseCommandBase { - public ICreateScriptSequence ScriptSequence { get; set; } + public DatabaseExecuteCommand( + ICreateScriptSequence scriptSequence, + IPowerShellFactory powerShellFactory, + IDatabase database, + ILogger log) + : base(database, log) + { + ScriptSequence = scriptSequence; + PowerShellFactory = powerShellFactory; + } + + public ICreateScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; set; } + public IPowerShellFactory PowerShellFactory { get; } protected override void Greet(string databaseLocation) { diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 78cabddb..5b302b1d 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -9,11 +9,22 @@ namespace SqlDatabase.Commands; internal sealed class DatabaseExportCommand : DatabaseCommandBase { - public ICreateScriptSequence ScriptSequence { get; set; } + public DatabaseExportCommand( + ICreateScriptSequence scriptSequence, + Func openOutput, + IDatabase database, + ILogger log) + : base(database, log) + { + ScriptSequence = scriptSequence; + OpenOutput = openOutput; + } + + public ICreateScriptSequence ScriptSequence { get; } - public Func OpenOutput { get; set; } + public Func OpenOutput { get; } - public string DestinationTableName { get; set; } + public string? DestinationTableName { get; set; } internal Func ExporterFactory { get; set; } = () => new DataExporter(); @@ -54,7 +65,7 @@ protected override void ExecuteCore() } } - private static string GetExportTableName(string name, int index, int subIndex) + private static string GetExportTableName(string? name, int index, int subIndex) { var result = new StringBuilder(20); diff --git a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs index 22e47719..89de2e3e 100644 --- a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs @@ -8,9 +8,20 @@ namespace SqlDatabase.Commands; internal sealed class DatabaseUpgradeCommand : DatabaseCommandBase { - public IUpgradeScriptSequence ScriptSequence { get; set; } + public DatabaseUpgradeCommand( + IUpgradeScriptSequence scriptSequence, + IPowerShellFactory powerShellFactory, + IDatabase database, + ILogger log) + : base(database, log) + { + ScriptSequence = scriptSequence; + PowerShellFactory = powerShellFactory; + } + + public IUpgradeScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; set; } + public IPowerShellFactory PowerShellFactory { get; } protected override void Greet(string databaseLocation) { diff --git a/Sources/SqlDatabase/Commands/EchoCommand.cs b/Sources/SqlDatabase/Commands/EchoCommand.cs index 475be66a..0908d4f7 100644 --- a/Sources/SqlDatabase/Commands/EchoCommand.cs +++ b/Sources/SqlDatabase/Commands/EchoCommand.cs @@ -4,15 +4,24 @@ namespace SqlDatabase.Commands; internal sealed class EchoCommand : ICommand { - public ILogger Logger { get; set; } + public EchoCommand(ILogger logger, CommandLine args) + { + Logger = logger; + Args = args; + } + + public ILogger Logger { get; } - public CommandLine Args { get; set; } + public CommandLine Args { get; } public void Execute() { - foreach (var arg in Args.Original) + if (Args.Original != null) { - Logger.Info(arg); + foreach (var arg in Args.Original) + { + Logger.Info(arg); + } } } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/Arg.cs b/Sources/SqlDatabase/Configuration/Arg.cs index 4ffe1c1d..5145ed6b 100644 --- a/Sources/SqlDatabase/Configuration/Arg.cs +++ b/Sources/SqlDatabase/Configuration/Arg.cs @@ -22,7 +22,7 @@ internal readonly struct Arg internal const string Log = "log"; - public Arg(string key, string value) + public Arg(string key, string? value) { IsPair = true; Key = key; @@ -38,11 +38,11 @@ public Arg(string value) public bool IsPair { get; } - public string Key { get; } + public string? Key { get; } - public string Value { get; } + public string? Value { get; } - public override string ToString() + public override string? ToString() { if (IsPair) { diff --git a/Sources/SqlDatabase/Configuration/CommandLine.cs b/Sources/SqlDatabase/Configuration/CommandLine.cs index d123bce7..77e1a669 100644 --- a/Sources/SqlDatabase/Configuration/CommandLine.cs +++ b/Sources/SqlDatabase/Configuration/CommandLine.cs @@ -2,9 +2,9 @@ namespace SqlDatabase.Configuration; -internal struct CommandLine +internal readonly struct CommandLine { - public CommandLine(IList args, string[] original) + public CommandLine(IList args, string[]? original) { Args = args; Original = original; @@ -18,5 +18,5 @@ public CommandLine(params Arg[] args) public IList Args { get; } - public string[] Original { get; } + public string[]? Original { get; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/CommandLineBase.cs b/Sources/SqlDatabase/Configuration/CommandLineBase.cs index 2116d8c4..e59f6a1e 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineBase.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineBase.cs @@ -9,13 +9,13 @@ namespace SqlDatabase.Configuration; internal abstract class CommandLineBase : ICommandLine { - public string ConnectionString { get; set; } + public string? ConnectionString { get; set; } public IList Scripts { get; } = new List(); public IDictionary Variables { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - public string ConfigurationFile { get; set; } + public string? ConfigurationFile { get; set; } public IFileSystemFactory FileSystemFactory { get; set; } = new FileSystemFactory(); @@ -46,20 +46,14 @@ internal Database CreateDatabase(ILogger logger, IConfigurationManager configura IDatabaseAdapter adapter; try { - adapter = DatabaseAdapterFactory.CreateAdapter(ConnectionString, configuration.SqlDatabase, logger); + adapter = DatabaseAdapterFactory.CreateAdapter(ConnectionString!, configuration.SqlDatabase, logger); } catch (Exception ex) { throw new InvalidCommandLineException(Arg.Database, "Invalid connection string value.", ex); } - var database = new Database - { - Adapter = adapter, - Log = logger, - Transaction = transaction, - WhatIf = whatIf - }; + var database = new Database(adapter, logger, transaction, whatIf); var configurationVariables = configuration.SqlDatabase.Variables; foreach (var name in configurationVariables.AllKeys) @@ -122,10 +116,15 @@ protected virtual bool ParseArg(Arg arg) return false; } - protected void SetInLineScript(string value) + protected void SetInLineScript(string? value) { + if (string.IsNullOrEmpty(value)) + { + return; + } + var index = Scripts.Count + 1; - var script = FileSystemFactory.FromContent("from{0}.sql".FormatWith(index), value); + var script = FileSystemFactory.FromContent("from{0}.sql".FormatWith(index), value!); Scripts.Add(script); } @@ -166,7 +165,7 @@ private bool TryParseKnownPair(Arg arg) return true; } - if (arg.Key.StartsWith(Arg.Variable, StringComparison.OrdinalIgnoreCase)) + if (arg.Key != null && arg.Key.StartsWith(Arg.Variable, StringComparison.OrdinalIgnoreCase)) { SetVariable(arg.Key.Substring(Arg.Variable.Length), arg.Value); return true; @@ -181,12 +180,12 @@ private bool TryParseKnownPair(Arg arg) return false; } - private void SetScripts(string value) + private void SetScripts(string? value) { Scripts.Add(FileSystemFactory.FileSystemInfoFromPath(value)); } - private void SetVariable(string name, string value) + private void SetVariable(string? name, string? value) { name = name?.Trim(); if (string.IsNullOrEmpty(name)) @@ -194,15 +193,15 @@ private void SetVariable(string name, string value) throw new InvalidCommandLineException(Arg.Variable, "Invalid variable name [{0}].".FormatWith(name)); } - if (Variables.ContainsKey(name)) + if (Variables.ContainsKey(name!)) { throw new InvalidCommandLineException(Arg.Variable, "Variable with name [{0}] is duplicated.".FormatWith(name)); } - Variables.Add(name, value); + Variables.Add(name!, value ?? string.Empty); } - private void SetConfigurationFile(string configurationFile) + private void SetConfigurationFile(string? configurationFile) { ConfigurationFile = configurationFile; } diff --git a/Sources/SqlDatabase/Configuration/CommandLineFactory.cs b/Sources/SqlDatabase/Configuration/CommandLineFactory.cs index b50348a0..01c7ca31 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineFactory.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineFactory.cs @@ -13,7 +13,7 @@ internal sealed class CommandLineFactory public CommandLine Args { get; set; } - public string ActiveCommandName { get; private set; } + public string ActiveCommandName { get; private set; } = null!; public bool ShowCommandHelp { get; private set; } @@ -30,7 +30,7 @@ public bool Bind() throw new InvalidCommandLineException(" not found."); } - ActiveCommandName = commandArgs[0].Value; + ActiveCommandName = commandArgs[0].Value!; var command = CreateCommand(ActiveCommandName); if (command == null) @@ -58,14 +58,14 @@ public bool Bind() return true; } - public ICommandLine Resolve() + public ICommandLine? Resolve() { var command = CreateCommand(ActiveCommandName); - command.Parse(Args); + command?.Parse(Args); return command; } - internal static ICommandLine CreateCommand(string name) + internal static ICommandLine? CreateCommand(string? name) { if (CommandCreate.Equals(name, StringComparison.OrdinalIgnoreCase)) { diff --git a/Sources/SqlDatabase/Configuration/CommandLineParser.cs b/Sources/SqlDatabase/Configuration/CommandLineParser.cs index 000012e8..b5bb4273 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineParser.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineParser.cs @@ -5,7 +5,7 @@ namespace SqlDatabase.Configuration; internal sealed class CommandLineParser { - public static string GetLogFileName(IList args) + public static string? GetLogFileName(IList args) { for (var i = 0; i < args.Count; i++) { @@ -63,7 +63,7 @@ internal static bool ParseArg(string input, out Arg arg) return true; } - private static bool SplitKeyValue(string keyValue, int offset, out string key, out string value) + private static bool SplitKeyValue(string keyValue, int offset, out string key, out string? value) { keyValue = keyValue.Substring(offset); key = keyValue; diff --git a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs index 5e9cb067..946628bb 100644 --- a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs +++ b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs @@ -2,7 +2,6 @@ using System.Configuration; using System.IO; using System.Linq; -using System.Reflection; using SqlDatabase.IO; using Manager = System.Configuration.ConfigurationManager; @@ -10,7 +9,7 @@ namespace SqlDatabase.Configuration; internal sealed class ConfigurationManager : IConfigurationManager { - public AppConfiguration SqlDatabase { get; private set; } + public AppConfiguration SqlDatabase { get; private set; } = null!; public static string ResolveDefaultConfigurationFile(string probingPath) { @@ -19,7 +18,7 @@ public static string ResolveDefaultConfigurationFile(string probingPath) return Path.Combine(probingPath, fileName); } - public void LoadFrom(string configurationFile) + public void LoadFrom(string? configurationFile) { try { @@ -32,9 +31,9 @@ public void LoadFrom(string configurationFile) } } - internal void LoadFrom(IFileSystemInfo info) + internal void LoadFrom(IFileSystemInfo? info) { - AppConfiguration section; + AppConfiguration? section; if (info == null) { section = LoadCurrent(); @@ -47,7 +46,7 @@ internal void LoadFrom(IFileSystemInfo info) SqlDatabase = section ?? new AppConfiguration(); } - private static AppConfiguration LoadCurrent() + private static AppConfiguration? LoadCurrent() { return (AppConfiguration)Manager.GetSection(AppConfiguration.SectionName); } @@ -79,7 +78,7 @@ private static AppConfiguration Load(IFileSystemInfo info) private static IFile ResolveFile(IFileSystemInfo info) { - IFile file; + IFile? file; if (info is IFolder folder) { const string Name1 = "SqlDatabase.exe.config"; diff --git a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs index 53d059b5..2684fe4b 100644 --- a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs @@ -7,7 +7,7 @@ namespace SqlDatabase.Configuration; internal sealed class CreateCommandLine : CommandLineBase { - public string UsePowerShell { get; set; } + public string? UsePowerShell { get; set; } public bool WhatIf { get; set; } @@ -19,24 +19,11 @@ public override ICommand CreateCommand(ILogger logger) var powerShellFactory = PowerShellFactory.Create(UsePowerShell); var database = CreateDatabase(logger, configuration, TransactionMode.None, WhatIf); - var sequence = new CreateScriptSequence - { - ScriptFactory = new ScriptFactory - { - AssemblyScriptConfiguration = configuration.SqlDatabase.AssemblyScript, - PowerShellFactory = powerShellFactory, - TextReader = database.Adapter.CreateSqlTextReader() - }, - Sources = Scripts.ToArray() - }; - - return new DatabaseCreateCommand - { - Log = logger, - Database = database, - ScriptSequence = sequence, - PowerShellFactory = powerShellFactory - }; + var sequence = new CreateScriptSequence( + Scripts.ToArray(), + new ScriptFactory(configuration.SqlDatabase.AssemblyScript, powerShellFactory, database.Adapter.CreateSqlTextReader())); + + return new DatabaseCreateCommand(sequence, powerShellFactory, database, logger); } protected override bool ParseArg(Arg arg) diff --git a/Sources/SqlDatabase/Configuration/EchoCommandLine.cs b/Sources/SqlDatabase/Configuration/EchoCommandLine.cs index 83092902..0f282def 100644 --- a/Sources/SqlDatabase/Configuration/EchoCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/EchoCommandLine.cs @@ -11,12 +11,5 @@ public void Parse(CommandLine args) _args = args; } - public ICommand CreateCommand(ILogger logger) - { - return new EchoCommand - { - Logger = logger, - Args = _args - }; - } + public ICommand CreateCommand(ILogger logger) => new EchoCommand(logger, _args); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs index f5d11ddf..921a610c 100644 --- a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs @@ -10,7 +10,7 @@ internal sealed class ExecuteCommandLine : CommandLineBase { public TransactionMode Transaction { get; set; } - public string UsePowerShell { get; set; } + public string? UsePowerShell { get; set; } public bool WhatIf { get; set; } @@ -22,24 +22,14 @@ public override ICommand CreateCommand(ILogger logger) var powerShellFactory = PowerShellFactory.Create(UsePowerShell); var database = CreateDatabase(logger, configuration, TransactionMode.None, WhatIf); - var sequence = new CreateScriptSequence - { - ScriptFactory = new ScriptFactory - { - AssemblyScriptConfiguration = configuration.SqlDatabase.AssemblyScript, - PowerShellFactory = powerShellFactory, - TextReader = database.Adapter.CreateSqlTextReader() - }, - Sources = Scripts.ToArray() - }; + var sequence = new CreateScriptSequence( + Scripts.ToArray(), + new ScriptFactory( + configuration.SqlDatabase.AssemblyScript, + powerShellFactory, + database.Adapter.CreateSqlTextReader())); - return new DatabaseExecuteCommand - { - Log = logger, - Database = database, - ScriptSequence = sequence, - PowerShellFactory = powerShellFactory - }; + return new DatabaseExecuteCommand(sequence, powerShellFactory, database, logger); } protected override bool ParseArg(Arg arg) @@ -72,7 +62,7 @@ protected override bool ParseArg(Arg arg) return false; } - private void SetTransaction(string modeName) + private void SetTransaction(string? modeName) { if (!Enum.TryParse(modeName, true, out var mode)) { diff --git a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs index b3821385..84680dee 100644 --- a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs @@ -9,9 +9,9 @@ namespace SqlDatabase.Configuration; internal sealed class ExportCommandLine : CommandLineBase { - public string DestinationTableName { get; set; } + public string? DestinationTableName { get; set; } - public string DestinationFileName { get; set; } + public string? DestinationFileName { get; set; } public override ICommand CreateCommand(ILogger logger) { @@ -20,22 +20,16 @@ public override ICommand CreateCommand(ILogger logger) var database = CreateDatabase(logger, configuration, TransactionMode.None, false); - var sequence = new CreateScriptSequence - { - ScriptFactory = new ScriptFactory - { - AssemblyScriptConfiguration = configuration.SqlDatabase.AssemblyScript, - TextReader = database.Adapter.CreateSqlTextReader() - }, - Sources = Scripts.ToArray() - }; + var sequence = new CreateScriptSequence( + Scripts.ToArray(), + new ScriptFactory(configuration.SqlDatabase.AssemblyScript, null, database.Adapter.CreateSqlTextReader())); - return new DatabaseExportCommand + return new DatabaseExportCommand( + sequence, + CreateOutput(), + database, + WrapLogger(logger)) { - Log = WrapLogger(logger), - OpenOutput = CreateOutput(), - Database = database, - ScriptSequence = sequence, DestinationTableName = DestinationTableName }; } diff --git a/Sources/SqlDatabase/Configuration/GenericCommandLine.cs b/Sources/SqlDatabase/Configuration/GenericCommandLine.cs index 120f26e3..a6214ceb 100644 --- a/Sources/SqlDatabase/Configuration/GenericCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/GenericCommandLine.cs @@ -5,9 +5,9 @@ namespace SqlDatabase.Configuration; public sealed class GenericCommandLine { - public string Command { get; set; } + public string? Command { get; set; } - public string Connection { get; set; } + public string? Connection { get; set; } public TransactionMode Transaction { get; set; } @@ -17,15 +17,15 @@ public sealed class GenericCommandLine public IDictionary Variables { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - public string ConfigurationFile { get; set; } + public string? ConfigurationFile { get; set; } - public string ExportToTable { get; set; } + public string? ExportToTable { get; set; } - public string ExportToFile { get; set; } + public string? ExportToFile { get; set; } public bool WhatIf { get; set; } public bool FolderAsModuleName { get; set; } - public string LogFileName { get; set; } + public string? LogFileName { get; set; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs b/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs index 189ce217..5062030b 100644 --- a/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs +++ b/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs @@ -49,7 +49,7 @@ public GenericCommandLineBuilder SetTransaction(TransactionMode mode) return this; } - public GenericCommandLineBuilder SetVariable(string name, string value) + public GenericCommandLineBuilder SetVariable(string? name, string? value) { name = name?.Trim(); if (string.IsNullOrEmpty(name)) @@ -57,12 +57,12 @@ public GenericCommandLineBuilder SetVariable(string name, string value) throw new InvalidCommandLineException(Arg.Variable, "Invalid variable name [{0}].".FormatWith(name)); } - if (Line.Variables.ContainsKey(name)) + if (Line.Variables.ContainsKey(name!)) { throw new InvalidCommandLineException(Arg.Variable, "Variable with name [{0}] is duplicated.".FormatWith(name)); } - Line.Variables.Add(name, value); + Line.Variables.Add(name!, value ?? string.Empty); return this; } @@ -78,19 +78,19 @@ public GenericCommandLineBuilder SetVariable(string nameValue) return SetVariable(arg.Key, arg.Value); } - public GenericCommandLineBuilder SetConfigurationFile(string configurationFile) + public GenericCommandLineBuilder SetConfigurationFile(string? configurationFile) { Line.ConfigurationFile = configurationFile; return this; } - public GenericCommandLineBuilder SetExportToTable(string name) + public GenericCommandLineBuilder SetExportToTable(string? name) { Line.ExportToTable = name; return this; } - public GenericCommandLineBuilder SetExportToFile(string fileName) + public GenericCommandLineBuilder SetExportToFile(string? fileName) { Line.ExportToFile = fileName; return this; @@ -108,7 +108,7 @@ public GenericCommandLineBuilder SetFolderAsModuleName(bool value) return this; } - public GenericCommandLineBuilder SetLogFileName(string fileName) + public GenericCommandLineBuilder SetLogFileName(string? fileName) { Line.LogFileName = fileName; return this; @@ -125,8 +125,8 @@ public string[] BuildArray() var result = new List { - cmd.Command, - CombineArg(Arg.Database, cmd.Connection) + cmd.Command!, + CombineArg(Arg.Database, cmd.Connection!) }; foreach (var script in cmd.Scripts) @@ -146,17 +146,17 @@ public string[] BuildArray() if (!string.IsNullOrEmpty(cmd.ConfigurationFile)) { - result.Add(CombineArg(Arg.Configuration, cmd.ConfigurationFile)); + result.Add(CombineArg(Arg.Configuration, cmd.ConfigurationFile!)); } if (!string.IsNullOrEmpty(cmd.ExportToTable)) { - result.Add(CombineArg(Arg.ExportToTable, cmd.ExportToTable)); + result.Add(CombineArg(Arg.ExportToTable, cmd.ExportToTable!)); } if (!string.IsNullOrEmpty(cmd.ExportToFile)) { - result.Add(CombineArg(Arg.ExportToFile, cmd.ExportToFile)); + result.Add(CombineArg(Arg.ExportToFile, cmd.ExportToFile!)); } foreach (var entry in cmd.Variables) @@ -176,7 +176,7 @@ public string[] BuildArray() if (!string.IsNullOrEmpty(cmd.LogFileName)) { - result.Add(CombineArg(Arg.Log, cmd.LogFileName)); + result.Add(CombineArg(Arg.Log, cmd.LogFileName!)); } return result.ToArray(); diff --git a/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs b/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs index 75ef6fae..2375c2b5 100644 --- a/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs +++ b/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs @@ -38,7 +38,7 @@ protected InvalidCommandLineException(SerializationInfo info, StreamingContext c Argument = info.GetString(nameof(Argument)); } - public string Argument { get; } + public string? Argument { get; } public override void GetObjectData(SerializationInfo info, StreamingContext context) { diff --git a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs index d17f8ec2..38d3dc84 100644 --- a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs @@ -11,7 +11,7 @@ internal sealed class UpgradeCommandLine : CommandLineBase { public TransactionMode Transaction { get; set; } - public string UsePowerShell { get; set; } + public string? UsePowerShell { get; set; } public bool FolderAsModuleName { get; set; } @@ -24,29 +24,20 @@ public override ICommand CreateCommand(ILogger logger) var database = CreateDatabase(logger, configuration, Transaction, WhatIf); var powerShellFactory = PowerShellFactory.Create(UsePowerShell); - - var sequence = new UpgradeScriptSequence - { - ScriptFactory = new ScriptFactory - { - AssemblyScriptConfiguration = configuration.SqlDatabase.AssemblyScript, - PowerShellFactory = powerShellFactory, - TextReader = database.Adapter.CreateSqlTextReader() - }, - VersionResolver = new ModuleVersionResolver { Database = database, Log = logger }, - Sources = Scripts.ToArray(), - Log = logger, - FolderAsModuleName = FolderAsModuleName, - WhatIf = WhatIf - }; - - return new DatabaseUpgradeCommand - { - Log = logger, - Database = database, - ScriptSequence = sequence, - PowerShellFactory = powerShellFactory - }; + var scriptFactory = new ScriptFactory( + configuration.SqlDatabase.AssemblyScript, + powerShellFactory, + database.Adapter.CreateSqlTextReader()); + + var sequence = new UpgradeScriptSequence( + scriptFactory, + new ModuleVersionResolver(logger, database), + Scripts.ToArray(), + logger, + FolderAsModuleName, + WhatIf); + + return new DatabaseUpgradeCommand(sequence, powerShellFactory, database, logger); } protected override bool ParseArg(Arg arg) @@ -80,7 +71,7 @@ protected override bool ParseArg(Arg arg) return false; } - private void SetTransaction(string modeName) + private void SetTransaction(string? modeName) { if (!Enum.TryParse(modeName, true, out var mode)) { diff --git a/Sources/SqlDatabase/Export/DataExportLogger.cs b/Sources/SqlDatabase/Export/DataExportLogger.cs index b7a1be15..4be946f7 100644 --- a/Sources/SqlDatabase/Export/DataExportLogger.cs +++ b/Sources/SqlDatabase/Export/DataExportLogger.cs @@ -19,7 +19,7 @@ public void Error(string message) using (var reader = new StringReader(message)) { - string line; + string? line; while ((line = reader.ReadLine()) != null) { if (escaped.Length > 0) @@ -34,7 +34,7 @@ public void Error(string message) _origin.Error(escaped.ToString()); } - public void Info(string message) + public void Info(string? message) { // ignore } diff --git a/Sources/SqlDatabase/Export/DataExporter.cs b/Sources/SqlDatabase/Export/DataExporter.cs index 7122635b..5880c84c 100644 --- a/Sources/SqlDatabase/Export/DataExporter.cs +++ b/Sources/SqlDatabase/Export/DataExporter.cs @@ -4,18 +4,18 @@ namespace SqlDatabase.Export; internal sealed class DataExporter : IDataExporter { - public SqlWriterBase Output { get; set; } + public SqlWriterBase Output { get; set; } = null!; public int MaxInsertBatchSize { get; set; } = 500; - public ILogger Log { get; set; } + public ILogger Log { get; set; } = null!; public void Export(IDataReader source, string tableName) { ExportTable table; using (var metadata = source.GetSchemaTable()) { - table = Output.ReadSchemaTable(metadata, tableName); + table = Output.ReadSchemaTable(metadata!, tableName); } CreateTable(table); diff --git a/Sources/SqlDatabase/Export/DataReaderTools.cs b/Sources/SqlDatabase/Export/DataReaderTools.cs index 4926625c..28703dd8 100644 --- a/Sources/SqlDatabase/Export/DataReaderTools.cs +++ b/Sources/SqlDatabase/Export/DataReaderTools.cs @@ -4,7 +4,7 @@ namespace SqlDatabase.Export; internal static class DataReaderTools { - public static object CleanValue(object value) + public static object? CleanValue(object? value) { if (value == null || Convert.IsDBNull(value)) { diff --git a/Sources/SqlDatabase/Export/ExportTable.cs b/Sources/SqlDatabase/Export/ExportTable.cs index 7d2c5660..37154045 100644 --- a/Sources/SqlDatabase/Export/ExportTable.cs +++ b/Sources/SqlDatabase/Export/ExportTable.cs @@ -4,7 +4,13 @@ namespace SqlDatabase.Export; internal sealed class ExportTable { - public string Name { get; set; } + public ExportTable(string name) + { + Name = name; + Columns = new List(); + } - public IList Columns { get; } = new List(); + public string Name { get; } + + public IList Columns { get; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Export/SqlWriterBase.cs b/Sources/SqlDatabase/Export/SqlWriterBase.cs index e1c93206..254410b4 100644 --- a/Sources/SqlDatabase/Export/SqlWriterBase.cs +++ b/Sources/SqlDatabase/Export/SqlWriterBase.cs @@ -20,7 +20,7 @@ public void Dispose() Output.Dispose(); } - public SqlWriterBase Line(string value = null) + public SqlWriterBase Line(string? value = null) { Output.WriteLine(value); return this; @@ -32,7 +32,7 @@ public SqlWriterBase Text(string value) return this; } - public SqlWriterBase TextFormat(string format, params object[] args) + public SqlWriterBase TextFormat(string format, params object?[] args) { Output.Write(format, args); return this; @@ -50,7 +50,7 @@ public SqlWriterBase Null() return this; } - public SqlWriterBase Value(object value, string typeNameHint = null) + public SqlWriterBase Value(object? value, string? typeNameHint = null) { value = DataReaderTools.CleanValue(value); if (value == null) @@ -71,7 +71,7 @@ public SqlWriterBase Value(object value, string typeNameHint = null) public abstract string GetDefaultTableName(); - protected abstract bool TryWriteValue(object value, string typeNameHint); + protected abstract bool TryWriteValue(object value, string? typeNameHint); protected void ValueString(string value, char q = Q) { diff --git a/Sources/SqlDatabase/IO/FileSystemFactory.cs b/Sources/SqlDatabase/IO/FileSystemFactory.cs index 80a25681..5a6e0b73 100644 --- a/Sources/SqlDatabase/IO/FileSystemFactory.cs +++ b/Sources/SqlDatabase/IO/FileSystemFactory.cs @@ -7,13 +7,13 @@ namespace SqlDatabase.IO; internal sealed class FileSystemFactory : IFileSystemFactory { - public static IFileSystemInfo FileSystemInfoFromPath(string path) + public static IFileSystemInfo FileSystemInfoFromPath(string? path) { path = FileTools.RootPath(path); if (File.Exists(path)) { - return FileTools.IsZip(path) ? (IFileSystemInfo)new ZipFolder(path) : new FileSystemFile(path); + return FileTools.IsZip(path) ? new ZipFolder(path) : new FileSystemFile(path); } if (Directory.Exists(path)) @@ -21,7 +21,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string path) return new FileSystemFolder(path); } - IFolder entryPoint = null; + IFolder? entryPoint = null; var items = new List(); while (!string.IsNullOrEmpty(path)) @@ -44,7 +44,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string path) for (var i = 0; i < items.Count - 1; i++) { var name = items[i]; - path = Path.Combine(path, name); + path = Path.Combine(path!, name); entryPoint = entryPoint.GetFolders().FirstOrDefault(f => name.Equals(f.Name, StringComparison.OrdinalIgnoreCase)); if (entryPoint == null) @@ -54,7 +54,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string path) } var resultName = items.Last(); - path = Path.Combine(path, resultName); + path = Path.Combine(path!, resultName); var file = entryPoint.GetFiles().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase)); if (file != null) @@ -71,14 +71,14 @@ public static IFileSystemInfo FileSystemInfoFromPath(string path) return folder; } - IFileSystemInfo IFileSystemFactory.FileSystemInfoFromPath(string path) => FileSystemInfoFromPath(path); + IFileSystemInfo IFileSystemFactory.FileSystemInfoFromPath(string? path) => FileSystemInfoFromPath(path); public IFileSystemInfo FromContent(string name, string content) { return new InLineScriptFile(name, content); } - private static IFolder TryToResolveEntryPoint(string path) + private static IFolder? TryToResolveEntryPoint(string path) { if (Directory.Exists(path)) { diff --git a/Sources/SqlDatabase/IO/FileSystemFile.cs b/Sources/SqlDatabase/IO/FileSystemFile.cs index 2008c808..836dea24 100644 --- a/Sources/SqlDatabase/IO/FileSystemFile.cs +++ b/Sources/SqlDatabase/IO/FileSystemFile.cs @@ -16,7 +16,7 @@ public FileSystemFile(string location) public IFolder GetParent() { - return new FileSystemFolder(Path.GetDirectoryName(Location)); + return new FileSystemFolder(Path.GetDirectoryName(Location)!); } public Stream OpenRead() diff --git a/Sources/SqlDatabase/IO/FileTools.cs b/Sources/SqlDatabase/IO/FileTools.cs index 891b1706..3c7b8ead 100644 --- a/Sources/SqlDatabase/IO/FileTools.cs +++ b/Sources/SqlDatabase/IO/FileTools.cs @@ -9,7 +9,7 @@ internal static class FileTools private const string ZipExtension = ".zip"; private const string NuGetExtension = ".nupkg"; - public static string RootPath(string path) + public static string RootPath(string? path) { if (string.IsNullOrEmpty(path)) { @@ -21,7 +21,7 @@ public static string RootPath(string path) return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); } - return path; + return path!; } public static IEnumerable GetZipExtensions() diff --git a/Sources/SqlDatabase/IO/IFile.cs b/Sources/SqlDatabase/IO/IFile.cs index dfa709f2..87a2399f 100644 --- a/Sources/SqlDatabase/IO/IFile.cs +++ b/Sources/SqlDatabase/IO/IFile.cs @@ -4,7 +4,7 @@ namespace SqlDatabase.IO; public interface IFile : IFileSystemInfo { - IFolder GetParent(); + IFolder? GetParent(); Stream OpenRead(); } \ No newline at end of file diff --git a/Sources/SqlDatabase/IO/IFileSystemFactory.cs b/Sources/SqlDatabase/IO/IFileSystemFactory.cs index 895e9405..f5cc51bc 100644 --- a/Sources/SqlDatabase/IO/IFileSystemFactory.cs +++ b/Sources/SqlDatabase/IO/IFileSystemFactory.cs @@ -2,7 +2,7 @@ internal interface IFileSystemFactory { - IFileSystemInfo FileSystemInfoFromPath(string path); + IFileSystemInfo FileSystemInfoFromPath(string? path); IFileSystemInfo FromContent(string name, string content); } \ No newline at end of file diff --git a/Sources/SqlDatabase/IO/InLineScriptFile.cs b/Sources/SqlDatabase/IO/InLineScriptFile.cs index af7af432..e035cbf5 100644 --- a/Sources/SqlDatabase/IO/InLineScriptFile.cs +++ b/Sources/SqlDatabase/IO/InLineScriptFile.cs @@ -15,7 +15,7 @@ public InLineScriptFile(string name, string content) public string Content { get; } - public IFolder GetParent() => null; + public IFolder? GetParent() => null; public Stream OpenRead() { diff --git a/Sources/SqlDatabase/IO/ZipFolder.cs b/Sources/SqlDatabase/IO/ZipFolder.cs index f0dda263..cdc23263 100644 --- a/Sources/SqlDatabase/IO/ZipFolder.cs +++ b/Sources/SqlDatabase/IO/ZipFolder.cs @@ -10,15 +10,15 @@ namespace SqlDatabase.IO; [DebuggerDisplay("{Name}")] internal sealed class ZipFolder : IFolder { - private readonly ZipFolder _parent; - private IFolder _tree; + private readonly ZipFolder? _parent; + private IFolder? _tree; public ZipFolder(string fileName) : this(null, fileName) { } - public ZipFolder(ZipFolder parent, string zipEntryFullName) + public ZipFolder(ZipFolder? parent, string zipEntryFullName) { _parent = parent; diff --git a/Sources/SqlDatabase/IO/ZipFolderFile.cs b/Sources/SqlDatabase/IO/ZipFolderFile.cs index 77aeddcc..da605db1 100644 --- a/Sources/SqlDatabase/IO/ZipFolderFile.cs +++ b/Sources/SqlDatabase/IO/ZipFolderFile.cs @@ -29,6 +29,6 @@ public Stream OpenRead() var content = _container.OpenRead(); var entry = content.GetEntry(EntryFullName); - return new EntryStream(content, entry.Open()); + return new EntryStream(content, entry!.Open()); } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Log/CombinedLogger.cs b/Sources/SqlDatabase/Log/CombinedLogger.cs index 78b8b8bb..bfe31cc7 100644 --- a/Sources/SqlDatabase/Log/CombinedLogger.cs +++ b/Sources/SqlDatabase/Log/CombinedLogger.cs @@ -4,8 +4,8 @@ namespace SqlDatabase.Log; internal sealed class CombinedLogger : ILogger, IDisposable { - private readonly ILogger _logger1; - private readonly ILogger _logger2; + private readonly ILogger? _logger1; + private readonly ILogger? _logger2; public CombinedLogger(ILogger logger1, bool ownLogger1, ILogger logger2, bool ownLogger2) { @@ -51,10 +51,10 @@ public void Dispose() private sealed class IndentDisposable : IDisposable { - private readonly IDisposable _ident1; - private readonly IDisposable _ident2; + private readonly IDisposable? _ident1; + private readonly IDisposable? _ident2; - public IndentDisposable(IDisposable ident1, IDisposable ident2) + public IndentDisposable(IDisposable? ident1, IDisposable? ident2) { _ident1 = ident1; _ident2 = ident2; diff --git a/Sources/SqlDatabase/Log/DisposableAction.cs b/Sources/SqlDatabase/Log/DisposableAction.cs index df482401..a9d6947e 100644 --- a/Sources/SqlDatabase/Log/DisposableAction.cs +++ b/Sources/SqlDatabase/Log/DisposableAction.cs @@ -4,7 +4,7 @@ namespace SqlDatabase.Log; internal sealed class DisposableAction : IDisposable { - private Action _action; + private Action? _action; public DisposableAction(Action action) { diff --git a/Sources/SqlDatabase/Log/FileLogger.cs b/Sources/SqlDatabase/Log/FileLogger.cs index be471f1c..d3b68e45 100644 --- a/Sources/SqlDatabase/Log/FileLogger.cs +++ b/Sources/SqlDatabase/Log/FileLogger.cs @@ -38,8 +38,8 @@ public FileLogger(string fileName) public void Dispose() { - _writer?.Dispose(); - _file?.Dispose(); + _writer.Dispose(); + _file.Dispose(); } internal void Flush() diff --git a/Sources/SqlDatabase/Log/LoggerBase.cs b/Sources/SqlDatabase/Log/LoggerBase.cs index a42f0a87..74759098 100644 --- a/Sources/SqlDatabase/Log/LoggerBase.cs +++ b/Sources/SqlDatabase/Log/LoggerBase.cs @@ -4,14 +4,14 @@ namespace SqlDatabase.Log; internal abstract class LoggerBase : ILogger { - private string _indentation; + private string? _indentation; public void Error(string message) { WriteError(message); } - public void Info(string message) + public void Info(string? message) { WriteInfo(_indentation + message); } diff --git a/Sources/SqlDatabase/LoggerExtensions.cs b/Sources/SqlDatabase/LoggerExtensions.cs index 712a3ae9..5a9d07c8 100644 --- a/Sources/SqlDatabase/LoggerExtensions.cs +++ b/Sources/SqlDatabase/LoggerExtensions.cs @@ -5,7 +5,7 @@ namespace SqlDatabase; internal static class LoggerExtensions { - public static void Error(this ILogger logger, string message, Exception error) + public static void Error(this ILogger logger, string? message, Exception error) { var text = new StringBuilder(); if (!string.IsNullOrEmpty(message)) @@ -26,7 +26,7 @@ public static void Error(this ILogger logger, string message, Exception error) } logger.Error(text.ToString()); - logger.Info(error.StackTrace); + logger.Info(error.StackTrace ?? string.Empty); } public static void Error(this ILogger logger, Exception error) => Error(logger, null, error); diff --git a/Sources/SqlDatabase/Program.cs b/Sources/SqlDatabase/Program.cs index 62969e17..2f06b6a4 100644 --- a/Sources/SqlDatabase/Program.cs +++ b/Sources/SqlDatabase/Program.cs @@ -70,7 +70,7 @@ private static bool ExecuteCommand(ICommandLine cmd, ILogger logger) } } - private static ICommandLine ResolveCommandLine(CommandLineFactory factory, ILogger logger) + private static ICommandLine? ResolveCommandLine(CommandLineFactory factory, ILogger logger) { try { @@ -84,7 +84,7 @@ private static ICommandLine ResolveCommandLine(CommandLineFactory factory, ILogg return null; } - private static CommandLineFactory ResolveFactory(string[] args, ILogger logger) + private static CommandLineFactory? ResolveFactory(string[] args, ILogger logger) { try { @@ -105,7 +105,7 @@ private static CommandLineFactory ResolveFactory(string[] args, ILogger logger) return null; } - private static bool TryWrapWithUsersLogger(ILogger logger, string[] args, out CombinedLogger combined) + private static bool TryWrapWithUsersLogger(ILogger logger, string[] args, out CombinedLogger? combined) { combined = null; var fileName = CommandLineParser.GetLogFileName(args); @@ -117,7 +117,7 @@ private static bool TryWrapWithUsersLogger(ILogger logger, string[] args, out Co ILogger fileLogger; try { - fileLogger = new FileLogger(fileName); + fileLogger = new FileLogger(fileName!); } catch (Exception ex) { @@ -134,7 +134,7 @@ private static string GetHelpFileName(string commandName) #if NET472 const string Runtime = ".net472"; #else - const string Runtime = null; + const string? Runtime = null; #endif return "CommandLine." + commandName + Runtime + ".txt"; } @@ -156,7 +156,7 @@ private static string LoadHelpContent(string fileName) } using (var stream = scope.Assembly.GetManifestResourceStream(resourceName)) - using (var reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream!)) { return reader.ReadToEnd(); } diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs index fdc12512..f848a83d 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Text; @@ -21,20 +22,21 @@ public ConsoleListener(ILogger logger) public override IFormatProvider FormatProvider => _original.FormatProvider; + [AllowNull] public override string NewLine { get => _original.NewLine; set => _original.NewLine = value; } - public override void Write(string value) + public override void Write(string? value) { - _logger.Info(value); + _logger.Info(value ?? string.Empty); } - public override void WriteLine(string value) + public override void WriteLine(string? value) { - _logger.Info(value); + _logger.Info(value ?? string.Empty); } protected override void Dispose(bool disposing) diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs index adaa929e..52ec0777 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs @@ -6,13 +6,20 @@ namespace SqlDatabase.Scripts.AssemblyInternal; internal sealed class DefaultEntryPoint : IEntryPoint { - public ILogger Log { get; set; } + public DefaultEntryPoint(ILogger log, object scriptInstance, Action> method) + { + Log = log; + ScriptInstance = scriptInstance; + Method = method; + } + + public ILogger Log { get; } - public object ScriptInstance { get; set; } + public object ScriptInstance { get; internal set; } - public Action> Method { get; set; } + public Action> Method { get; internal set; } - public bool Execute(IDbCommand command, IReadOnlyDictionary variables) + public bool Execute(IDbCommand command, IReadOnlyDictionary variables) { var result = false; diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs index b5e754ac..d6dab434 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs @@ -7,13 +7,20 @@ namespace SqlDatabase.Scripts.AssemblyInternal; internal sealed class EntryPointResolver { - public ILogger Log { get; set; } + public EntryPointResolver(ILogger log, string executorClassName, string executorMethodName) + { + Log = log; + ExecutorClassName = executorClassName; + ExecutorMethodName = executorMethodName; + } + + public ILogger Log { get; } - public string ExecutorClassName { get; set; } + public string ExecutorClassName { get; internal set; } - public string ExecutorMethodName { get; set; } + public string ExecutorMethodName { get; internal set; } - public IEntryPoint Resolve(Assembly assembly) + public IEntryPoint? Resolve(Assembly assembly) { Log.Info("resolve script executor"); @@ -24,10 +31,6 @@ public IEntryPoint Resolve(Assembly assembly) } var method = ResolveMethod(type); - if (method == null) - { - return null; - } var message = new StringBuilder() .AppendFormat("found {0}.{1}(", type.FullName, method.Method.Name); @@ -51,7 +54,7 @@ public IEntryPoint Resolve(Assembly assembly) object scriptInstance; try { - scriptInstance = Activator.CreateInstance(type); + scriptInstance = Activator.CreateInstance(type)!; } catch (Exception ex) { @@ -59,15 +62,10 @@ public IEntryPoint Resolve(Assembly assembly) return null; } - return new DefaultEntryPoint - { - Log = Log, - ScriptInstance = scriptInstance, - Method = method.Resolver.CreateDelegate(scriptInstance, method.Method) - }; + return new DefaultEntryPoint(Log, scriptInstance, method.Resolver.CreateDelegate(scriptInstance, method.Method)); } - private Type ResolveClass(Assembly assembly) + private Type? ResolveClass(Assembly assembly) { var filter = assembly .GetExportedTypes() @@ -120,19 +118,14 @@ private ExecuteMethodRef ResolveMethod(Type type) var resolver = methodResolvers[priority]; if (resolver.IsMatch(i)) { - return new ExecuteMethodRef - { - Method = i, - Resolver = resolver, - Priority = priority - }; + return new ExecuteMethodRef(priority, i, resolver); } } return null; }) .Where(i => i != null) - .OrderBy(i => i.Priority) + .OrderBy(i => i!.Priority) .ToList(); if (methods.Count == 0) @@ -140,15 +133,22 @@ private ExecuteMethodRef ResolveMethod(Type type) Log.Error("public void {0}(IDbCommand command, IReadOnlyDictionary variables) not found in {1}.".FormatWith(ExecutorMethodName, type)); } - return methods[0]; + return methods[0]!; } private sealed class ExecuteMethodRef { - public int Priority { get; set; } + public ExecuteMethodRef(int priority, MethodInfo method, ExecuteMethodResolverBase resolver) + { + Priority = priority; + Method = method; + Resolver = resolver; + } + + public int Priority { get; } - public MethodInfo Method { get; set; } + public MethodInfo Method { get; } - public ExecuteMethodResolverBase Resolver { get; set; } + public ExecuteMethodResolverBase Resolver { get; } } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs index bc060c01..63fb6b0b 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs @@ -9,5 +9,5 @@ internal abstract class ExecuteMethodResolverBase { public abstract bool IsMatch(MethodInfo method); - public abstract Action> CreateDelegate(object instance, MethodInfo method); + public abstract Action> CreateDelegate(object instance, MethodInfo method); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs index 978582f4..9c7e963f 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs @@ -15,7 +15,7 @@ public override bool IsMatch(MethodInfo method) && typeof(IDbCommand) == parameters[0].ParameterType; } - public override Action> CreateDelegate(object instance, MethodInfo method) + public override Action> CreateDelegate(object instance, MethodInfo method) { var execute = (Action)Delegate.CreateDelegate( typeof(Action), diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs index a442e25a..c471403d 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs @@ -16,10 +16,10 @@ public override bool IsMatch(MethodInfo method) && typeof(IReadOnlyDictionary) == parameters[1].ParameterType; } - public override Action> CreateDelegate(object instance, MethodInfo method) + public override Action> CreateDelegate(object instance, MethodInfo method) { - return (Action>)Delegate.CreateDelegate( - typeof(Action>), + return (Action>)Delegate.CreateDelegate( + typeof(Action>), instance, method); } diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs index b742838e..69dc8c9f 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs @@ -15,13 +15,13 @@ public override bool IsMatch(MethodInfo method) && typeof(IDbConnection) == parameters[0].ParameterType; } - public override Action> CreateDelegate(object instance, MethodInfo method) + public override Action> CreateDelegate(object instance, MethodInfo method) { var execute = (Action)Delegate.CreateDelegate( typeof(Action), instance, method); - return (command, variables) => execute(command.Connection); + return (command, _) => execute(command.Connection!); } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs index 3ca4bd7d..ca3ced47 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs @@ -16,10 +16,10 @@ public override bool IsMatch(MethodInfo method) && typeof(IDbCommand) == parameters[1].ParameterType; } - public override Action> CreateDelegate(object instance, MethodInfo method) + public override Action> CreateDelegate(object instance, MethodInfo method) { - var execute = (Action, IDbCommand>)Delegate.CreateDelegate( - typeof(Action, IDbCommand>), + var execute = (Action, IDbCommand>)Delegate.CreateDelegate( + typeof(Action, IDbCommand>), instance, method); diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs index 056b7653..5d2a18a4 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs @@ -16,13 +16,13 @@ public override bool IsMatch(MethodInfo method) && typeof(SqlConnection) == parameters[0].ParameterType; } - public override Action> CreateDelegate(object instance, MethodInfo method) + public override Action> CreateDelegate(object instance, MethodInfo method) { var execute = (Action)Delegate.CreateDelegate( typeof(Action), instance, method); - return (command, variables) => execute((SqlConnection)command.Connection); + return (command, _) => execute((SqlConnection)command.Connection!); } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs index 5377470b..c65e5705 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs @@ -5,5 +5,5 @@ namespace SqlDatabase.Scripts.AssemblyInternal; internal interface IEntryPoint { - bool Execute(IDbCommand command, IReadOnlyDictionary variables); + bool Execute(IDbCommand command, IReadOnlyDictionary variables); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs index bc7ed3a2..2a040197 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs @@ -5,12 +5,6 @@ namespace SqlDatabase.Scripts.AssemblyInternal; internal interface ISubDomain : IDisposable { - ILogger Logger { get; set; } - - string AssemblyFileName { get; set; } - - Func ReadAssemblyContent { get; set; } - void Initialize(); void Unload(); diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs index 43885132..3029116a 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs @@ -9,13 +9,13 @@ namespace SqlDatabase.Scripts.AssemblyInternal.Net472; internal sealed class DomainAgent : MarshalByRefObject { - private ConsoleListener _consoleRedirect; + private ConsoleListener? _consoleRedirect; - internal Assembly Assembly { get; set; } + internal Assembly? Assembly { get; set; } - internal IEntryPoint EntryPoint { get; set; } + internal IEntryPoint? EntryPoint { get; set; } - internal ILogger Logger { get; set; } + internal ILogger? Logger { get; set; } public void LoadAssembly(string fileName) { @@ -37,21 +37,16 @@ public bool ResolveScriptExecutor(string className, string methodName) return true; } - var resolver = new EntryPointResolver - { - Log = Logger, - ExecutorClassName = className, - ExecutorMethodName = methodName - }; + var resolver = new EntryPointResolver(Logger!, className, methodName); - EntryPoint = resolver.Resolve(Assembly); + EntryPoint = resolver.Resolve(Assembly!); return EntryPoint != null; } - public bool Execute(IDbCommand command, IReadOnlyDictionary variables) + public bool Execute(IDbCommand command, IReadOnlyDictionary variables) { - return EntryPoint.Execute(command, variables); + return EntryPoint!.Execute(command, variables); } public void BeforeUnload() @@ -60,17 +55,17 @@ public void BeforeUnload() AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve; } - private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) + private Assembly? OnAssemblyResolve(object? sender, ResolveEventArgs args) { var argName = new AssemblyName(args.Name).Name; - var sqlDataBase = GetType().Assembly; - if (sqlDataBase.GetName().Name.Equals(argName, StringComparison.OrdinalIgnoreCase)) + var sqlDataBase = GetType().Assembly!; + if (sqlDataBase.GetName().Name!.Equals(argName, StringComparison.OrdinalIgnoreCase)) { return sqlDataBase; } - var fileName = Path.Combine(Path.GetDirectoryName(sqlDataBase.Location), argName + ".dll"); + var fileName = Path.Combine(Path.GetDirectoryName(sqlDataBase.Location)!, argName + ".dll"); if (File.Exists(fileName)) { return Assembly.LoadFrom(fileName); diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs index acf9bbac..2b01a076 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs @@ -5,8 +5,8 @@ namespace SqlDatabase.Scripts.AssemblyInternal.Net472; internal sealed class LoggerProxy : TraceListener, ILogger { - private readonly TraceListener _output; - private readonly ILogger _input; + private readonly TraceListener? _output; + private readonly ILogger? _input; public LoggerProxy(ILogger input) { @@ -18,29 +18,29 @@ public LoggerProxy(TraceListener output) _output = output; } - public override void Write(string message) + public override void Write(string? message) { throw new NotSupportedException(); } - public override void WriteLine(string message) + public override void WriteLine(string? message) { - _input.Info(message); + _input?.Info(message ?? string.Empty); } - public override void Fail(string message) + public override void Fail(string? message) { - _input.Error(message); + _input?.Error(message!); } void ILogger.Error(string message) { - _output.Fail(message); + _output?.Fail(message); } - void ILogger.Info(string message) + void ILogger.Info(string? message) { - _output.WriteLine(message); + _output?.WriteLine(message); } IDisposable ILogger.Indent() diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs index dec797bb..116f6221 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs @@ -3,70 +3,76 @@ using System.Data; using System.IO; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472 -{ - internal sealed class Net472SubDomain : ISubDomain - { - private DomainDirectory _appBase; - private AppDomain _app; - private DomainAgent _appAgent; +namespace SqlDatabase.Scripts.AssemblyInternal.Net472; - public ILogger Logger { get; set; } - - public string AssemblyFileName { get; set; } +internal sealed class Net472SubDomain : ISubDomain +{ + private DomainDirectory? _appBase; + private AppDomain? _app; + private DomainAgent? _appAgent; - public Func ReadAssemblyContent { get; set; } + public Net472SubDomain(ILogger logger, string assemblyFileName, Func readAssemblyContent) + { + Logger = logger; + AssemblyFileName = assemblyFileName; + ReadAssemblyContent = readAssemblyContent; + } - public void Initialize() - { - Logger.Info("create domain for {0}".FormatWith(AssemblyFileName)); + public ILogger Logger { get; } - var appBaseName = Path.GetFileName(AssemblyFileName); - _appBase = new DomainDirectory(Logger); + public string AssemblyFileName { get; } - var entryAssembly = _appBase.SaveFile(ReadAssemblyContent(), appBaseName); + public Func ReadAssemblyContent { get; } - var setup = new AppDomainSetup - { - ApplicationBase = _appBase.Location, - ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, - LoaderOptimization = LoaderOptimization.MultiDomainHost - }; + public void Initialize() + { + Logger.Info("create domain for {0}".FormatWith(AssemblyFileName)); - _app = AppDomain.CreateDomain(appBaseName, null, setup); - _appAgent = (DomainAgent)_app.CreateInstanceFromAndUnwrap(GetType().Assembly.Location, typeof(DomainAgent).FullName); + var appBaseName = Path.GetFileName(AssemblyFileName); + _appBase = new DomainDirectory(Logger); - _appAgent.RedirectConsoleOut(new LoggerProxy(Logger)); - _appAgent.LoadAssembly(entryAssembly); - } + var entryAssembly = _appBase.SaveFile(ReadAssemblyContent(), appBaseName); - public void Unload() + var setup = new AppDomainSetup { - _appAgent?.BeforeUnload(); + ApplicationBase = _appBase.Location, + ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, + LoaderOptimization = LoaderOptimization.MultiDomainHost + }; - if (_app != null) - { - AppDomain.Unload(_app); - } + _app = AppDomain.CreateDomain(appBaseName, null, setup); + _appAgent = (DomainAgent)_app.CreateInstanceFromAndUnwrap(GetType().Assembly.Location, typeof(DomainAgent).FullName); - _app = null; - _appAgent = null; - } + _appAgent.RedirectConsoleOut(new LoggerProxy(Logger)); + _appAgent.LoadAssembly(entryAssembly); + } - public bool ResolveScriptExecutor(string className, string methodName) - { - return _appAgent.ResolveScriptExecutor(className, methodName); - } + public void Unload() + { + _appAgent?.BeforeUnload(); - public bool Execute(IDbCommand command, IVariables variables) + if (_app != null) { - return _appAgent.Execute(command, new VariablesProxy(variables)); + AppDomain.Unload(_app); } - public void Dispose() - { - _appBase?.Dispose(); - } + _app = null; + _appAgent = null; + } + + public bool ResolveScriptExecutor(string className, string methodName) + { + return _appAgent != null && _appAgent.ResolveScriptExecutor(className, methodName); + } + + public bool Execute(IDbCommand command, IVariables variables) + { + return _appAgent!.Execute(command, new VariablesProxy(variables)); + } + + public void Dispose() + { + _appBase?.Dispose(); } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs index b1b283e1..c73ea22f 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs @@ -4,30 +4,30 @@ using System.Reflection; using System.Runtime.Loader; -namespace SqlDatabase.Scripts.AssemblyInternal.NetCore +namespace SqlDatabase.Scripts.AssemblyInternal.NetCore; + +internal sealed class AssemblyContext : AssemblyLoadContext { - internal sealed class AssemblyContext : AssemblyLoadContext - { - public Assembly ScriptAssembly { get; private set; } + public Assembly? ScriptAssembly { get; private set; } - public void LoadScriptAssembly(byte[] assemblyContent) + public void LoadScriptAssembly(byte[] assemblyContent) + { + using (var stream = new MemoryStream(assemblyContent)) { - using (var stream = new MemoryStream(assemblyContent)) - { - ScriptAssembly = LoadFromStream(stream); - } + ScriptAssembly = LoadFromStream(stream); } + } - public void UnloadAll() - { - ScriptAssembly = null; - } + public void UnloadAll() + { + ScriptAssembly = null; + } - protected override Assembly Load(AssemblyName assemblyName) - { - var isScriptAssembly = assemblyName.Name.Equals(ScriptAssembly.GetName().Name, StringComparison.OrdinalIgnoreCase); - return isScriptAssembly ? ScriptAssembly : null; - } + protected override Assembly? Load(AssemblyName assemblyName) + { + var isScriptAssembly = assemblyName.Name != null + && assemblyName.Name.Equals(ScriptAssembly?.GetName().Name, StringComparison.OrdinalIgnoreCase); + return isScriptAssembly ? ScriptAssembly : null; } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs index 7cab6bce..ad87ae34 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs @@ -2,57 +2,64 @@ using System; using System.Data; -namespace SqlDatabase.Scripts.AssemblyInternal.NetCore +namespace SqlDatabase.Scripts.AssemblyInternal.NetCore; + +internal sealed class NetCoreSubDomain : ISubDomain { - internal sealed class NetCoreSubDomain : ISubDomain + private readonly AssemblyContext _assemblyContext; + ////private ConsoleListener _consoleRedirect; + + public NetCoreSubDomain(ILogger logger, string assemblyFileName, Func readAssemblyContent) { - private readonly AssemblyContext _assemblyContext = new AssemblyContext(); - ////private ConsoleListener _consoleRedirect; + Logger = logger; + AssemblyFileName = assemblyFileName; + ReadAssemblyContent = readAssemblyContent; + _assemblyContext = new AssemblyContext(); + } - public ILogger Logger { get; set; } + public ILogger Logger { get; set; } - public string AssemblyFileName { get; set; } + public string AssemblyFileName { get; set; } - public Func ReadAssemblyContent { get; set; } + public Func ReadAssemblyContent { get; set; } - private IEntryPoint EntryPoint { get; set; } + private IEntryPoint? EntryPoint { get; set; } - public void Initialize() - { - _assemblyContext.LoadScriptAssembly(ReadAssemblyContent()); + public void Initialize() + { + _assemblyContext.LoadScriptAssembly(ReadAssemblyContent()); - ////_consoleRedirect = new ConsoleListener(Logger); - } + ////_consoleRedirect = new ConsoleListener(Logger); + } - public void Unload() - { - ////_consoleRedirect?.Dispose(); + public void Unload() + { + ////_consoleRedirect?.Dispose(); - _assemblyContext.UnloadAll(); - } + _assemblyContext.UnloadAll(); + } - public bool ResolveScriptExecutor(string className, string methodName) + public bool ResolveScriptExecutor(string className, string methodName) + { + if (_assemblyContext.ScriptAssembly == null) { - var resolver = new EntryPointResolver - { - Log = Logger, - ExecutorClassName = className, - ExecutorMethodName = methodName - }; + return false; + } - EntryPoint = resolver.Resolve(_assemblyContext.ScriptAssembly); + var resolver = new EntryPointResolver(Logger, className, methodName); - return EntryPoint != null; - } + EntryPoint = resolver.Resolve(_assemblyContext.ScriptAssembly); - public bool Execute(IDbCommand command, IVariables variables) - { - return EntryPoint.Execute(command, new VariablesProxy(variables)); - } + return EntryPoint != null; + } - public void Dispose() - { - } + public bool Execute(IDbCommand command, IVariables variables) + { + return EntryPoint!.Execute(command, new VariablesProxy(variables)); + } + + public void Dispose() + { } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs b/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs index ca1d1f74..f38c8bd8 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs @@ -1,10 +1,11 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace SqlDatabase.Scripts.AssemblyInternal; -internal sealed class VariablesProxy : MarshalByRefObject, IReadOnlyDictionary +internal sealed class VariablesProxy : MarshalByRefObject, IReadOnlyDictionary { private readonly IVariables _variables; @@ -19,20 +20,20 @@ public VariablesProxy(IVariables variables) public IEnumerable Values => throw new NotSupportedException(); - public string this[string key] => _variables.GetValue(key); + public string? this[string key] => _variables.GetValue(key); public bool ContainsKey(string key) { return _variables.GetValue(key) != null; } - public bool TryGetValue(string key, out string value) + public bool TryGetValue(string key, [NotNullWhen(true)] out string? value) { value = _variables.GetValue(key); return value != null; } - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { throw new NotSupportedException(); } diff --git a/Sources/SqlDatabase/Scripts/AssemblyScript.cs b/Sources/SqlDatabase/Scripts/AssemblyScript.cs index 0d1acc9b..dd496501 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyScript.cs +++ b/Sources/SqlDatabase/Scripts/AssemblyScript.cs @@ -10,24 +10,32 @@ namespace SqlDatabase.Scripts; internal sealed class AssemblyScript : IScript { + public AssemblyScript( + string displayName, + Func readAssemblyContent, + Func readDescriptionContent, + AssemblyScriptConfiguration configuration) + { + DisplayName = displayName; + ReadAssemblyContent = readAssemblyContent; + ReadDescriptionContent = readDescriptionContent; + Configuration = configuration; + } + public string DisplayName { get; set; } - public Func ReadAssemblyContent { get; set; } + public Func ReadAssemblyContent { get; internal set; } - public Func ReadDescriptionContent { get; set; } + public Func ReadDescriptionContent { get; internal set; } - public AssemblyScriptConfiguration Configuration { get; set; } + public AssemblyScriptConfiguration Configuration { get; } - public void Execute(IDbCommand command, IVariables variables, ILogger logger) + public void Execute(IDbCommand? command, IVariables variables, ILogger logger) { - var domain = CreateSubDomain(); + var domain = CreateSubDomain(logger); using (domain) { - domain.Logger = logger; - domain.AssemblyFileName = DisplayName; - domain.ReadAssemblyContent = ReadAssemblyContent; - try { domain.Initialize(); @@ -52,7 +60,7 @@ public IList GetDependencies() { if (description == null) { - return new ScriptDependency[0]; + return Array.Empty(); } using (var reader = new StreamReader(description)) @@ -70,7 +78,7 @@ internal void ResolveScriptExecutor(ISubDomain domain) } } - internal void Execute(ISubDomain domain, IDbCommand command, IVariables variables) + internal void Execute(ISubDomain domain, IDbCommand? command, IVariables variables) { if (command != null && !domain.Execute(command, variables)) { @@ -78,12 +86,12 @@ internal void Execute(ISubDomain domain, IDbCommand command, IVariables variable } } - private ISubDomain CreateSubDomain() + private ISubDomain CreateSubDomain(ILogger logger) { #if NET472 - return new AssemblyInternal.Net472.Net472SubDomain(); + return new AssemblyInternal.Net472.Net472SubDomain(logger, DisplayName, ReadAssemblyContent); #else - return new AssemblyInternal.NetCore.NetCoreSubDomain(); + return new AssemblyInternal.NetCore.NetCoreSubDomain(logger, DisplayName, ReadAssemblyContent); #endif } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs index fc7bea44..e8ef79d9 100644 --- a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs @@ -7,9 +7,15 @@ namespace SqlDatabase.Scripts; internal sealed class CreateScriptSequence : ICreateScriptSequence { - public IList Sources { get; set; } + public CreateScriptSequence(IList sources, IScriptFactory scriptFactory) + { + Sources = sources; + ScriptFactory = scriptFactory; + } + + public IList Sources { get; } - public IScriptFactory ScriptFactory { get; set; } + public IScriptFactory ScriptFactory { get; } public IList BuildSequence() { @@ -32,7 +38,7 @@ public IList BuildSequence() private static void Build( IFolder root, - string fullPath, + string? fullPath, IScriptFactory factory, List scripts) { diff --git a/Sources/SqlDatabase/Scripts/Database.cs b/Sources/SqlDatabase/Scripts/Database.cs index 9281be8f..5c58df4b 100644 --- a/Sources/SqlDatabase/Scripts/Database.cs +++ b/Sources/SqlDatabase/Scripts/Database.cs @@ -8,22 +8,26 @@ namespace SqlDatabase.Scripts; internal sealed class Database : IDatabase { - public Database() + public Database(IDatabaseAdapter adapter, ILogger log, TransactionMode transaction, bool whatIf) { + Adapter = adapter; + Log = log; + Transaction = transaction; + WhatIf = whatIf; Variables = new Variables(); } - public IDatabaseAdapter Adapter { get; set; } + public IDatabaseAdapter Adapter { get; } - public ILogger Log { get; set; } + public ILogger Log { get; } - public TransactionMode Transaction { get; set; } + public TransactionMode Transaction { get; internal set; } - public bool WhatIf { get; set; } + public bool WhatIf { get; internal set; } internal Variables Variables { get; } - public Version GetCurrentVersion(string moduleName) + public Version GetCurrentVersion(string? moduleName) { Variables.ModuleName = moduleName; @@ -45,7 +49,7 @@ public string GetServerVersion() command.CommandText = Adapter.GetServerVersionSelectScript(); connection.Open(); - return Convert.ToString(command.ExecuteScalar()); + return Convert.ToString(command.ExecuteScalar())!; } } @@ -129,7 +133,7 @@ private Version ReadCurrentVersion(IDbCommand command) var script = new SqlScriptVariableParser(Variables).ApplyVariables(Adapter.GetVersionSelectScript()); command.CommandText = script; - string version; + string? version; try { version = Convert.ToString(command.ExecuteScalar()); @@ -183,7 +187,7 @@ private void InvokeExecute(IScript script) command.CommandTimeout = 0; connection.Open(); - command.CommandText = Adapter.GetDatabaseExistsScript(Variables.DatabaseName); + command.CommandText = Adapter.GetDatabaseExistsScript(Variables.DatabaseName!); var value = command.ExecuteScalar(); useMaster = value == null || Convert.IsDBNull(value); diff --git a/Sources/SqlDatabase/Scripts/DependencyParser.cs b/Sources/SqlDatabase/Scripts/DependencyParser.cs index 4161bead..bf0d8cee 100644 --- a/Sources/SqlDatabase/Scripts/DependencyParser.cs +++ b/Sources/SqlDatabase/Scripts/DependencyParser.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; -using System.Text; using System.Text.RegularExpressions; namespace SqlDatabase.Scripts; @@ -12,7 +12,7 @@ internal static class DependencyParser public static IEnumerable ExtractDependencies(TextReader reader, string scriptName) { - string line; + string? line; while ((line = reader.ReadLine()) != null) { if (TryParseDependencyLine(line, out var moduleName, out var versionText)) @@ -27,7 +27,10 @@ public static IEnumerable ExtractDependencies(TextReader reade } } - private static bool TryParseDependencyLine(string line, out string moduleName, out string version) + private static bool TryParseDependencyLine( + string line, + [NotNullWhen(true)] out string? moduleName, + [NotNullWhen(true)] out string? version) { moduleName = null; version = null; diff --git a/Sources/SqlDatabase/Scripts/IDatabase.cs b/Sources/SqlDatabase/Scripts/IDatabase.cs index 0f75c7ed..462ff7bb 100644 --- a/Sources/SqlDatabase/Scripts/IDatabase.cs +++ b/Sources/SqlDatabase/Scripts/IDatabase.cs @@ -10,7 +10,7 @@ internal interface IDatabase string GetServerVersion(); - Version GetCurrentVersion(string moduleName); + Version GetCurrentVersion(string? moduleName); void Execute(IScript script, string moduleName, Version currentVersion, Version targetVersion); diff --git a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs b/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs index f68528f5..6a61091e 100644 --- a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs +++ b/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs @@ -4,7 +4,7 @@ namespace SqlDatabase.Scripts; internal interface IPowerShellFactory { - string InstallationPath { get; } + string? InstallationPath { get; } void Request(); diff --git a/Sources/SqlDatabase/Scripts/IScript.cs b/Sources/SqlDatabase/Scripts/IScript.cs index 2cd6ce71..c4118f61 100644 --- a/Sources/SqlDatabase/Scripts/IScript.cs +++ b/Sources/SqlDatabase/Scripts/IScript.cs @@ -7,7 +7,7 @@ public interface IScript { string DisplayName { get; set; } - void Execute(IDbCommand command, IVariables variables, ILogger logger); + void Execute(IDbCommand? command, IVariables variables, ILogger logger); IEnumerable ExecuteReader(IDbCommand command, IVariables variables, ILogger logger); diff --git a/Sources/SqlDatabase/Scripts/ISqlTextReader.cs b/Sources/SqlDatabase/Scripts/ISqlTextReader.cs index 1985cee0..8e1beedb 100644 --- a/Sources/SqlDatabase/Scripts/ISqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/ISqlTextReader.cs @@ -5,7 +5,7 @@ namespace SqlDatabase.Scripts; internal interface ISqlTextReader { - string ReadFirstBatch(Stream sql); + string? ReadFirstBatch(Stream sql); IEnumerable ReadBatches(Stream sql); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/IVariables.cs b/Sources/SqlDatabase/Scripts/IVariables.cs index f814e8e7..75917c50 100644 --- a/Sources/SqlDatabase/Scripts/IVariables.cs +++ b/Sources/SqlDatabase/Scripts/IVariables.cs @@ -2,5 +2,5 @@ public interface IVariables { - string GetValue(string name); + string? GetValue(string name); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs b/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs index 6c49231c..ad15e265 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs @@ -10,7 +10,7 @@ internal sealed class MsSqlTextReader : ISqlTextReader { private readonly Regex _goRegex = new Regex("^(\\s*(go)+\\s*)+$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public string ReadFirstBatch(Stream sql) + public string? ReadFirstBatch(Stream sql) { return ReadBatches(sql).FirstOrDefault(); } @@ -52,7 +52,7 @@ private static IEnumerable ReadLines(Stream sql) { using (var reader = new StreamReader(sql)) { - string line; + string? line; while ((line = reader.ReadLine()) != null) { yield return line; diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs b/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs index 1df7ab2f..175c8e0b 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs +++ b/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs @@ -44,7 +44,7 @@ public override SqlWriterBase BatchSeparator() public override SqlWriterBase DataType(string typeName, int size, int precision, int scale) { var name = typeName.ToUpperInvariant(); - string sizeText = null; + string? sizeText = null; switch (name) { @@ -100,7 +100,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, public override ExportTable ReadSchemaTable(DataTable metadata, string tableName) { - var result = new ExportTable { Name = tableName }; + var result = new ExportTable(tableName); const string GeneratedName = "GeneratedName"; var generatedIndex = 0; @@ -146,7 +146,7 @@ public override ExportTable ReadSchemaTable(DataTable metadata, string tableName public override string GetDefaultTableName() => "dbo.SqlDatabaseExport"; - protected override bool TryWriteValue(object value, string typeNameHint) + protected override bool TryWriteValue(object value, string? typeNameHint) { var type = value.GetType(); diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs index b73be41b..68c714f8 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; @@ -10,13 +11,13 @@ internal sealed class MySqlTextReader : ISqlTextReader private const int MaxFirstBatchSize = 20; private readonly Regex _semicolonRegex = new Regex("^(\\s*;+\\s*)+$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public string ReadFirstBatch(Stream sql) + public string? ReadFirstBatch(Stream sql) { var script = new StringBuilder(); using (var reader = new StreamReader(sql)) { - string line; + string? line; var lineNumber = 0; while ((line = reader.ReadLine()) != null) { @@ -53,7 +54,7 @@ public IEnumerable ReadBatches(Stream sql) if (string.IsNullOrWhiteSpace(script)) { - return new string[0]; + return Array.Empty(); } return new[] { script }; diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs index 0feac799..15b53fa7 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs @@ -32,7 +32,7 @@ public override SqlWriterBase BatchSeparator() public override SqlWriterBase DataType(string typeName, int size, int precision, int scale) { var name = typeName.ToUpperInvariant(); - string sizeText = null; + string? sizeText = null; switch (name) { @@ -94,7 +94,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, public override ExportTable ReadSchemaTable(DataTable metadata, string tableName) { - var result = new ExportTable { Name = tableName }; + var result = new ExportTable(tableName); const string GeneratedName = "GeneratedName"; var generatedIndex = 0; @@ -126,7 +126,7 @@ public override ExportTable ReadSchemaTable(DataTable metadata, string tableName return result; } - protected override bool TryWriteValue(object value, string typeNameHint) + protected override bool TryWriteValue(object value, string? typeNameHint) { var type = value.GetType(); diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs index cb06f215..d549258f 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs @@ -11,13 +11,13 @@ internal sealed class PgSqlTextReader : ISqlTextReader private const int MaxFirstBatchSize = 20; private readonly Regex _semicolonRegex = new Regex("^(\\s*;+\\s*)+$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public string ReadFirstBatch(Stream sql) + public string? ReadFirstBatch(Stream sql) { var script = new StringBuilder(); using (var reader = new StreamReader(sql)) { - string line; + string? line; var lineNumber = 0; while ((line = reader.ReadLine()) != null) { @@ -54,7 +54,7 @@ public IEnumerable ReadBatches(Stream sql) if (string.IsNullOrWhiteSpace(script)) { - return new string[0]; + return Array.Empty(); } return new[] { script }; diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs index 838ce2ef..d45f78ac 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs @@ -35,7 +35,7 @@ public override SqlWriterBase BatchSeparator() public override SqlWriterBase DataType(string typeName, int size, int precision, int scale) { var name = typeName.ToUpperInvariant(); - string sizeText = null; + string? sizeText = null; switch (name) { @@ -81,7 +81,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, public override ExportTable ReadSchemaTable(DataTable metadata, string tableName) { - var result = new ExportTable { Name = tableName }; + var result = new ExportTable(tableName); const string GeneratedName = "GeneratedName"; var generatedIndex = 0; @@ -115,7 +115,7 @@ public override ExportTable ReadSchemaTable(DataTable metadata, string tableName public override string GetDefaultTableName() => "public.sqldatabase_export"; - protected override bool TryWriteValue(object value, string typeNameHint) + protected override bool TryWriteValue(object value, string? typeNameHint) { var type = value.GetType(); @@ -235,7 +235,7 @@ protected override bool TryWriteValue(object value, string typeNameHint) if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(NpgsqlRange<>)) { GetType() - .GetMethod(nameof(ValueRange), BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly) + .GetMethod(nameof(ValueRange), BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)! .MakeGenericMethod(type.GenericTypeArguments) .Invoke(this, new[] { value }); return true; @@ -389,7 +389,7 @@ private void CollectLexeme(NpgsqlTsQuery value, IDictionary value) + private void ValueComposite(IDictionary value) { Output.Write("ROW("); diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs index e68d17e6..e6794fd6 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs @@ -10,7 +10,7 @@ internal static class DiagnosticsTools public static bool IsOSPlatformWindows() { #if NET472 - return true; + return true; #else return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); #endif @@ -19,7 +19,7 @@ public static bool IsOSPlatformWindows() public static int? GetParentProcessId(int processId) { #if NET472 - return null; + return null; #else return IsOSPlatformWindows() ? GetParentProcessIdWindows(processId) : GetParentProcessIdLinux(processId); #endif @@ -27,7 +27,7 @@ public static bool IsOSPlatformWindows() internal static int? ParseParentProcessIdLinux(string fileName) { - string line = null; + string? line = null; try { @@ -47,7 +47,7 @@ public static bool IsOSPlatformWindows() } // (2) comm %s: The filename of the executable, in parentheses. - var startIndex = line.LastIndexOf(')'); + var startIndex = line!.LastIndexOf(')'); if (startIndex <= 0 || startIndex >= line.Length) { return null; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs index 4de3ab45..1837dd77 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs @@ -6,5 +6,5 @@ internal interface IPowerShell { bool SupportsShouldProcess(string script); - void Invoke(string script, ILogger logger, params KeyValuePair[] parameters); + void Invoke(string script, ILogger logger, params KeyValuePair[] parameters); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs index 65792f8b..07f048cd 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; namespace SqlDatabase.Scripts.PowerShellInternal; @@ -10,7 +11,7 @@ internal static class InstallationSeeker public const string RootAssemblyName = "System.Management.Automation"; public const string RootAssemblyFileName = RootAssemblyName + ".dll"; - public static bool TryFindByParentProcess(out string installationPath) + public static bool TryFindByParentProcess([NotNullWhen(true)] out string? installationPath) { int processId; DateTime processStartTime; @@ -22,11 +23,11 @@ public static bool TryFindByParentProcess(out string installationPath) installationPath = FindPowerShellProcess(processId, processStartTime); return !string.IsNullOrEmpty(installationPath) - && TryGetInfo(installationPath, out var info) + && TryGetInfo(installationPath!, out var info) && IsCompatibleVersion(info.Version); } - public static bool TryFindOnDisk(out string installationPath) + public static bool TryFindOnDisk([NotNullWhen(true)] out string? installationPath) { installationPath = null; var root = GetDefaultInstallationRoot(); @@ -80,7 +81,7 @@ public static bool TryGetInfo(string installationPath, out InstallationInfo info return true; } - private static string FindPowerShellProcess(int processId, DateTime processStartTime) + private static string? FindPowerShellProcess(int processId, DateTime processStartTime) { var parentId = DiagnosticsTools.GetParentProcessId(processId); if (!parentId.HasValue || parentId == processId) @@ -88,7 +89,7 @@ private static string FindPowerShellProcess(int processId, DateTime processStart return null; } - string parentLocation = null; + string? parentLocation = null; try { using (var parent = Process.GetProcessById(parentId.Value)) diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs index 0c00d4e0..5e5d54fc 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs @@ -21,7 +21,7 @@ public bool SupportsShouldProcess(string script) return false; } - public void Invoke(string script, ILogger logger, params KeyValuePair[] parameters) + public void Invoke(string script, ILogger logger, params KeyValuePair[] parameters) { var sessionState = InitialSessionState.CreateDefault(); using (var runSpace = RunspaceFactory.CreateRunspace(sessionState)) diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs index eb39a55e..aad83e5f 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs @@ -7,17 +7,17 @@ internal sealed partial class PowerShellFactory : IPowerShellFactory private bool _requested; private bool _initialized; - private PowerShellFactory(string installationPath) + private PowerShellFactory(string? installationPath) { InstallationPath = installationPath; } - public string InstallationPath { get; private set; } + public string? InstallationPath { get; private set; } // only for tests - internal static IPowerShellFactory SharedTestFactory { get; set; } + internal static IPowerShellFactory? SharedTestFactory { get; set; } - public static IPowerShellFactory Create(string installationPath) + public static IPowerShellFactory Create(string? installationPath) { if (SharedTestFactory != null) { diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs index 143e9388..097665ec 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs @@ -7,95 +7,94 @@ using System.Runtime.Loader; using SqlDatabase.Configuration; -namespace SqlDatabase.Scripts.PowerShellInternal +namespace SqlDatabase.Scripts.PowerShellInternal; + +// https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell +internal partial class PowerShellFactory { - // https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell - internal partial class PowerShellFactory + partial void DoInitialize(ILogger logger) { - partial void DoInitialize(ILogger logger) + if (string.IsNullOrEmpty(InstallationPath)) { - if (string.IsNullOrEmpty(InstallationPath)) - { - if (InstallationSeeker.TryFindByParentProcess(out var test)) - { - InstallationPath = test; - } - else if (InstallationSeeker.TryFindOnDisk(out test)) - { - InstallationPath = test; - } - } - - if (string.IsNullOrEmpty(InstallationPath)) + if (InstallationSeeker.TryFindByParentProcess(out var test)) { - throw new InvalidOperationException("PowerShell Core installation not found, please provide installation path via command line options {0}{1}.".FormatWith(Arg.Sign, Arg.UsePowerShell)); + InstallationPath = test; } - - if (!InstallationSeeker.TryGetInfo(InstallationPath, out var info)) + else if (InstallationSeeker.TryFindOnDisk(out test)) { - throw new InvalidOperationException("PowerShell Core installation not found in {0}.".FormatWith(InstallationPath)); + InstallationPath = test; } + } - logger.Info("host PowerShell from {0}, version {1}".FormatWith(InstallationPath, info.ProductVersion)); + if (string.IsNullOrEmpty(InstallationPath)) + { + throw new InvalidOperationException("PowerShell Core installation not found, please provide installation path via command line options {0}{1}.".FormatWith(Arg.Sign, Arg.UsePowerShell)); + } - AssemblyLoadContext.Default.Resolving += AssemblyResolving; - try - { - Test(logger); - } - catch (Exception ex) - { - throw new InvalidOperationException("PowerShell host initialization failed. Try to use another PowerShell Core installation.", ex); - } - finally - { - AssemblyLoadContext.Default.Resolving -= AssemblyResolving; - } + if (!InstallationSeeker.TryGetInfo(InstallationPath, out var info)) + { + throw new InvalidOperationException("PowerShell Core installation not found in {0}.".FormatWith(InstallationPath)); } - private void Test(ILogger logger) + logger.Info("host PowerShell from {0}, version {1}".FormatWith(InstallationPath, info.ProductVersion)); + + AssemblyLoadContext.Default.Resolving += AssemblyResolving; + try { - SetPowerShellAssemblyLoadContext(); + Test(logger); + } + catch (Exception ex) + { + throw new InvalidOperationException("PowerShell host initialization failed. Try to use another PowerShell Core installation.", ex); + } + finally + { + AssemblyLoadContext.Default.Resolving -= AssemblyResolving; + } + } - using (logger.Indent()) - { - const string Script = @" + private void Test(ILogger logger) + { + SetPowerShellAssemblyLoadContext(); + + using (logger.Indent()) + { + const string Script = @" Write-Host ""PSVersion:"" $PSVersionTable.PSVersion Write-Host ""PSEdition:"" $PSVersionTable.PSEdition Write-Host ""OS:"" $PSVersionTable.OS"; - Create().Invoke(Script, logger); - } + Create().Invoke(Script, logger); } + } - private Assembly AssemblyResolving(AssemblyLoadContext context, AssemblyName assemblyName) + private Assembly? AssemblyResolving(AssemblyLoadContext context, AssemblyName assemblyName) + { + if (InstallationSeeker.RootAssemblyName.Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase)) { - if (InstallationSeeker.RootAssemblyName.Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase)) - { - var fileName = Path.Combine(InstallationPath, InstallationSeeker.RootAssemblyFileName); - return context.LoadFromAssemblyPath(fileName); - } + var fileName = Path.Combine(InstallationPath!, InstallationSeeker.RootAssemblyFileName); + return context.LoadFromAssemblyPath(fileName); + } - // https://github.com/PowerShell/PowerShell/releases/download/v7.0.5/powershell_7.0.5-1.debian.10_amd64.deb - // Could not load file or assembly 'Microsoft.Management.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified. - // package contains Microsoft.Management.Infrastructure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null - if ("Microsoft.Management.Infrastructure".Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase)) + // https://github.com/PowerShell/PowerShell/releases/download/v7.0.5/powershell_7.0.5-1.debian.10_amd64.deb + // Could not load file or assembly 'Microsoft.Management.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified. + // package contains Microsoft.Management.Infrastructure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null + if ("Microsoft.Management.Infrastructure".Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase)) + { + var fileName = Path.Combine(InstallationPath!, assemblyName.Name + ".dll"); + if (File.Exists(fileName)) { - var fileName = Path.Combine(InstallationPath, assemblyName.Name + ".dll"); - if (File.Exists(fileName)) - { - return context.LoadFromAssemblyPath(fileName); - } + return context.LoadFromAssemblyPath(fileName); } - - return null; } - [MethodImpl(MethodImplOptions.NoInlining)] - private void SetPowerShellAssemblyLoadContext() - { - PowerShellAssemblyLoadContextInitializer.SetPowerShellAssemblyLoadContext(InstallationPath); - } + return null; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void SetPowerShellAssemblyLoadContext() + { + PowerShellAssemblyLoadContextInitializer.SetPowerShellAssemblyLoadContext(InstallationPath); } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs index b8232af4..97f076c0 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs @@ -38,7 +38,7 @@ private static IList GetInformation(PSDataStreams streams) #if !NET472 return streams.Information; #else - return ReflectionGetInformation(streams); + return ReflectionGetInformation(streams); #endif } @@ -47,7 +47,7 @@ private static IList ReflectionGetInformation(PSDataStreams streams) return (IList)streams .GetType() .FindProperty("Information") - .GetValue(streams, null); + .GetValue(streams, null)!; } private static void InvokeDataAdded(object dataCollection, EventHandler handler, bool subscribe) @@ -58,32 +58,32 @@ private static void InvokeDataAdded(object dataCollection, EventHandler readScriptContent, + Func readDescriptionContent, + IPowerShellFactory powerShellFactory) + { + DisplayName = displayName; + ReadScriptContent = readScriptContent; + ReadDescriptionContent = readDescriptionContent; + PowerShellFactory = powerShellFactory; + } + public string DisplayName { get; set; } - public Func ReadScriptContent { get; set; } + public Func ReadScriptContent { get; internal set; } - public Func ReadDescriptionContent { get; set; } + public Func ReadDescriptionContent { get; internal set; } - public IPowerShellFactory PowerShellFactory { get; set; } + public IPowerShellFactory PowerShellFactory { get; } - public void Execute(IDbCommand command, IVariables variables, ILogger logger) + public void Execute(IDbCommand? command, IVariables variables, ILogger logger) { string script; using (var stream = ReadScriptContent()) @@ -52,7 +64,7 @@ public IList GetDependencies() { if (description == null) { - return new ScriptDependency[0]; + return Array.Empty(); } using (var reader = new StreamReader(description)) @@ -62,14 +74,14 @@ public IList GetDependencies() } } - private static void Invoke(IPowerShell powerShell, string script, IDbCommand command, IVariables variables, ILogger logger, bool whatIf) + private static void Invoke(IPowerShell powerShell, string script, IDbCommand? command, IVariables variables, ILogger logger, bool whatIf) { - var parameters = new KeyValuePair[2 + (whatIf ? 1 : 0)]; - parameters[0] = new KeyValuePair(ParameterCommand, command); - parameters[1] = new KeyValuePair(ParameterVariables, new VariablesProxy(variables)); + var parameters = new KeyValuePair[2 + (whatIf ? 1 : 0)]; + parameters[0] = new KeyValuePair(ParameterCommand, command); + parameters[1] = new KeyValuePair(ParameterVariables, new VariablesProxy(variables)); if (whatIf) { - parameters[2] = new KeyValuePair(ParameterWhatIf, null); + parameters[2] = new KeyValuePair(ParameterWhatIf, null); } powerShell.Invoke(script, logger, parameters); diff --git a/Sources/SqlDatabase/Scripts/ScriptDependency.cs b/Sources/SqlDatabase/Scripts/ScriptDependency.cs index 937f4daf..f14ba915 100644 --- a/Sources/SqlDatabase/Scripts/ScriptDependency.cs +++ b/Sources/SqlDatabase/Scripts/ScriptDependency.cs @@ -20,7 +20,7 @@ public bool Equals(ScriptDependency other) && Version == other.Version; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { return obj is ScriptDependency d && Equals(d); } diff --git a/Sources/SqlDatabase/Scripts/ScriptFactory.cs b/Sources/SqlDatabase/Scripts/ScriptFactory.cs index 892f0455..a5092077 100644 --- a/Sources/SqlDatabase/Scripts/ScriptFactory.cs +++ b/Sources/SqlDatabase/Scripts/ScriptFactory.cs @@ -8,11 +8,18 @@ namespace SqlDatabase.Scripts; internal sealed class ScriptFactory : IScriptFactory { - public AssemblyScriptConfiguration AssemblyScriptConfiguration { get; set; } + public ScriptFactory(AssemblyScriptConfiguration assemblyScriptConfiguration, IPowerShellFactory? powerShellFactory, ISqlTextReader textReader) + { + AssemblyScriptConfiguration = assemblyScriptConfiguration; + PowerShellFactory = powerShellFactory; + TextReader = textReader; + } + + public AssemblyScriptConfiguration AssemblyScriptConfiguration { get; } - public IPowerShellFactory PowerShellFactory { get; set; } + public IPowerShellFactory? PowerShellFactory { get; internal set; } - public ISqlTextReader TextReader { get; set; } + public ISqlTextReader TextReader { get; } public bool IsSupported(string fileName) { @@ -30,24 +37,17 @@ public IScript FromFile(IFile file) if (".sql".Equals(ext, StringComparison.OrdinalIgnoreCase)) { - return new TextScript - { - DisplayName = file.Name, - ReadSqlContent = file.OpenRead, - TextReader = TextReader - }; + return new TextScript(file.Name, file.OpenRead, TextReader); } if (".exe".Equals(ext, StringComparison.OrdinalIgnoreCase) || ".dll".Equals(ext, StringComparison.OrdinalIgnoreCase)) { - return new AssemblyScript - { - DisplayName = file.Name, - Configuration = AssemblyScriptConfiguration, - ReadAssemblyContent = CreateBinaryReader(file), - ReadDescriptionContent = CreateScriptDescriptionReader(file) - }; + return new AssemblyScript( + file.Name, + CreateBinaryReader(file), + CreateScriptDescriptionReader(file), + AssemblyScriptConfiguration); } if (".ps1".Equals(ext, StringComparison.OrdinalIgnoreCase)) @@ -59,13 +59,11 @@ public IScript FromFile(IFile file) PowerShellFactory.Request(); - return new PowerShellScript - { - DisplayName = file.Name, - ReadScriptContent = file.OpenRead, - ReadDescriptionContent = CreateScriptDescriptionReader(file), - PowerShellFactory = PowerShellFactory - }; + return new PowerShellScript( + file.Name, + file.OpenRead, + CreateScriptDescriptionReader(file), + PowerShellFactory); } throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); @@ -76,7 +74,7 @@ private static Func CreateBinaryReader(IFile file) return () => BinaryRead(file); } - private static Func CreateScriptDescriptionReader(IFile file) + private static Func CreateScriptDescriptionReader(IFile file) { return () => { diff --git a/Sources/SqlDatabase/Scripts/TextScript.cs b/Sources/SqlDatabase/Scripts/TextScript.cs index e428f06a..fc0dd9ed 100644 --- a/Sources/SqlDatabase/Scripts/TextScript.cs +++ b/Sources/SqlDatabase/Scripts/TextScript.cs @@ -9,13 +9,20 @@ namespace SqlDatabase.Scripts; internal sealed class TextScript : IScript { + public TextScript(string displayName, Func readSqlContent, ISqlTextReader textReader) + { + DisplayName = displayName; + ReadSqlContent = readSqlContent; + TextReader = textReader; + } + public string DisplayName { get; set; } - public Func ReadSqlContent { get; set; } + public Func ReadSqlContent { get; internal set; } - public ISqlTextReader TextReader { get; set; } + public ISqlTextReader TextReader { get; } - public void Execute(IDbCommand command, IVariables variables, ILogger logger) + public void Execute(IDbCommand? command, IVariables variables, ILogger logger) { var batches = ResolveBatches(variables, logger); @@ -69,7 +76,7 @@ public IEnumerable ExecuteReader(IDbCommand command, IVariables var public IList GetDependencies() { - string batch; + string? batch; using (var sql = ReadSqlContent()) { batch = TextReader.ReadFirstBatch(sql); @@ -77,13 +84,13 @@ public IList GetDependencies() if (string.IsNullOrWhiteSpace(batch)) { - return new ScriptDependency[0]; + return Array.Empty(); } return DependencyParser.ExtractDependencies(new StringReader(batch), DisplayName).ToArray(); } - private static string[] GetReaderColumns(IDataReader reader) + private static string[]? GetReaderColumns(IDataReader reader) { using (var metadata = reader.GetSchemaTable()) { @@ -93,7 +100,7 @@ private static string[] GetReaderColumns(IDataReader reader) ?.Rows .Cast() .OrderBy(i => (int)i["ColumnOrdinal"]) - .Select(i => i["ColumnName"]?.ToString()) + .Select(i => i["ColumnName"].ToString()!) .ToArray(); } } diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs index 0d656f96..61f5fd03 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs @@ -5,5 +5,5 @@ namespace SqlDatabase.Scripts.UpgradeInternal; internal interface IModuleVersionResolver { // => InvalidOperationException fail to determine dependent module [{1}] version - Version GetCurrentVersion(string moduleName); + Version GetCurrentVersion(string? moduleName); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs index 712d3fee..52fdb28c 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs @@ -7,11 +7,17 @@ internal sealed class ModuleVersionResolver : IModuleVersionResolver { private readonly IDictionary _versionByModule = new Dictionary(StringComparer.OrdinalIgnoreCase); - public ILogger Log { get; set; } + public ModuleVersionResolver(ILogger log, IDatabase database) + { + Log = log; + Database = database; + } + + public ILogger Log { get; } - public IDatabase Database { get; set; } + public IDatabase Database { get; } - public Version GetCurrentVersion(string moduleName) + public Version GetCurrentVersion(string? moduleName) { if (moduleName == null) { diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs index 649bc621..65a41eea 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using SqlDatabase.IO; @@ -208,7 +209,11 @@ public bool TestStep(IDictionary versionByModule, string stepMo return !objections; } - internal static bool TryParseFileName(string name, out string moduleName, out Version from, out Version to) + internal static bool TryParseFileName( + string name, + [NotNullWhen(true)] out string? moduleName, + [NotNullWhen(true)] out Version? from, + [NotNullWhen(true)] out Version? to) { moduleName = null; from = null; @@ -250,7 +255,7 @@ internal static bool TryParseFileName(string name, out string moduleName, out Ve return from != null && to != null && from < to; } - private static Version ParseVersion(string value) + private static Version? ParseVersion(string value) { if (Version.TryParse(value, out var ver)) { @@ -265,7 +270,7 @@ private static Version ParseVersion(string value) return null; } - private void LoadFrom(IEnumerable sources, IScriptFactory scriptFactory, int depth, string rootFolderName) + private void LoadFrom(IEnumerable sources, IScriptFactory scriptFactory, int depth, string? rootFolderName) { foreach (var source in sources) { @@ -299,14 +304,14 @@ private void LoadFrom(IEnumerable sources, IScriptFactory scrip moduleName = rootFolderName; } - if (!_stepsByModule.TryGetValue(moduleName, out var steps)) + if (!_stepsByModule.TryGetValue(moduleName!, out var steps)) { steps = new List(); - _stepsByModule.Add(moduleName, steps); + _stepsByModule.Add(moduleName!, steps); } var script = scriptFactory.FromFile(file); - steps.Add(new ScriptStep(moduleName, from, to, script)); + steps.Add(new ScriptStep(moduleName!, from, to, script)); } } } diff --git a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs index 4aebc59f..64040210 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs @@ -9,17 +9,33 @@ namespace SqlDatabase.Scripts; internal sealed class UpgradeScriptSequence : IUpgradeScriptSequence { - public IList Sources { get; set; } = new List(); + public UpgradeScriptSequence( + IScriptFactory scriptFactory, + IModuleVersionResolver versionResolver, + IList sources, + ILogger log, + bool folderAsModuleName, + bool whatIf) + { + ScriptFactory = scriptFactory; + VersionResolver = versionResolver; + Sources = sources; + Log = log; + FolderAsModuleName = folderAsModuleName; + WhatIf = whatIf; + } + + public IList Sources { get; } - public IScriptFactory ScriptFactory { get; set; } + public IScriptFactory ScriptFactory { get; } - public IModuleVersionResolver VersionResolver { get; set; } + public IModuleVersionResolver VersionResolver { get; } - public ILogger Log { get; set; } + public ILogger Log { get; } public bool FolderAsModuleName { get; set; } - public bool WhatIf { get; set; } + public bool WhatIf { get; } public IList BuildSequence() { @@ -29,7 +45,7 @@ public IList BuildSequence() // folder is empty if (scripts.ModuleNames.Count == 0) { - return new ScriptStep[0]; + return Array.Empty(); } foreach (var moduleName in scripts.ModuleNames.ToArray()) @@ -40,7 +56,7 @@ public IList BuildSequence() // no updates if (scripts.ModuleNames.Count == 0) { - return new ScriptStep[0]; + return Array.Empty(); } // no modules @@ -83,7 +99,7 @@ private IList BuildSequence(UpgradeScriptCollection scripts) while (scripts.ModuleNames.Count > 0) { var nextStep = default(ScriptStep); - string nextStepModuleName = null; + string? nextStepModuleName = null; foreach (var moduleName in scripts.ModuleNames) { diff --git a/Sources/SqlDatabase/Scripts/Variables.cs b/Sources/SqlDatabase/Scripts/Variables.cs index 69621de0..8e683ae6 100644 --- a/Sources/SqlDatabase/Scripts/Variables.cs +++ b/Sources/SqlDatabase/Scripts/Variables.cs @@ -7,7 +7,7 @@ internal sealed class Variables : IVariables { private readonly IDictionary _valueByName = new Dictionary(StringComparer.OrdinalIgnoreCase); - public string DatabaseName + public string? DatabaseName { get => GetValue(nameof(DatabaseName)); set @@ -17,19 +17,19 @@ public string DatabaseName } } - public string CurrentVersion + public string? CurrentVersion { get => GetValue(nameof(CurrentVersion)); set => SetValue(VariableSource.Runtime, nameof(CurrentVersion), value); } - public string TargetVersion + public string? TargetVersion { get => GetValue(nameof(TargetVersion)); set => SetValue(VariableSource.Runtime, nameof(TargetVersion), value); } - public string ModuleName + public string? ModuleName { get => GetValue(nameof(ModuleName)); set => SetValue(VariableSource.Runtime, nameof(ModuleName), value); @@ -40,7 +40,7 @@ public IEnumerable GetNames() return _valueByName.Keys; } - public string GetValue(string name) + public string? GetValue(string name) { if (_valueByName.TryGetValue(name, out var value)) { @@ -54,7 +54,7 @@ public string GetValue(string name) return string.IsNullOrEmpty(environmentValue) ? value.Value : environmentValue; } - internal void SetValue(VariableSource source, string name, string value) + internal void SetValue(VariableSource source, string name, string? value) { if (!_valueByName.TryGetValue(name, out var oldValue) || source <= oldValue.Source) @@ -82,14 +82,8 @@ public VariableValue(VariableSource source, string value) public string Value { get; } - public override bool Equals(object obj) - { - throw new NotSupportedException(); - } + public override bool Equals(object? obj) => throw new NotSupportedException(); - public override int GetHashCode() - { - throw new NotSupportedException(); - } + public override int GetHashCode() => throw new NotSupportedException(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase/StringExtensions.cs b/Sources/SqlDatabase/StringExtensions.cs index e5d98b5b..486aaebb 100644 --- a/Sources/SqlDatabase/StringExtensions.cs +++ b/Sources/SqlDatabase/StringExtensions.cs @@ -4,7 +4,7 @@ namespace SqlDatabase; internal static class StringExtensions { - public static string FormatWith(this string format, params object[] args) + public static string FormatWith(this string format, params object?[] args) { return string.Format(CultureInfo.InvariantCulture, format, args); } From 70907114f2f5c208d569ad1aa7587c0dcde633d6 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 5 Nov 2023 15:20:14 +0100 Subject: [PATCH 14/38] SqlDatabase.FileSystem --- Build/scripts/Remove-DirectoryRecurse.ps1 | 24 +++++++++ .../Content.zip | Bin .../FileSystemFactoryTest.cs | 2 +- .../FileSystemFileTest.cs | 2 +- .../FileSystemFolderTest.cs | 2 +- .../InLineScriptFileTest.cs | 2 +- .../SqlDatabase.FileSystem.Test.csproj | 25 +++++++++ .../ZipFolderTest.cs | 2 +- .../FileSystemFactory.cs | 12 ++--- .../FileSystemFile.cs | 2 +- .../FileSystemFolder.cs | 2 +- .../FileTools.cs | 2 +- .../IO => SqlDatabase.FileSystem}/IFile.cs | 2 +- .../IFileSystemFactory.cs | 4 +- .../IFileSystemInfo.cs | 2 +- .../IO => SqlDatabase.FileSystem}/IFolder.cs | 2 +- .../InLineScriptFile.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 ++ .../SqlDatabase.FileSystem.csproj | 7 +++ .../ZipEntryFolder.cs | 2 +- .../ZipFolder.cs | 2 +- .../ZipFolderFile.EntryStream.cs | 2 +- .../ZipFolderFile.cs | 2 +- .../Configuration/CommandLineBaseTest.cs | 2 +- .../Configuration/CreateCommandLineTest.cs | 2 +- .../Configuration/ExecuteCommandLineTest.cs | 2 +- .../Configuration/ExportCommandLineTest.cs | 2 +- .../Configuration/UpgradeCommandLineTest.cs | 2 +- .../Scripts/CreateScriptSequenceTest.cs | 2 +- .../Scripts/UpgradeScriptSequenceTest.cs | 2 +- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 3 +- .../SqlDatabase.Test/TestApi/FileFactory.cs | 2 +- .../SqlDatabase.TestApi.csproj | 10 ++++ .../TempDirectory.cs | 6 +-- .../TempFile.cs | 2 +- Sources/SqlDatabase.sln | 30 +++++++++-- .../Configuration/CommandLineBase.cs | 2 +- .../Configuration/ConfigurationManager.cs | 5 +- .../Scripts/CreateScriptSequence.cs | 2 +- Sources/SqlDatabase/Scripts/IScriptFactory.cs | 2 +- Sources/SqlDatabase/Scripts/ScriptFactory.cs | 2 +- .../UpgradeScriptCollection.cs | 2 +- .../Scripts/UpgradeScriptSequence.cs | 2 +- Sources/SqlDatabase/SqlDatabase.csproj | 48 +++++++++--------- 44 files changed, 168 insertions(+), 72 deletions(-) create mode 100644 Build/scripts/Remove-DirectoryRecurse.ps1 rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/Content.zip (100%) rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/FileSystemFactoryTest.cs (99%) rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/FileSystemFileTest.cs (95%) rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/FileSystemFolderTest.cs (98%) rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/InLineScriptFileTest.cs (94%) create mode 100644 Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj rename Sources/{SqlDatabase.Test/IO => SqlDatabase.FileSystem.Test}/ZipFolderTest.cs (98%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/FileSystemFactory.cs (83%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/FileSystemFile.cs (93%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/FileSystemFolder.cs (96%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/FileTools.cs (96%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/IFile.cs (77%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/IFileSystemFactory.cs (63%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/IFileSystemInfo.cs (62%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/IFolder.cs (82%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/InLineScriptFile.cs (92%) create mode 100644 Sources/SqlDatabase.FileSystem/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.FileSystem/SqlDatabase.FileSystem.csproj rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/ZipEntryFolder.cs (94%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/ZipFolder.cs (98%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/ZipFolderFile.EntryStream.cs (97%) rename Sources/{SqlDatabase/IO => SqlDatabase.FileSystem}/ZipFolderFile.cs (95%) create mode 100644 Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.TestApi}/TempDirectory.cs (90%) rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.TestApi}/TempFile.cs (89%) diff --git a/Build/scripts/Remove-DirectoryRecurse.ps1 b/Build/scripts/Remove-DirectoryRecurse.ps1 new file mode 100644 index 00000000..0b69ba60 --- /dev/null +++ b/Build/scripts/Remove-DirectoryRecurse.ps1 @@ -0,0 +1,24 @@ +function Remove-DirectoryRecurse { + param ( + [Parameter(Mandatory)] + [string] + $Path, + + [Parameter()] + [string[]] + $Filters + ) + + if (-not (Test-Path $Path)) { + return + } + + if ($Filters) { + foreach ($filter in $Filters) { + Get-ChildItem -Path $Path -Filter $filter -Directory -Recurse | Remove-Item -Recurse -Force + } + } + else { + Remove-Item -Path $Path -Recurse -Force + } +} diff --git a/Sources/SqlDatabase.Test/IO/Content.zip b/Sources/SqlDatabase.FileSystem.Test/Content.zip similarity index 100% rename from Sources/SqlDatabase.Test/IO/Content.zip rename to Sources/SqlDatabase.FileSystem.Test/Content.zip diff --git a/Sources/SqlDatabase.Test/IO/FileSystemFactoryTest.cs b/Sources/SqlDatabase.FileSystem.Test/FileSystemFactoryTest.cs similarity index 99% rename from Sources/SqlDatabase.Test/IO/FileSystemFactoryTest.cs rename to Sources/SqlDatabase.FileSystem.Test/FileSystemFactoryTest.cs index 46f175ed..c15a81c8 100644 --- a/Sources/SqlDatabase.Test/IO/FileSystemFactoryTest.cs +++ b/Sources/SqlDatabase.FileSystem.Test/FileSystemFactoryTest.cs @@ -3,7 +3,7 @@ using NUnit.Framework; using SqlDatabase.TestApi; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [TestFixture] public class FileSystemFactoryTest diff --git a/Sources/SqlDatabase.Test/IO/FileSystemFileTest.cs b/Sources/SqlDatabase.FileSystem.Test/FileSystemFileTest.cs similarity index 95% rename from Sources/SqlDatabase.Test/IO/FileSystemFileTest.cs rename to Sources/SqlDatabase.FileSystem.Test/FileSystemFileTest.cs index 9e748747..2a53e63e 100644 --- a/Sources/SqlDatabase.Test/IO/FileSystemFileTest.cs +++ b/Sources/SqlDatabase.FileSystem.Test/FileSystemFileTest.cs @@ -3,7 +3,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [TestFixture] public class FileSystemFileTest diff --git a/Sources/SqlDatabase.Test/IO/FileSystemFolderTest.cs b/Sources/SqlDatabase.FileSystem.Test/FileSystemFolderTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/IO/FileSystemFolderTest.cs rename to Sources/SqlDatabase.FileSystem.Test/FileSystemFolderTest.cs index 4fcf981b..3c7c3e95 100644 --- a/Sources/SqlDatabase.Test/IO/FileSystemFolderTest.cs +++ b/Sources/SqlDatabase.FileSystem.Test/FileSystemFolderTest.cs @@ -3,7 +3,7 @@ using NUnit.Framework; using SqlDatabase.TestApi; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [TestFixture] public class FileSystemFolderTest diff --git a/Sources/SqlDatabase.Test/IO/InLineScriptFileTest.cs b/Sources/SqlDatabase.FileSystem.Test/InLineScriptFileTest.cs similarity index 94% rename from Sources/SqlDatabase.Test/IO/InLineScriptFileTest.cs rename to Sources/SqlDatabase.FileSystem.Test/InLineScriptFileTest.cs index 0bb1956b..fe6133ba 100644 --- a/Sources/SqlDatabase.Test/IO/InLineScriptFileTest.cs +++ b/Sources/SqlDatabase.FileSystem.Test/InLineScriptFileTest.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Shouldly; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [TestFixture] public class InLineScriptFileTest diff --git a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj new file mode 100644 index 00000000..b613bfc2 --- /dev/null +++ b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj @@ -0,0 +1,25 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.FileSystem + ..\..\bin\Tests + + + + + + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs b/Sources/SqlDatabase.FileSystem.Test/ZipFolderTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/IO/ZipFolderTest.cs rename to Sources/SqlDatabase.FileSystem.Test/ZipFolderTest.cs index 049338ab..5c0048c6 100644 --- a/Sources/SqlDatabase.Test/IO/ZipFolderTest.cs +++ b/Sources/SqlDatabase.FileSystem.Test/ZipFolderTest.cs @@ -4,7 +4,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [TestFixture] public class ZipFolderTest diff --git a/Sources/SqlDatabase/IO/FileSystemFactory.cs b/Sources/SqlDatabase.FileSystem/FileSystemFactory.cs similarity index 83% rename from Sources/SqlDatabase/IO/FileSystemFactory.cs rename to Sources/SqlDatabase.FileSystem/FileSystemFactory.cs index 5a6e0b73..835dff00 100644 --- a/Sources/SqlDatabase/IO/FileSystemFactory.cs +++ b/Sources/SqlDatabase.FileSystem/FileSystemFactory.cs @@ -3,9 +3,9 @@ using System.IO; using System.Linq; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; -internal sealed class FileSystemFactory : IFileSystemFactory +public sealed class FileSystemFactory : IFileSystemFactory { public static IFileSystemInfo FileSystemInfoFromPath(string? path) { @@ -38,7 +38,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string? path) if (entryPoint == null) { - throw new IOException("Directory {0} not found.".FormatWith(path)); + throw new IOException($"Directory {path} not found."); } for (var i = 0; i < items.Count - 1; i++) @@ -49,7 +49,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string? path) entryPoint = entryPoint.GetFolders().FirstOrDefault(f => name.Equals(f.Name, StringComparison.OrdinalIgnoreCase)); if (entryPoint == null) { - throw new IOException("Directory {0} not found.".FormatWith(path)); + throw new IOException($"Directory {path} not found."); } } @@ -65,7 +65,7 @@ public static IFileSystemInfo FileSystemInfoFromPath(string? path) var folder = entryPoint.GetFolders().FirstOrDefault(f => resultName.Equals(f.Name, StringComparison.OrdinalIgnoreCase)); if (folder == null) { - throw new IOException("File or folder {0} not found.".FormatWith(path)); + throw new IOException($"File or folder {path} not found."); } return folder; @@ -89,7 +89,7 @@ public IFileSystemInfo FromContent(string name, string content) { if (!FileTools.IsZip(path)) { - throw new NotSupportedException("File format [{0}] is not supported as .zip container.".FormatWith(Path.GetExtension(path))); + throw new NotSupportedException($"File format [{Path.GetExtension(path)}] is not supported as .zip container."); } return new ZipFolder(path); diff --git a/Sources/SqlDatabase/IO/FileSystemFile.cs b/Sources/SqlDatabase.FileSystem/FileSystemFile.cs similarity index 93% rename from Sources/SqlDatabase/IO/FileSystemFile.cs rename to Sources/SqlDatabase.FileSystem/FileSystemFile.cs index 836dea24..65ed1039 100644 --- a/Sources/SqlDatabase/IO/FileSystemFile.cs +++ b/Sources/SqlDatabase.FileSystem/FileSystemFile.cs @@ -1,6 +1,6 @@ using System.IO; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; internal sealed class FileSystemFile : IFile { diff --git a/Sources/SqlDatabase/IO/FileSystemFolder.cs b/Sources/SqlDatabase.FileSystem/FileSystemFolder.cs similarity index 96% rename from Sources/SqlDatabase/IO/FileSystemFolder.cs rename to Sources/SqlDatabase.FileSystem/FileSystemFolder.cs index 14047d43..da1877b2 100644 --- a/Sources/SqlDatabase/IO/FileSystemFolder.cs +++ b/Sources/SqlDatabase.FileSystem/FileSystemFolder.cs @@ -2,7 +2,7 @@ using System.IO; using System.Linq; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; internal sealed class FileSystemFolder : IFolder { diff --git a/Sources/SqlDatabase/IO/FileTools.cs b/Sources/SqlDatabase.FileSystem/FileTools.cs similarity index 96% rename from Sources/SqlDatabase/IO/FileTools.cs rename to Sources/SqlDatabase.FileSystem/FileTools.cs index 3c7b8ead..280a16b1 100644 --- a/Sources/SqlDatabase/IO/FileTools.cs +++ b/Sources/SqlDatabase.FileSystem/FileTools.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; internal static class FileTools { diff --git a/Sources/SqlDatabase/IO/IFile.cs b/Sources/SqlDatabase.FileSystem/IFile.cs similarity index 77% rename from Sources/SqlDatabase/IO/IFile.cs rename to Sources/SqlDatabase.FileSystem/IFile.cs index 87a2399f..6fe021bb 100644 --- a/Sources/SqlDatabase/IO/IFile.cs +++ b/Sources/SqlDatabase.FileSystem/IFile.cs @@ -1,6 +1,6 @@ using System.IO; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; public interface IFile : IFileSystemInfo { diff --git a/Sources/SqlDatabase/IO/IFileSystemFactory.cs b/Sources/SqlDatabase.FileSystem/IFileSystemFactory.cs similarity index 63% rename from Sources/SqlDatabase/IO/IFileSystemFactory.cs rename to Sources/SqlDatabase.FileSystem/IFileSystemFactory.cs index f5cc51bc..eb3bf85c 100644 --- a/Sources/SqlDatabase/IO/IFileSystemFactory.cs +++ b/Sources/SqlDatabase.FileSystem/IFileSystemFactory.cs @@ -1,6 +1,6 @@ -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; -internal interface IFileSystemFactory +public interface IFileSystemFactory { IFileSystemInfo FileSystemInfoFromPath(string? path); diff --git a/Sources/SqlDatabase/IO/IFileSystemInfo.cs b/Sources/SqlDatabase.FileSystem/IFileSystemInfo.cs similarity index 62% rename from Sources/SqlDatabase/IO/IFileSystemInfo.cs rename to Sources/SqlDatabase.FileSystem/IFileSystemInfo.cs index 067b12fc..607562d4 100644 --- a/Sources/SqlDatabase/IO/IFileSystemInfo.cs +++ b/Sources/SqlDatabase.FileSystem/IFileSystemInfo.cs @@ -1,4 +1,4 @@ -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; public interface IFileSystemInfo { diff --git a/Sources/SqlDatabase/IO/IFolder.cs b/Sources/SqlDatabase.FileSystem/IFolder.cs similarity index 82% rename from Sources/SqlDatabase/IO/IFolder.cs rename to Sources/SqlDatabase.FileSystem/IFolder.cs index 381ec61a..3122829c 100644 --- a/Sources/SqlDatabase/IO/IFolder.cs +++ b/Sources/SqlDatabase.FileSystem/IFolder.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; public interface IFolder : IFileSystemInfo { diff --git a/Sources/SqlDatabase/IO/InLineScriptFile.cs b/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs similarity index 92% rename from Sources/SqlDatabase/IO/InLineScriptFile.cs rename to Sources/SqlDatabase.FileSystem/InLineScriptFile.cs index e035cbf5..780a1de5 100644 --- a/Sources/SqlDatabase/IO/InLineScriptFile.cs +++ b/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs @@ -1,7 +1,7 @@ using System.IO; using System.Text; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; internal sealed class InLineScriptFile : IFile { diff --git a/Sources/SqlDatabase.FileSystem/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.FileSystem/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..22d6abb5 --- /dev/null +++ b/Sources/SqlDatabase.FileSystem/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.FileSystem.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.FileSystem/SqlDatabase.FileSystem.csproj b/Sources/SqlDatabase.FileSystem/SqlDatabase.FileSystem.csproj new file mode 100644 index 00000000..dbdcea46 --- /dev/null +++ b/Sources/SqlDatabase.FileSystem/SqlDatabase.FileSystem.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.0 + + + diff --git a/Sources/SqlDatabase/IO/ZipEntryFolder.cs b/Sources/SqlDatabase.FileSystem/ZipEntryFolder.cs similarity index 94% rename from Sources/SqlDatabase/IO/ZipEntryFolder.cs rename to Sources/SqlDatabase.FileSystem/ZipEntryFolder.cs index eba581f0..2dbf2ce7 100644 --- a/Sources/SqlDatabase/IO/ZipEntryFolder.cs +++ b/Sources/SqlDatabase.FileSystem/ZipEntryFolder.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [DebuggerDisplay("{Name}")] internal sealed class ZipEntryFolder : IFolder diff --git a/Sources/SqlDatabase/IO/ZipFolder.cs b/Sources/SqlDatabase.FileSystem/ZipFolder.cs similarity index 98% rename from Sources/SqlDatabase/IO/ZipFolder.cs rename to Sources/SqlDatabase.FileSystem/ZipFolder.cs index cdc23263..e2844b1b 100644 --- a/Sources/SqlDatabase/IO/ZipFolder.cs +++ b/Sources/SqlDatabase.FileSystem/ZipFolder.cs @@ -5,7 +5,7 @@ using System.IO.Compression; using System.Linq; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [DebuggerDisplay("{Name}")] internal sealed class ZipFolder : IFolder diff --git a/Sources/SqlDatabase/IO/ZipFolderFile.EntryStream.cs b/Sources/SqlDatabase.FileSystem/ZipFolderFile.EntryStream.cs similarity index 97% rename from Sources/SqlDatabase/IO/ZipFolderFile.EntryStream.cs rename to Sources/SqlDatabase.FileSystem/ZipFolderFile.EntryStream.cs index 47d74217..b4853cc9 100644 --- a/Sources/SqlDatabase/IO/ZipFolderFile.EntryStream.cs +++ b/Sources/SqlDatabase.FileSystem/ZipFolderFile.EntryStream.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; internal partial class ZipFolderFile { diff --git a/Sources/SqlDatabase/IO/ZipFolderFile.cs b/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs similarity index 95% rename from Sources/SqlDatabase/IO/ZipFolderFile.cs rename to Sources/SqlDatabase.FileSystem/ZipFolderFile.cs index da605db1..f0cf1835 100644 --- a/Sources/SqlDatabase/IO/ZipFolderFile.cs +++ b/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs @@ -1,7 +1,7 @@ using System.Diagnostics; using System.IO; -namespace SqlDatabase.IO; +namespace SqlDatabase.FileSystem; [DebuggerDisplay(@"zip\{EntryName}")] internal sealed partial class ZipFolderFile : IFile diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs index cfdc3283..d96eec4d 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs @@ -3,7 +3,7 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs index 07c02066..d5a9c6dd 100644 --- a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Commands; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs index 96058492..ab4c884d 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Commands; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs index c9387d3f..13e83637 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs @@ -4,7 +4,7 @@ using Shouldly; using SqlDatabase.Commands; using SqlDatabase.Export; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs index 35da86ac..8112d2a6 100644 --- a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Commands; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs index 0fbb8840..78a961ed 100644 --- a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs @@ -3,7 +3,7 @@ using System.Linq; using Moq; using NUnit.Framework; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs index e9bf838a..fd603e63 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs @@ -6,7 +6,7 @@ using Newtonsoft.Json; using NUnit.Framework; using Shouldly; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts.UpgradeInternal; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 34d2ef62..992a96a3 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -14,11 +14,11 @@ - + @@ -34,7 +34,6 @@ - diff --git a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs b/Sources/SqlDatabase.Test/TestApi/FileFactory.cs index 77431b20..4599288b 100644 --- a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs +++ b/Sources/SqlDatabase.Test/TestApi/FileFactory.cs @@ -4,7 +4,7 @@ using System.Text; using Moq; using NUnit.Framework; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; namespace SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj b/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj new file mode 100644 index 00000000..e88207ce --- /dev/null +++ b/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj @@ -0,0 +1,10 @@ + + + + netstandard2.0 + + + + + + diff --git a/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs b/Sources/SqlDatabase.TestApi/TempDirectory.cs similarity index 90% rename from Sources/SqlDatabase.Test/TestApi/TempDirectory.cs rename to Sources/SqlDatabase.TestApi/TempDirectory.cs index 880fa961..9f646124 100644 --- a/Sources/SqlDatabase.Test/TestApi/TempDirectory.cs +++ b/Sources/SqlDatabase.TestApi/TempDirectory.cs @@ -1,11 +1,11 @@ using System; using System.Diagnostics; using System.IO; -using NUnit.Framework; +using Shouldly; namespace SqlDatabase.TestApi; -internal sealed class TempDirectory : IDisposable +public sealed class TempDirectory : IDisposable { public TempDirectory(string? name = null) { @@ -23,7 +23,7 @@ public string CopyFileFromResources(string resourceName, Type? resourceAnchor = } var source = resourceAnchor!.Assembly.GetManifestResourceStream(resourceAnchor.Namespace + "." + resourceName); - Assert.IsNotNull(source, resourceName); + source.ShouldNotBeNull(resourceName); var fileName = Path.Combine(Location, resourceName); diff --git a/Sources/SqlDatabase.Test/TestApi/TempFile.cs b/Sources/SqlDatabase.TestApi/TempFile.cs similarity index 89% rename from Sources/SqlDatabase.Test/TestApi/TempFile.cs rename to Sources/SqlDatabase.TestApi/TempFile.cs index 91777ed8..d327c9bf 100644 --- a/Sources/SqlDatabase.Test/TestApi/TempFile.cs +++ b/Sources/SqlDatabase.TestApi/TempFile.cs @@ -3,7 +3,7 @@ namespace SqlDatabase.TestApi; -internal sealed class TempFile : IDisposable +public sealed class TempFile : IDisposable { public TempFile(string extension) { diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index 6b1e883c..f64375fa 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34227.203 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{41240983-0CDD-4312-AB28-7FA8DE338126}" ProjectSection(SolutionItems) = preProject @@ -20,7 +20,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.PowerShell", "S EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.PowerShell.Test", "SqlDatabase.PowerShell.Test\SqlDatabase.PowerShell.Test.csproj", "{4F35E6D2-99FB-4B7B-90A5-3BFA936FB8CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Package", "SqlDatabase.Package\SqlDatabase.Package.csproj", "{F986789D-F9B3-42B4-AA4B-4C0A63011F5D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Package", "SqlDatabase.Package\SqlDatabase.Package.csproj", "{F986789D-F9B3-42B4-AA4B-4C0A63011F5D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.FileSystem", "SqlDatabase.FileSystem\SqlDatabase.FileSystem.csproj", "{8BFF1266-C87C-4072-B16F-7A715D0A22B8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.FileSystem.Test", "SqlDatabase.FileSystem.Test\SqlDatabase.FileSystem.Test.csproj", "{4334C327-A578-4247-B1CC-23A63B2CC7F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.TestApi", "SqlDatabase.TestApi\SqlDatabase.TestApi.csproj", "{8724A867-C5F5-4A7C-B414-D84AB9830AA0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -52,12 +60,28 @@ Global {F986789D-F9B3-42B4-AA4B-4C0A63011F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {F986789D-F9B3-42B4-AA4B-4C0A63011F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {F986789D-F9B3-42B4-AA4B-4C0A63011F5D}.Release|Any CPU.Build.0 = Release|Any CPU + {8BFF1266-C87C-4072-B16F-7A715D0A22B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BFF1266-C87C-4072-B16F-7A715D0A22B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BFF1266-C87C-4072-B16F-7A715D0A22B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BFF1266-C87C-4072-B16F-7A715D0A22B8}.Release|Any CPU.Build.0 = Release|Any CPU + {4334C327-A578-4247-B1CC-23A63B2CC7F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4334C327-A578-4247-B1CC-23A63B2CC7F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4334C327-A578-4247-B1CC-23A63B2CC7F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4334C327-A578-4247-B1CC-23A63B2CC7F2}.Release|Any CPU.Build.0 = Release|Any CPU + {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {1B458B5B-D39C-4247-BFB9-A5D9B8D4D85C} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {8FE68E2C-586F-4E22-BDA3-4E65473BC3D7} = {D68226E5-B167-48D9-985C-B13CA6538634} + {4F35E6D2-99FB-4B7B-90A5-3BFA936FB8CF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {4334C327-A578-4247-B1CC-23A63B2CC7F2} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {8724A867-C5F5-4A7C-B414-D84AB9830AA0} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Configuration/CommandLineBase.cs b/Sources/SqlDatabase/Configuration/CommandLineBase.cs index e59f6a1e..fe3cc9e0 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineBase.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineBase.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using SqlDatabase.Commands; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs index 946628bb..d2484d09 100644 --- a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs +++ b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs @@ -2,7 +2,7 @@ using System.Configuration; using System.IO; using System.Linq; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using Manager = System.Configuration.ConfigurationManager; namespace SqlDatabase.Configuration; @@ -13,7 +13,8 @@ internal sealed class ConfigurationManager : IConfigurationManager public static string ResolveDefaultConfigurationFile(string probingPath) { - var fileName = ResolveFile(new FileSystemFolder(probingPath)).Name; + var info = FileSystemFactory.FileSystemInfoFromPath(probingPath); + var fileName = ResolveFile(info).Name; return Path.Combine(probingPath, fileName); } diff --git a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs index e8ef79d9..8b109b59 100644 --- a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/IScriptFactory.cs b/Sources/SqlDatabase/Scripts/IScriptFactory.cs index a24eb2a1..f7d991da 100644 --- a/Sources/SqlDatabase/Scripts/IScriptFactory.cs +++ b/Sources/SqlDatabase/Scripts/IScriptFactory.cs @@ -1,4 +1,4 @@ -using SqlDatabase.IO; +using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/ScriptFactory.cs b/Sources/SqlDatabase/Scripts/ScriptFactory.cs index a5092077..e3abc159 100644 --- a/Sources/SqlDatabase/Scripts/ScriptFactory.cs +++ b/Sources/SqlDatabase/Scripts/ScriptFactory.cs @@ -2,7 +2,7 @@ using System.IO; using System.Linq; using SqlDatabase.Configuration; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs index 65a41eea..ecd9afe2 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs @@ -3,7 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts.UpgradeInternal; diff --git a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs index 64040210..d3074893 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using SqlDatabase.IO; +using SqlDatabase.FileSystem; using SqlDatabase.Scripts.UpgradeInternal; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 7facba5d..2e0d5d98 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0;netstandard2.0 net6.0;net7.0 - Exe @@ -13,28 +12,6 @@ SqlDatabase.GlobalTool - - - - - - - - - - - - - - - - - - - - - - @@ -66,4 +43,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From a2258481ddcaa581a63181cbe95730f95f319dca Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Mon, 6 Nov 2023 08:42:43 +0100 Subject: [PATCH 15/38] SqlDatabase.Adapter.AssemblyScripts --- .../AssemblyScriptFactoryTest.cs | 52 ++++++++ .../AssemblyScriptTest.cs | 69 +++++----- .../DbCommandStub.cs | 2 +- .../DefaultEntryPointTest.cs | 2 +- .../EntryPointResolverTest.Stubs.cs | 2 +- .../EntryPointResolverTest.cs | 38 +++--- ...cuteMethodResolverCommandDictionaryTest.cs | 2 +- .../ExecuteMethodResolverCommandTest.cs | 2 +- .../ExecuteMethodResolverDbConnectionTest.cs | 2 +- ...cuteMethodResolverDictionaryCommandTest.cs | 2 +- .../ExecuteMethodResolverSqlConnectionTest.cs | 2 +- .../Net472SubDomainTest.StepWithSubDomain.cs | 65 ++++++++++ .../Net472/Net472SubDomainTest.cs | 14 +- ...tabase.Adapter.AssemblyScripts.Test.csproj | 28 ++++ .../AssemblyScript.cs | 45 ++++--- .../AssemblyScriptFactory.cs | 67 ++++++++++ .../CodeAnalysis/AllowNullAttribute.cs | 8 ++ .../CodeAnalysis/NotNullWhenAttribute.cs | 10 ++ .../ConsoleListener.cs | 2 +- .../DefaultEntryPoint.cs | 2 +- .../EntryPointResolver.cs | 10 +- .../ExecuteMethodResolverBase.cs | 2 +- .../ExecuteMethodResolverCommand.cs | 2 +- .../ExecuteMethodResolverCommandDictionary.cs | 2 +- .../ExecuteMethodResolverDbConnection.cs | 2 +- .../ExecuteMethodResolverDictionaryCommand.cs | 2 +- .../ExecuteMethodResolverSqlConnection.cs | 2 +- .../IEntryPoint.cs | 2 +- .../ISubDomain.cs | 2 +- .../Net472/DomainAgent.cs | 2 +- .../Net472/DomainDirectory.cs | 6 +- .../Net472/LoggerProxy.cs | 2 +- .../Net472/Net472SubDomain.cs | 4 +- .../NetCore/AssemblyContext.cs | 2 +- .../NetCore/NetCoreSubDomain.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 + ...SqlDatabase.Adapter.AssemblyScripts.csproj | 16 +++ .../VariablesProxy.cs | 2 +- .../ILogger.cs | 2 +- .../IScript.cs | 5 +- .../IScriptFactory.cs | 4 +- .../IVariables.cs | 2 +- .../LoggerExtensions.cs | 4 +- .../SqlDatabase.Adapter.csproj | 11 ++ .../SqlDatabase.FileSystem.Test.csproj | 1 - .../SqlDatabase.FileSystem/FileSystemFile.cs | 3 + Sources/SqlDatabase.FileSystem/IFile.cs | 2 + .../InLineScriptFile.cs | 3 + .../SqlDatabase.FileSystem/ZipFolderFile.cs | 3 + .../Internal/SqlDatabaseProgram.cs | 3 +- .../Commands/DatabaseCreateCommandTest.cs | 1 + .../Commands/DatabaseExecuteCommandTest.cs | 1 + .../Commands/DatabaseExportCommandTest.cs | 1 + .../Commands/DatabaseUpgradeCommandTest.cs | 1 + .../Configuration/AppConfigurationTest.cs | 4 +- .../Configuration/CommandLineBaseTest.cs | 1 + .../Configuration/CreateCommandLineTest.cs | 1 + .../Configuration/ExecuteCommandLineTest.cs | 1 + .../Configuration/ExportCommandLineTest.cs | 1 + .../Configuration/UpgradeCommandLineTest.cs | 1 + .../Export/DataExportLoggerTest.cs | 1 + .../Export/MsSqlDataExporterTest.cs | 1 + .../Export/MySqlDataExporterTest.cs | 1 + .../Export/PgSqlDataExporterTest.cs | 1 + .../IntegrationTests/MsSql/ProgramTest.cs | 1 + .../IntegrationTests/MySql/ProgramTest.cs | 1 + .../IntegrationTests/PgSql/ProgramTest.cs | 1 + .../Log/CombinedLoggerTest.cs | 1 + .../Net472SubDomainTest.StepWithSubDomain.cs | 67 ---------- .../Scripts/CreateScriptSequenceTest.cs | 6 +- .../Scripts/DatabaseAdapterFactoryTest.cs | 1 + .../SqlDatabase.Test/Scripts/DatabaseTest.cs | 1 + .../Scripts/MsSql/MsSqlDatabaseAdapterTest.cs | 1 + .../MsSql/TextScriptOutputMsSqlTest.cs | 1 + .../Scripts/MySql/MySqlDatabaseAdapterTest.cs | 1 + .../MySql/TextScriptOutputMySqlTest.cs | 1 + .../Scripts/PgSql/PgSqlDatabaseAdapterTest.cs | 1 + .../PgSql/TextScriptOutputPgSqlTest.cs | 1 + .../PowerShellInternal/PowerShellTest.cs | 1 + .../Scripts/PowerShellScriptTest.cs | 16 +-- .../Scripts/ScriptFactoryTest.cs | 44 +------ .../Scripts/SqlScriptVariableParserTest.cs | 1 + .../Scripts/TextScriptTest.cs | 4 +- .../ModuleVersionResolverTest.cs | 1 + .../Scripts/UpgradeScriptSequenceTest.cs | 23 ++-- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 7 +- .../SqlDatabase.Test.csproj.user | 5 - .../TestApi/TestPowerShellHost.cs | 1 + .../FileFactory.cs | 7 +- .../SqlDatabase.TestApi.csproj | 5 + Sources/SqlDatabase.sln | 19 +++ .../Commands/DatabaseCommandBase.cs | 3 +- .../Commands/DatabaseCreateCommand.cs | 1 + .../Commands/DatabaseExecuteCommand.cs | 1 + .../Commands/DatabaseExportCommand.cs | 1 + .../Commands/DatabaseUpgradeCommand.cs | 1 + Sources/SqlDatabase/Commands/EchoCommand.cs | 3 +- .../AssemblyScriptConfiguration.cs | 12 +- .../Configuration/CommandLineBase.cs | 1 + .../Configuration/CreateCommandLine.cs | 1 + .../Configuration/DatabaseConfiguration.cs | 8 +- .../Configuration/EchoCommandLine.cs | 3 +- .../Configuration/ExecuteCommandLine.cs | 1 + .../Configuration/ExportCommandLine.cs | 1 + .../SqlDatabase/Configuration/ICommandLine.cs | 3 +- .../Configuration/UpgradeCommandLine.cs | 1 + .../SqlDatabase/Export/DataExportLogger.cs | 1 + Sources/SqlDatabase/Export/DataExporter.cs | 1 + Sources/SqlDatabase/Export/IDataExporter.cs | 1 + Sources/SqlDatabase/Log/CombinedLogger.cs | 1 + Sources/SqlDatabase/Log/LoggerBase.cs | 1 + Sources/SqlDatabase/Log/LoggerFactory.cs | 4 +- Sources/SqlDatabase/Program.cs | 1 + .../Scripts/CreateScriptSequence.cs | 7 +- Sources/SqlDatabase/Scripts/Database.cs | 1 + .../Scripts/DatabaseAdapterFactory.cs | 1 + .../Scripts/ICreateScriptSequence.cs | 1 + Sources/SqlDatabase/Scripts/IDatabase.cs | 1 + .../SqlDatabase/Scripts/IPowerShellFactory.cs | 3 +- .../Scripts/MsSql/MsSqlDatabaseAdapter.cs | 5 +- .../Scripts/MySql/MySqlDatabaseAdapter.cs | 5 +- .../Scripts/PgSql/PgSqlDatabaseAdapter.cs | 5 +- .../Scripts/PowerShellInternal/IPowerShell.cs | 1 + .../Scripts/PowerShellInternal/PowerShell.cs | 1 + .../PowerShellInternal/PowerShellFactory.cs | 1 + .../PowerShellFactory.hosted.cs | 1 + .../PowerShellStreamsListener.cs | 1 + .../PowerShellInternal/VariablesProxy.cs | 1 + .../SqlDatabase/Scripts/PowerShellScript.cs | 19 +-- Sources/SqlDatabase/Scripts/ScriptFactory.cs | 121 ++++++++++-------- Sources/SqlDatabase/Scripts/ScriptStep.cs | 1 + .../Scripts/SqlScriptVariableParser.cs | 1 + Sources/SqlDatabase/Scripts/TextScript.cs | 7 +- .../UpgradeInternal/ModuleVersionResolver.cs | 1 + .../UpgradeScriptCollection.cs | 11 +- .../Scripts/UpgradeScriptSequence.cs | 1 + Sources/SqlDatabase/Scripts/Variables.cs | 1 + Sources/SqlDatabase/SqlDatabase.csproj | 3 +- 138 files changed, 650 insertions(+), 363 deletions(-) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptFactoryTest.cs rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Adapter.AssemblyScripts.Test}/AssemblyScriptTest.cs (70%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/DbCommandStub.cs (97%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/DefaultEntryPointTest.cs (97%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/EntryPointResolverTest.Stubs.cs (95%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/EntryPointResolverTest.cs (64%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/ExecuteMethodResolverCommandDictionaryTest.cs (96%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/ExecuteMethodResolverCommandTest.cs (95%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/ExecuteMethodResolverDbConnectionTest.cs (96%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/ExecuteMethodResolverDictionaryCommandTest.cs (96%) rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/ExecuteMethodResolverSqlConnectionTest.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.StepWithSubDomain.cs rename Sources/{SqlDatabase.Test/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts.Test}/Net472/Net472SubDomainTest.cs (92%) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter.AssemblyScripts}/AssemblyScript.cs (63%) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/AllowNullAttribute.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/NotNullWhenAttribute.cs rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ConsoleListener.cs (95%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/DefaultEntryPoint.cs (95%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/EntryPointResolver.cs (88%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverBase.cs (87%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverCommand.cs (94%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverCommandDictionary.cs (95%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverDbConnection.cs (94%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverDictionaryCommand.cs (95%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ExecuteMethodResolverSqlConnection.cs (94%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/IEntryPoint.cs (78%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/ISubDomain.cs (84%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/Net472/DomainAgent.cs (97%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/Net472/DomainDirectory.cs (78%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/Net472/LoggerProxy.cs (94%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/Net472/Net472SubDomain.cs (93%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/NetCore/AssemblyContext.cs (93%) rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/NetCore/NetCoreSubDomain.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj rename Sources/{SqlDatabase/Scripts/AssemblyInternal => SqlDatabase.Adapter.AssemblyScripts}/VariablesProxy.cs (95%) rename Sources/{SqlDatabase => SqlDatabase.Adapter}/ILogger.cs (81%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter}/IScript.cs (78%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter}/IScriptFactory.cs (60%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter}/IVariables.cs (66%) rename Sources/{SqlDatabase => SqlDatabase.Adapter}/LoggerExtensions.cs (91%) create mode 100644 Sources/SqlDatabase.Adapter/SqlDatabase.Adapter.csproj delete mode 100644 Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.TestApi}/FileFactory.cs (91%) diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptFactoryTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptFactoryTest.cs new file mode 100644 index 00000000..cacb2657 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptFactoryTest.cs @@ -0,0 +1,52 @@ +using System.IO; +using Moq; +using NUnit.Framework; +using Shouldly; +using SqlDatabase.FileSystem; +using SqlDatabase.TestApi; + +namespace SqlDatabase.Adapter.AssemblyScripts; + +[TestFixture] +public class AssemblyScriptFactoryTest +{ + private AssemblyScriptFactory _sut = null!; + + [SetUp] + public void BeforeEachTest() + { + _sut = new AssemblyScriptFactory("class-name", "method-name"); + } + + [Test] + [TestCase(".EXE", true)] + [TestCase(".dll", true)] + [TestCase(".sql", false)] + [TestCase(null, false)] + public void IsSupported(string? ext, bool expected) + { + var file = new Mock(MockBehavior.Strict); + file + .SetupGet(f => f.Extension) + .Returns(ext!); + + _sut.IsSupported(file.Object).ShouldBe(expected); + } + + [Test] + public void FromFile() + { + var file = FileFactory.File( + "11.dll", + new byte[] { 1, 2, 3 }, + FileFactory.Folder("name", FileFactory.File("11.txt", "3, 2, 1"))); + + var script = _sut.FromFile(file).ShouldBeOfType(); + + script.DisplayName.ShouldBe("11.dll"); + script.ClassName.ShouldBe("class-name"); + script.MethodName.ShouldBe("method-name"); + script.ReadAssemblyContent().ShouldBe(new byte[] { 1, 2, 3 }); + new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptTest.cs similarity index 70% rename from Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptTest.cs index f3b6e895..0a1a2862 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyScriptTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/AssemblyScriptTest.cs @@ -6,16 +6,14 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Configuration; -using SqlDatabase.Scripts.AssemblyInternal; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class AssemblyScriptTest { private AssemblyScript _sut = null!; - private Variables _variables = null!; + private Mock _variables = null!; private Mock _log = null!; private Mock _command = null!; @@ -25,7 +23,7 @@ public class AssemblyScriptTest [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); _logOutput = new List(); _log = new Mock(MockBehavior.Strict); @@ -41,17 +39,23 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(0); - _sut = new AssemblyScript("dummy", null!, null!, new AssemblyScriptConfiguration()); + _sut = new AssemblyScript("dummy", null, null, null!, null!); } [Test] public void ExecuteExampleMsSql() { - _sut.Configuration.ClassName = "MsSql.SqlDatabaseScript"; - - _variables.DatabaseName = "dbName"; - _variables.CurrentVersion = "1.0"; - _variables.TargetVersion = "2.0"; + _sut.ClassName = "MsSql.SqlDatabaseScript"; + + _variables + .Setup(v => v.GetValue("DatabaseName")) + .Returns("dbName"); + _variables + .Setup(v => v.GetValue("CurrentVersion")) + .Returns("1.0"); + _variables + .Setup(v => v.GetValue("TargetVersion")) + .Returns("2.0"); _sut.DisplayName = "2.1_2.2.dll"; _sut.ReadAssemblyContent = () => File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.1_2.2.dll")); @@ -60,7 +64,7 @@ public void ExecuteExampleMsSql() using (new ConsoleListener(_log.Object)) #endif { - _sut.Execute(new DbCommandStub(_command.Object), _variables, _log.Object); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object, _log.Object); } _logOutput.ShouldContain("start execution"); @@ -77,11 +81,17 @@ public void ExecuteExampleMsSql() [Test] public void ExecuteExamplePgSql() { - _sut.Configuration.ClassName = "PgSql.SqlDatabaseScript"; - - _variables.DatabaseName = "dbName"; - _variables.CurrentVersion = "1.0"; - _variables.TargetVersion = "2.0"; + _sut.ClassName = "PgSql.SqlDatabaseScript"; + + _variables + .Setup(v => v.GetValue("DatabaseName")) + .Returns("dbName"); + _variables + .Setup(v => v.GetValue("CurrentVersion")) + .Returns("1.0"); + _variables + .Setup(v => v.GetValue("TargetVersion")) + .Returns("2.0"); _sut.DisplayName = "2.1_2.2.dll"; _sut.ReadAssemblyContent = () => File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "2.1_2.2.dll")); @@ -90,7 +100,7 @@ public void ExecuteExamplePgSql() using (new ConsoleListener(_log.Object)) #endif { - _sut.Execute(new DbCommandStub(_command.Object), _variables, _log.Object); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object, _log.Object); } _logOutput.ShouldContain("start execution"); @@ -109,7 +119,7 @@ public void FailToResolveExecutor() { var domain = new Mock(MockBehavior.Strict); domain - .Setup(d => d.ResolveScriptExecutor(_sut.Configuration.ClassName, _sut.Configuration.MethodName)) + .Setup(d => d.ResolveScriptExecutor(_sut.ClassName, _sut.MethodName)) .Returns(false); Assert.Throws(() => _sut.ResolveScriptExecutor(domain.Object)); @@ -120,10 +130,10 @@ public void FailOnExecute() { var domain = new Mock(MockBehavior.Strict); domain - .Setup(d => d.Execute(_command.Object, _variables)) + .Setup(d => d.Execute(_command.Object, _variables.Object)) .Returns(false); - Assert.Throws(() => _sut.Execute(domain.Object, _command.Object, _variables)); + Assert.Throws(() => _sut.Execute(domain.Object, _command.Object, _variables.Object)); } [Test] @@ -131,25 +141,18 @@ public void ExecuteWhatIf() { var domain = new Mock(MockBehavior.Strict); - _sut.Execute(domain.Object, null, _variables); + _sut.Execute(domain.Object, null, _variables.Object); } [Test] public void GetDependencies() { - var description = Encoding.Default.GetBytes(@" --- module dependency: a 1.0 --- module dependency: b 1.0"); - - _sut.ReadDescriptionContent = () => new MemoryStream(description); + _sut.ReadDescriptionContent = () => new MemoryStream(Encoding.Default.GetBytes("content")); var actual = _sut.GetDependencies(); - actual.ShouldBe(new[] - { - new ScriptDependency("a", new Version("1.0")), - new ScriptDependency("b", new Version("1.0")) - }); + actual.ShouldNotBeNull(); + actual.ReadToEnd().ShouldBe("content"); } [Test] @@ -159,6 +162,6 @@ public void GetDependenciesNoDescription() var actual = _sut.GetDependencies(); - actual.ShouldBeEmpty(); + actual.ShouldBeNull(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DbCommandStub.cs similarity index 97% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DbCommandStub.cs index fb8ce8c2..bf46fbc9 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DbCommandStub.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DbCommandStub.cs @@ -4,7 +4,7 @@ #pragma warning disable CS8765 // Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes). -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class DbCommandStub : DbCommand { diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs similarity index 97% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs index 500af1a6..c90ca947 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/DefaultEntryPointTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs @@ -4,7 +4,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class DefaultEntryPointTest diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.Stubs.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.Stubs.cs similarity index 95% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.Stubs.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.Stubs.cs index eb67a118..399a8a9d 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.Stubs.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.Stubs.cs @@ -3,7 +3,7 @@ using System.Data; using System.Data.SqlClient; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; public partial class EntryPointResolverTest { diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs similarity index 64% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs index 9de06b3c..f75f56b6 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/EntryPointResolverTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs @@ -4,7 +4,7 @@ using NUnit.Framework; using Shouldly; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public partial class EntryPointResolverTest @@ -38,17 +38,17 @@ public void BeforeEachTest() [Test] [TestCase(nameof(ExampleSqlDatabaseScript))] [TestCase(nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] - [TestCase("AssemblyInternal." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] - [TestCase("Scripts.AssemblyInternal." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] - [TestCase("SqlDatabase.Scripts.AssemblyInternal." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] + [TestCase("AssemblyScripts." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] + [TestCase("Adapter.AssemblyScripts." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] + [TestCase("SqlDatabase.Adapter.AssemblyScripts." + nameof(EntryPointResolverTest) + "+" + nameof(ExampleSqlDatabaseScript))] public void ResolveFromExample(string className) { _sut.ExecutorClassName = className; _sut.ExecutorMethodName = nameof(ExampleSqlDatabaseScript.Execute); var actual = _sut.Resolve(GetType().Assembly); - CollectionAssert.IsEmpty(_logErrorOutput); - Assert.IsInstanceOf(actual); + _logErrorOutput.ShouldBeEmpty(); + actual.ShouldBeAssignableTo(); var entryPoint = (DefaultEntryPoint)actual!; entryPoint.Log.ShouldNotBeNull(); @@ -62,8 +62,8 @@ public void FailToCreateInstance() _sut.ExecutorClassName = nameof(DatabaseScriptWithInvalidConstructor); _sut.ExecutorMethodName = nameof(DatabaseScriptWithInvalidConstructor.Execute); - Assert.IsNull(_sut.Resolve(GetType().Assembly)); - CollectionAssert.IsNotEmpty(_logErrorOutput); + _sut.Resolve(GetType().Assembly).ShouldBeNull(); + _logErrorOutput.ShouldNotBeEmpty(); } [Test] @@ -73,13 +73,12 @@ public void ResolveExecuteWithCommandOnly() _sut.ExecutorMethodName = nameof(DatabaseScriptWithOneParameter.ExecuteCommand); var actual = _sut.Resolve(GetType().Assembly); - CollectionAssert.IsEmpty(_logErrorOutput); - Assert.IsInstanceOf(actual); + _logErrorOutput.ShouldBeEmpty(); - var entryPoint = (DefaultEntryPoint)actual!; - Assert.IsNotNull(entryPoint.Log); - Assert.IsInstanceOf(entryPoint.ScriptInstance); - Assert.IsNotNull(entryPoint.Method); + var entryPoint = actual.ShouldBeOfType(); + entryPoint.Log.ShouldNotBeNull(); + entryPoint.ScriptInstance.ShouldBeOfType(); + entryPoint.Method.ShouldNotBeNull(); } [Test] @@ -89,12 +88,11 @@ public void ResolveExecuteWithConnection() _sut.ExecutorMethodName = nameof(DatabaseScriptWithConnection.Run); var actual = _sut.Resolve(GetType().Assembly); - CollectionAssert.IsEmpty(_logErrorOutput); - Assert.IsInstanceOf(actual); + _logErrorOutput.ShouldBeEmpty(); - var entryPoint = (DefaultEntryPoint)actual!; - Assert.IsNotNull(entryPoint.Log); - Assert.IsInstanceOf(entryPoint.ScriptInstance); - Assert.IsNotNull(entryPoint.Method); + var entryPoint = actual.ShouldBeOfType(); + entryPoint.Log.ShouldNotBeNull(); + entryPoint.ScriptInstance.ShouldBeOfType(); + entryPoint.Method.ShouldNotBeNull(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandDictionaryTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandDictionaryTest.cs index c9376acb..a8d70899 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionaryTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandDictionaryTest.cs @@ -4,7 +4,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class ExecuteMethodResolverCommandDictionaryTest diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandTest.cs similarity index 95% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandTest.cs index 3f02f075..81335baf 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverCommandTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverCommandTest.cs @@ -3,7 +3,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class ExecuteMethodResolverCommandTest diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDbConnectionTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDbConnectionTest.cs index 3b5dde95..ace9f95d 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnectionTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDbConnectionTest.cs @@ -3,7 +3,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class ExecuteMethodResolverDbConnectionTest diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDictionaryCommandTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDictionaryCommandTest.cs index 01efd735..87ea00f0 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommandTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverDictionaryCommandTest.cs @@ -4,7 +4,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class ExecuteMethodResolverDictionaryCommandTest diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs index 3b8aba0b..946e1ec6 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnectionTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs @@ -4,7 +4,7 @@ using Moq; using NUnit.Framework; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; [TestFixture] public class ExecuteMethodResolverSqlConnectionTest diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.StepWithSubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.StepWithSubDomain.cs new file mode 100644 index 00000000..c7d0a033 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.StepWithSubDomain.cs @@ -0,0 +1,65 @@ +#if NET472 +using System; +using System.Data; +using System.IO; + +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; + +public partial class Net472SubDomainTest +{ + public sealed class StepWithSubDomain + { + public void ShowAppBase(IDbCommand command) + { + var assembly = GetType().Assembly; + + command.CommandText = assembly.Location; + command.ExecuteNonQuery(); + + command.CommandText = AppDomain.CurrentDomain.BaseDirectory; + command.ExecuteNonQuery(); + } + + public void ShowConfiguration(IDbCommand command) + { + command.CommandText = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; + command.ExecuteNonQuery(); + + command.CommandText = "do something"; + command.ExecuteNonQuery(); + } + + public void Execute(IDbCommand command) + { + var assembly = GetType().Assembly; + + var setup = new AppDomainSetup + { + ApplicationBase = Path.GetDirectoryName(assembly.Location), + ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile + }; + + var domain = AppDomain.CreateDomain("StepWithSubDomain", null, setup); + try + { + var agent = (StepDomainAgent)domain.CreateInstanceFromAndUnwrap(assembly.Location, typeof(StepDomainAgent).FullName); + + command.CommandText = agent.Hello(); + command.ExecuteNonQuery(); + } + finally + { + AppDomain.Unload(domain); + } + } + } + + public sealed class StepDomainAgent : MarshalByRefObject + { + public string Hello() + { + return "hello"; + } + } +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs similarity index 92% rename from Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs index 294c9940..6a113fcf 100644 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs @@ -8,13 +8,13 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472; +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; [TestFixture] public partial class Net472SubDomainTest { private Net472SubDomain _sut = null!; - private Variables _variables = null!; + private Mock _variables = null!; private Mock _command = null!; private IList _executedScripts = null!; @@ -22,7 +22,7 @@ public partial class Net472SubDomainTest [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); var log = new Mock(MockBehavior.Strict); log @@ -59,7 +59,7 @@ public void AfterEachTest() public void ValidateScriptDomainAppBase() { _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowAppBase)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _sut.Unload(); _sut.Dispose(); @@ -78,7 +78,7 @@ public void ValidateScriptDomainAppBase() public void ValidateScriptDomainConfiguration() { _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowConfiguration)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _sut.Unload(); _sut.Dispose(); @@ -88,14 +88,14 @@ public void ValidateScriptDomainConfiguration() configurationFile.ShouldBe(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); var connectionString = _executedScripts[1]; - connectionString.ShouldBe(MsSqlQuery.ConnectionString); + connectionString.ShouldBe("do something"); } [Test] public void ValidateScriptDomainCreateSubDomain() { _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.Execute)); - _sut.Execute(new DbCommandStub(_command.Object), _variables); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _executedScripts.Count.ShouldBe(1); _executedScripts[0].ShouldBe("hello"); diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj new file mode 100644 index 00000000..cbde9d41 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj @@ -0,0 +1,28 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.AssemblyScripts + ..\..\bin\Tests + NU1702 + + + + + + + + + + + + + + + + + Component + + + + diff --git a/Sources/SqlDatabase/Scripts/AssemblyScript.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs similarity index 63% rename from Sources/SqlDatabase/Scripts/AssemblyScript.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs index dd496501..d4a4244c 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyScript.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs @@ -2,34 +2,38 @@ using System.Collections.Generic; using System.Data; using System.IO; -using System.Linq; -using SqlDatabase.Configuration; -using SqlDatabase.Scripts.AssemblyInternal; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class AssemblyScript : IScript { + private const string DefaultClassName = "SqlDatabaseScript"; + private const string DefaultMethodName = "Execute"; + public AssemblyScript( string displayName, + string? className, + string? methodName, Func readAssemblyContent, - Func readDescriptionContent, - AssemblyScriptConfiguration configuration) + Func readDescriptionContent) { DisplayName = displayName; + ClassName = string.IsNullOrWhiteSpace(className) ? DefaultClassName : className!; + MethodName = string.IsNullOrWhiteSpace(methodName) ? DefaultMethodName : methodName!; ReadAssemblyContent = readAssemblyContent; ReadDescriptionContent = readDescriptionContent; - Configuration = configuration; } public string DisplayName { get; set; } + public string ClassName { get; set; } + + public string MethodName { get; set; } + public Func ReadAssemblyContent { get; internal set; } public Func ReadDescriptionContent { get; internal set; } - public AssemblyScriptConfiguration Configuration { get; } - public void Execute(IDbCommand? command, IVariables variables, ILogger logger) { var domain = CreateSubDomain(logger); @@ -54,25 +58,20 @@ public IEnumerable ExecuteReader(IDbCommand command, IVariables var throw new NotSupportedException("Assembly script does not support readers."); } - public IList GetDependencies() + public TextReader? GetDependencies() { - using (var description = ReadDescriptionContent()) + var description = ReadDescriptionContent(); + if (description == null) { - if (description == null) - { - return Array.Empty(); - } - - using (var reader = new StreamReader(description)) - { - return DependencyParser.ExtractDependencies(reader, DisplayName).ToArray(); - } + return null; } + + return new StreamReader(description); } internal void ResolveScriptExecutor(ISubDomain domain) { - if (!domain.ResolveScriptExecutor(Configuration.ClassName, Configuration.MethodName)) + if (!domain.ResolveScriptExecutor(ClassName, MethodName)) { throw new InvalidOperationException("Fail to resolve script executor."); } @@ -89,9 +88,9 @@ internal void Execute(ISubDomain domain, IDbCommand? command, IVariables variabl private ISubDomain CreateSubDomain(ILogger logger) { #if NET472 - return new AssemblyInternal.Net472.Net472SubDomain(logger, DisplayName, ReadAssemblyContent); + return new Net472.Net472SubDomain(logger, DisplayName, ReadAssemblyContent); #else - return new AssemblyInternal.NetCore.NetCoreSubDomain(logger, DisplayName, ReadAssemblyContent); + return new NetCore.NetCoreSubDomain(logger, DisplayName, ReadAssemblyContent); #endif } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs new file mode 100644 index 00000000..6f3fdd38 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs @@ -0,0 +1,67 @@ +using System; +using System.IO; +using System.Linq; +using SqlDatabase.FileSystem; + +namespace SqlDatabase.Adapter.AssemblyScripts; + +public sealed class AssemblyScriptFactory : IScriptFactory +{ + private readonly string? _configurationClassName; + private readonly string? _configurationMethodName; + + public AssemblyScriptFactory(string? configurationClassName, string? configurationMethodName) + { + _configurationClassName = configurationClassName; + _configurationMethodName = configurationMethodName; + } + + public bool IsSupported(IFile file) + { + return ".exe".Equals(file.Extension, StringComparison.OrdinalIgnoreCase) + || ".dll".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); + } + + public IScript FromFile(IFile file) + { + return new AssemblyScript( + file.Name, + _configurationClassName, + _configurationMethodName, + CreateBinaryReader(file), + CreateScriptDescriptionReader(file)); + } + + private static Func CreateBinaryReader(IFile file) + { + return () => BinaryRead(file); + } + + private static byte[] BinaryRead(IFile file) + { + using (var source = file.OpenRead()) + using (var dest = new MemoryStream()) + { + source.CopyTo(dest); + + return dest.ToArray(); + } + } + + private static Func CreateScriptDescriptionReader(IFile file) + { + return () => + { + var parent = file.GetParent(); + if (parent == null) + { + return null; + } + + var descriptionName = Path.GetFileNameWithoutExtension(file.Name) + ".txt"; + var description = parent.GetFiles().FirstOrDefault(i => string.Equals(descriptionName, i.Name, StringComparison.OrdinalIgnoreCase)); + + return description?.OpenRead(); + }; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/AllowNullAttribute.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/AllowNullAttribute.cs new file mode 100644 index 00000000..39be8db8 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/AllowNullAttribute.cs @@ -0,0 +1,8 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] +internal sealed class AllowNullAttribute : Attribute +{ +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/NotNullWhenAttribute.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/NotNullWhenAttribute.cs new file mode 100644 index 00000000..e3d56cf7 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/CodeAnalysis/NotNullWhenAttribute.cs @@ -0,0 +1,10 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +internal sealed class NotNullWhenAttribute : Attribute +{ + public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; + + public bool ReturnValue { get; } +} +#endif diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ConsoleListener.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ConsoleListener.cs index f848a83d..1909d299 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ConsoleListener.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ConsoleListener.cs @@ -3,7 +3,7 @@ using System.IO; using System.Text; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class ConsoleListener : TextWriter { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/DefaultEntryPoint.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/DefaultEntryPoint.cs index 52ec0777..5870beae 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/DefaultEntryPoint.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/DefaultEntryPoint.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Data; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class DefaultEntryPoint : IEntryPoint { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/EntryPointResolver.cs similarity index 88% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/EntryPointResolver.cs index d6dab434..d7d0208a 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/EntryPointResolver.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/EntryPointResolver.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Text; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class EntryPointResolver { @@ -58,7 +58,7 @@ public EntryPointResolver(ILogger log, string executorClassName, string executor } catch (Exception ex) { - Log.Error("Fail to create instance of {0}.".FormatWith(type.FullName), ex); + Log.Error($"Fail to create instance of {type.FullName}.", ex); return null; } @@ -83,13 +83,13 @@ public EntryPointResolver(ILogger log, string executorClassName, string executor var candidates = filter.ToList(); if (candidates.Count == 0) { - Log.Error("public class {0} not found.".FormatWith(ExecutorClassName)); + Log.Error($"public class {ExecutorClassName} not found."); return null; } if (candidates.Count != 1) { - Log.Error("There are {0} items with signature public class {1}.".FormatWith(candidates.Count, ExecutorClassName)); + Log.Error($"There are {candidates.Count} items with signature public class {ExecutorClassName}."); return null; } @@ -130,7 +130,7 @@ private ExecuteMethodRef ResolveMethod(Type type) if (methods.Count == 0) { - Log.Error("public void {0}(IDbCommand command, IReadOnlyDictionary variables) not found in {1}.".FormatWith(ExecutorMethodName, type)); + Log.Error($"public void {ExecutorMethodName}(IDbCommand command, IReadOnlyDictionary variables) not found in {type}."); } return methods[0]!; diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverBase.cs similarity index 87% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverBase.cs index 63fb6b0b..9495dfc9 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverBase.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverBase.cs @@ -3,7 +3,7 @@ using System.Data; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal abstract class ExecuteMethodResolverBase { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommand.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommand.cs index 9c7e963f..8c80f335 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommand.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommand.cs @@ -3,7 +3,7 @@ using System.Data; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; // public void Execute(IDbCommand command) internal sealed class ExecuteMethodResolverCommand : ExecuteMethodResolverBase diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommandDictionary.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommandDictionary.cs index c471403d..37881270 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverCommandDictionary.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverCommandDictionary.cs @@ -3,7 +3,7 @@ using System.Data; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; // public void Execute(IDbCommand command, IReadOnlyDictionary variables) internal sealed class ExecuteMethodResolverCommandDictionary : ExecuteMethodResolverBase diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDbConnection.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDbConnection.cs index 69dc8c9f..e5d156ef 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDbConnection.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDbConnection.cs @@ -3,7 +3,7 @@ using System.Data; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; // public void Execute(IDbConnection connection) internal sealed class ExecuteMethodResolverDbConnection : ExecuteMethodResolverBase diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDictionaryCommand.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDictionaryCommand.cs index ca3ced47..891c7d5c 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverDictionaryCommand.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverDictionaryCommand.cs @@ -3,7 +3,7 @@ using System.Data; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; // public void Execute(IReadOnlyDictionary variables, IDbCommand command) internal sealed class ExecuteMethodResolverDictionaryCommand : ExecuteMethodResolverBase diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs index 5d2a18a4..d0dacf35 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ExecuteMethodResolverSqlConnection.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs @@ -4,7 +4,7 @@ using System.Data.SqlClient; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; // public void Execute(SqlConnection connection) internal sealed class ExecuteMethodResolverSqlConnection : ExecuteMethodResolverBase diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/IEntryPoint.cs similarity index 78% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/IEntryPoint.cs index c65e5705..3e2dcde7 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/IEntryPoint.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/IEntryPoint.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Data; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal interface IEntryPoint { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ISubDomain.cs similarity index 84% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/ISubDomain.cs index 2a040197..54bc68ae 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/ISubDomain.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ISubDomain.cs @@ -1,7 +1,7 @@ using System; using System.Data; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal interface ISubDomain : IDisposable { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainAgent.cs similarity index 97% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainAgent.cs index 3029116a..cc530ae1 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainAgent.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainAgent.cs @@ -5,7 +5,7 @@ using System.IO; using System.Reflection; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472; +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; internal sealed class DomainAgent : MarshalByRefObject { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainDirectory.cs similarity index 78% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainDirectory.cs index a62be8a9..fb6a52ad 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/DomainDirectory.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/DomainDirectory.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472; +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; internal sealed class DomainDirectory : IDisposable { @@ -26,7 +26,7 @@ public string SaveFile(byte[] content, string fileName) } catch (Exception ex) { - _logger.Error("Fail to copy content of [{0}]: {1}".FormatWith(fileName, ex.Message)); + _logger.Error($"Fail to copy content of [{fileName}]: {ex.Message}"); File.Delete(location); throw; } @@ -44,7 +44,7 @@ public void Dispose() } catch (Exception ex) { - _logger.Info("Fail to delete assembly content from {0}: {1}".FormatWith(Location, ex.Message)); + _logger.Info($"Fail to delete assembly content from {Location}: {ex.Message}"); } } } diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/LoggerProxy.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/LoggerProxy.cs index 2b01a076..824ccf2e 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/LoggerProxy.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/LoggerProxy.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472; +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; internal sealed class LoggerProxy : TraceListener, ILogger { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs similarity index 93% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs index 116f6221..622c916b 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/Net472/Net472SubDomain.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs @@ -3,7 +3,7 @@ using System.Data; using System.IO; -namespace SqlDatabase.Scripts.AssemblyInternal.Net472; +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; internal sealed class Net472SubDomain : ISubDomain { @@ -26,7 +26,7 @@ public Net472SubDomain(ILogger logger, string assemblyFileName, Func rea public void Initialize() { - Logger.Info("create domain for {0}".FormatWith(AssemblyFileName)); + Logger.Info($"create domain for {AssemblyFileName}"); var appBaseName = Path.GetFileName(AssemblyFileName); _appBase = new DomainDirectory(Logger); diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/AssemblyContext.cs similarity index 93% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/AssemblyContext.cs index c73ea22f..01d47ab0 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/AssemblyContext.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/AssemblyContext.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Runtime.Loader; -namespace SqlDatabase.Scripts.AssemblyInternal.NetCore; +namespace SqlDatabase.Adapter.AssemblyScripts.NetCore; internal sealed class AssemblyContext : AssemblyLoadContext { diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs similarity index 96% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs index ad87ae34..1f9b7589 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/NetCore/NetCoreSubDomain.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs @@ -2,7 +2,7 @@ using System; using System.Data; -namespace SqlDatabase.Scripts.AssemblyInternal.NetCore; +namespace SqlDatabase.Adapter.AssemblyScripts.NetCore; internal sealed class NetCoreSubDomain : ISubDomain { diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9ba8ed0b --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.AssemblyScripts.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj new file mode 100644 index 00000000..3d17b002 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj @@ -0,0 +1,16 @@ + + + + net472;netstandard2.0 + + + + + + + + + + + + diff --git a/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/VariablesProxy.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs rename to Sources/SqlDatabase.Adapter.AssemblyScripts/VariablesProxy.cs index f38c8bd8..de7598a2 100644 --- a/Sources/SqlDatabase/Scripts/AssemblyInternal/VariablesProxy.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/VariablesProxy.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace SqlDatabase.Scripts.AssemblyInternal; +namespace SqlDatabase.Adapter.AssemblyScripts; internal sealed class VariablesProxy : MarshalByRefObject, IReadOnlyDictionary { diff --git a/Sources/SqlDatabase/ILogger.cs b/Sources/SqlDatabase.Adapter/ILogger.cs similarity index 81% rename from Sources/SqlDatabase/ILogger.cs rename to Sources/SqlDatabase.Adapter/ILogger.cs index 758015ec..bbc101a6 100644 --- a/Sources/SqlDatabase/ILogger.cs +++ b/Sources/SqlDatabase.Adapter/ILogger.cs @@ -1,6 +1,6 @@ using System; -namespace SqlDatabase; +namespace SqlDatabase.Adapter; public interface ILogger { diff --git a/Sources/SqlDatabase/Scripts/IScript.cs b/Sources/SqlDatabase.Adapter/IScript.cs similarity index 78% rename from Sources/SqlDatabase/Scripts/IScript.cs rename to Sources/SqlDatabase.Adapter/IScript.cs index c4118f61..e842c882 100644 --- a/Sources/SqlDatabase/Scripts/IScript.cs +++ b/Sources/SqlDatabase.Adapter/IScript.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Data; +using System.IO; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter; public interface IScript { @@ -11,5 +12,5 @@ public interface IScript IEnumerable ExecuteReader(IDbCommand command, IVariables variables, ILogger logger); - IList GetDependencies(); + TextReader? GetDependencies(); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/IScriptFactory.cs b/Sources/SqlDatabase.Adapter/IScriptFactory.cs similarity index 60% rename from Sources/SqlDatabase/Scripts/IScriptFactory.cs rename to Sources/SqlDatabase.Adapter/IScriptFactory.cs index f7d991da..b4827922 100644 --- a/Sources/SqlDatabase/Scripts/IScriptFactory.cs +++ b/Sources/SqlDatabase.Adapter/IScriptFactory.cs @@ -1,10 +1,10 @@ using SqlDatabase.FileSystem; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter; public interface IScriptFactory { - bool IsSupported(string fileName); + bool IsSupported(IFile file); IScript FromFile(IFile file); } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/IVariables.cs b/Sources/SqlDatabase.Adapter/IVariables.cs similarity index 66% rename from Sources/SqlDatabase/Scripts/IVariables.cs rename to Sources/SqlDatabase.Adapter/IVariables.cs index 75917c50..a02bd57e 100644 --- a/Sources/SqlDatabase/Scripts/IVariables.cs +++ b/Sources/SqlDatabase.Adapter/IVariables.cs @@ -1,4 +1,4 @@ -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter; public interface IVariables { diff --git a/Sources/SqlDatabase/LoggerExtensions.cs b/Sources/SqlDatabase.Adapter/LoggerExtensions.cs similarity index 91% rename from Sources/SqlDatabase/LoggerExtensions.cs rename to Sources/SqlDatabase.Adapter/LoggerExtensions.cs index 5a9d07c8..a126501a 100644 --- a/Sources/SqlDatabase/LoggerExtensions.cs +++ b/Sources/SqlDatabase.Adapter/LoggerExtensions.cs @@ -1,9 +1,9 @@ using System; using System.Text; -namespace SqlDatabase; +namespace SqlDatabase.Adapter; -internal static class LoggerExtensions +public static class LoggerExtensions { public static void Error(this ILogger logger, string? message, Exception error) { diff --git a/Sources/SqlDatabase.Adapter/SqlDatabase.Adapter.csproj b/Sources/SqlDatabase.Adapter/SqlDatabase.Adapter.csproj new file mode 100644 index 00000000..d9293f13 --- /dev/null +++ b/Sources/SqlDatabase.Adapter/SqlDatabase.Adapter.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.0 + + + + + + + diff --git a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj index b613bfc2..12212618 100644 --- a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj +++ b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj @@ -13,7 +13,6 @@ - diff --git a/Sources/SqlDatabase.FileSystem/FileSystemFile.cs b/Sources/SqlDatabase.FileSystem/FileSystemFile.cs index 65ed1039..1ab6b787 100644 --- a/Sources/SqlDatabase.FileSystem/FileSystemFile.cs +++ b/Sources/SqlDatabase.FileSystem/FileSystemFile.cs @@ -8,12 +8,15 @@ public FileSystemFile(string location) { Location = location; Name = Path.GetFileName(location); + Extension = Path.GetExtension(Name); } public string Name { get; } public string Location { get; } + public string Extension { get; } + public IFolder GetParent() { return new FileSystemFolder(Path.GetDirectoryName(Location)!); diff --git a/Sources/SqlDatabase.FileSystem/IFile.cs b/Sources/SqlDatabase.FileSystem/IFile.cs index 6fe021bb..1d095d54 100644 --- a/Sources/SqlDatabase.FileSystem/IFile.cs +++ b/Sources/SqlDatabase.FileSystem/IFile.cs @@ -4,6 +4,8 @@ namespace SqlDatabase.FileSystem; public interface IFile : IFileSystemInfo { + string Extension { get; } + IFolder? GetParent(); Stream OpenRead(); diff --git a/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs b/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs index 780a1de5..22007008 100644 --- a/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs +++ b/Sources/SqlDatabase.FileSystem/InLineScriptFile.cs @@ -9,12 +9,15 @@ public InLineScriptFile(string name, string content) { Name = name; Content = content; + Extension = Path.GetExtension(name); } public string Name { get; } public string Content { get; } + public string Extension { get; } + public IFolder? GetParent() => null; public Stream OpenRead() diff --git a/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs b/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs index f0cf1835..00088c2e 100644 --- a/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs +++ b/Sources/SqlDatabase.FileSystem/ZipFolderFile.cs @@ -16,12 +16,15 @@ public ZipFolderFile(ZipFolder container, IFolder parent, string entryFullName) EntryFullName = entryFullName; Name = Path.GetFileName(entryFullName); + Extension = Path.GetExtension(Name); } public string Name { get; } public string EntryFullName { get; } + public string Extension { get; } + public IFolder GetParent() => _parent; public Stream OpenRead() diff --git a/Sources/SqlDatabase.PowerShell/Internal/SqlDatabaseProgram.cs b/Sources/SqlDatabase.PowerShell/Internal/SqlDatabaseProgram.cs index 693a0c28..0dba068e 100644 --- a/Sources/SqlDatabase.PowerShell/Internal/SqlDatabaseProgram.cs +++ b/Sources/SqlDatabase.PowerShell/Internal/SqlDatabaseProgram.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Configuration; +using SqlDatabase.Adapter; +using SqlDatabase.Configuration; namespace SqlDatabase.PowerShell.Internal; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index 2c5aea2c..93d7a344 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -2,6 +2,7 @@ using System.Configuration; using Moq; using NUnit.Framework; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs index 4d32f0b3..50186647 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs @@ -1,6 +1,7 @@ using System; using Moq; using NUnit.Framework; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index 7c501619..16ac62ca 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -3,6 +3,7 @@ using System.IO; using Moq; using NUnit.Framework; +using SqlDatabase.Adapter; using SqlDatabase.Export; using SqlDatabase.Scripts; using SqlDatabase.Scripts.MsSql; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs index 1205edef..526f4f20 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs @@ -1,6 +1,7 @@ using System; using Moq; using NUnit.Framework; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Configuration/AppConfigurationTest.cs b/Sources/SqlDatabase.Test/Configuration/AppConfigurationTest.cs index ccaa2681..018af9c6 100644 --- a/Sources/SqlDatabase.Test/Configuration/AppConfigurationTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/AppConfigurationTest.cs @@ -26,8 +26,8 @@ public void LoadDefault() configuration.GetCurrentVersionScript.ShouldBeNullOrEmpty(); configuration.SetCurrentVersionScript.ShouldBeNullOrEmpty(); - configuration.AssemblyScript.ClassName.ShouldBe("SqlDatabaseScript"); - configuration.AssemblyScript.MethodName.ShouldBe("Execute"); + configuration.AssemblyScript.ClassName.ShouldBeNullOrEmpty(); + configuration.AssemblyScript.MethodName.ShouldBeNullOrEmpty(); configuration.Variables.Count.ShouldBe(0); diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs index d96eec4d..abaf0621 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs @@ -3,6 +3,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs index d5a9c6dd..68c56e72 100644 --- a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs @@ -1,6 +1,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs index ab4c884d..8871e0a4 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs @@ -1,6 +1,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs index 13e83637..4be3077a 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs @@ -2,6 +2,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Export; using SqlDatabase.FileSystem; diff --git a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs index 8112d2a6..e9d0150a 100644 --- a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs @@ -1,6 +1,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs b/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs index 11be0955..d80127e2 100644 --- a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs @@ -2,6 +2,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; namespace SqlDatabase.Export; diff --git a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs index 48cb9dbe..cdcf0150 100644 --- a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.MsSql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs index 76ba48e1..6bb17c6b 100644 --- a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.MySql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs index b99e8cb2..28f1b151 100644 --- a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs @@ -9,6 +9,7 @@ using NpgsqlTypes; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.PgSql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs index 67e26ba5..2d95a8aa 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts; using SqlDatabase.Scripts.MsSql; diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs index ac585cc6..634f98b8 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs @@ -6,6 +6,7 @@ using MySqlConnector; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts; using SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs index f5167c33..47e9b898 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs @@ -6,6 +6,7 @@ using Npgsql; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts; using SqlDatabase.Scripts.PgSql; diff --git a/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs b/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs index 73f191b3..5e887bb0 100644 --- a/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Log/CombinedLoggerTest.cs @@ -2,6 +2,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; namespace SqlDatabase.Log; diff --git a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs b/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs deleted file mode 100644 index dd36e244..00000000 --- a/Sources/SqlDatabase.Test/Scripts/AssemblyInternal/Net472/Net472SubDomainTest.StepWithSubDomain.cs +++ /dev/null @@ -1,67 +0,0 @@ -#if NET472 -using System; -using System.Data; -using System.IO; -using SqlDatabase.TestApi; - -namespace SqlDatabase.Scripts.AssemblyInternal.Net472 -{ - public partial class Net472SubDomainTest - { - public sealed class StepWithSubDomain - { - public void ShowAppBase(IDbCommand command) - { - var assembly = GetType().Assembly; - - command.CommandText = assembly.Location; - command.ExecuteNonQuery(); - - command.CommandText = AppDomain.CurrentDomain.BaseDirectory; - command.ExecuteNonQuery(); - } - - public void ShowConfiguration(IDbCommand command) - { - command.CommandText = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; - command.ExecuteNonQuery(); - - command.CommandText = MsSqlQuery.ConnectionString; - command.ExecuteNonQuery(); - } - - public void Execute(IDbCommand command) - { - var assembly = GetType().Assembly; - - var setup = new AppDomainSetup - { - ApplicationBase = Path.GetDirectoryName(assembly.Location), - ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile - }; - - var domain = AppDomain.CreateDomain("StepWithSubDomain", null, setup); - try - { - var agent = (StepDomainAgent)domain.CreateInstanceFromAndUnwrap(assembly.Location, typeof(StepDomainAgent).FullName); - - command.CommandText = agent.Hello(); - command.ExecuteNonQuery(); - } - finally - { - AppDomain.Unload(domain); - } - } - } - - public sealed class StepDomainAgent : MarshalByRefObject - { - public string Hello() - { - return "hello"; - } - } - } -} -#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs index 78a961ed..e15d7ee5 100644 --- a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; -using System.IO; using System.Linq; using Moq; using NUnit.Framework; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.TestApi; @@ -18,8 +18,8 @@ public void BeforeEachTest() { var scriptFactory = new Mock(MockBehavior.Strict); scriptFactory - .Setup(f => f.IsSupported(It.IsAny())) - .Returns(s => ".sql".Equals(Path.GetExtension(s)) || ".exe".Equals(Path.GetExtension(s))); + .Setup(f => f.IsSupported(It.IsAny())) + .Returns(f => ".sql".Equals(f.Extension) || ".exe".Equals(f.Extension)); scriptFactory .Setup(s => s.FromFile(It.IsNotNull())) diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index d26e4a35..92820615 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -3,6 +3,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts.MsSql; using SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs index aa74ddc0..74cf7b95 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs index 387924dc..3503a9ce 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs index c45bbd58..efa0f6c1 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.MsSql; diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs index 1c845605..498ee3c7 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs index 9af69c77..d7eca3fe 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs @@ -4,6 +4,7 @@ using MySqlConnector; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs index 04d6caeb..c7621f15 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs index 89f36e68..072f33be 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs @@ -4,6 +4,7 @@ using Npgsql; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.PgSql; diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs index d5ee5e28..6a2bea7e 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs index 4a0f3835..6fd1d057 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.PowerShellInternal; namespace SqlDatabase.Scripts; @@ -102,19 +103,12 @@ public void ExecuteIgnoreWhatIf() [Test] public void GetDependencies() { - var description = Encoding.Default.GetBytes(@" --- module dependency: a 1.0 --- module dependency: b 1.0"); - - _sut.ReadDescriptionContent = () => new MemoryStream(description); + _sut.ReadDescriptionContent = () => new MemoryStream(Encoding.Default.GetBytes("dependencies")); var actual = _sut.GetDependencies(); - actual.ShouldBe(new[] - { - new ScriptDependency("a", new Version("1.0")), - new ScriptDependency("b", new Version("1.0")) - }); + actual.ShouldNotBeNull(); + actual.ReadToEnd().ShouldBe("dependencies"); } [Test] @@ -124,6 +118,6 @@ public void GetDependenciesNoDescription() var actual = _sut.GetDependencies(); - actual.ShouldBeEmpty(); + actual.ShouldBeNull(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs index 4927b34f..0724f4cc 100644 --- a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs @@ -31,7 +31,7 @@ public void FromSqlFile() { var file = FileFactory.File("11.sql", "some script"); - _sut.IsSupported(file.Name).ShouldBeTrue(); + _sut.IsSupported(file).ShouldBeTrue(); var script = _sut.FromFile(file).ShouldBeOfType(); @@ -40,42 +40,6 @@ public void FromSqlFile() new StreamReader(script.ReadSqlContent()).ReadToEnd().ShouldBe("some script"); } - [Test] - public void FromDllFile() - { - var file = FileFactory.File( - "11.dll", - new byte[] { 1, 2, 3 }, - FileFactory.Folder("name", FileFactory.File("11.txt", "3, 2, 1"))); - - _sut.IsSupported(file.Name).ShouldBeTrue(); - - var script = _sut.FromFile(file).ShouldBeOfType(); - - script!.DisplayName.ShouldBe("11.dll"); - script.Configuration.ShouldBe(_configuration); - script.ReadAssemblyContent().ShouldBe(new byte[] { 1, 2, 3 }); - new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); - } - - [Test] - public void FromExeFile() - { - var file = FileFactory.File( - "11.exe", - new byte[] { 1, 2, 3 }, - FileFactory.Folder("name")); - - _sut.IsSupported(file.Name).ShouldBeTrue(); - - var script = _sut.FromFile(file).ShouldBeOfType(); - - script.DisplayName.ShouldBe("11.exe"); - script.Configuration.ShouldBe(_configuration); - script.ReadAssemblyContent().ShouldBe(new byte[] { 1, 2, 3 }); - script.ReadDescriptionContent().ShouldBeNull(); - } - [Test] public void FromPs1File() { @@ -87,7 +51,7 @@ public void FromPs1File() _powerShellFactory .Setup(f => f.Request()); - _sut.IsSupported(file.Name).ShouldBeTrue(); + _sut.IsSupported(file).ShouldBeTrue(); var script = _sut.FromFile(file).ShouldBeOfType(); @@ -104,7 +68,7 @@ public void FromPs1FileNotSupported() var file = FileFactory.File("11.ps1", "some script"); _sut.PowerShellFactory = null; - _sut.IsSupported(file.Name).ShouldBeFalse(); + _sut.IsSupported(file).ShouldBeFalse(); Assert.Throws(() => _sut.FromFile(file)); } @@ -114,7 +78,7 @@ public void FromFileNotSupported() { var file = FileFactory.File("11.txt"); - _sut.IsSupported(file.Name).ShouldBeFalse(); + _sut.IsSupported(file).ShouldBeFalse(); Assert.Throws(() => _sut.FromFile(file)); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs b/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs index 30bba272..933abecf 100644 --- a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs @@ -2,6 +2,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs b/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs index 0468e90d..7f6a2cf0 100644 --- a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs @@ -7,6 +7,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.MsSql; using SqlDatabase.TestApi; @@ -152,6 +153,7 @@ public void GetDependencies() var actual = _sut.GetDependencies(); - actual.ShouldBe(new[] { new ScriptDependency("a", new Version("1.0")) }); + actual.ShouldNotBeNull(); + actual.ReadToEnd().ShouldBe("-- module dependency: a 1.0"); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs b/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs index 9983f71d..15ffd1b6 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs @@ -3,6 +3,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.UpgradeInternal; diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs index fd603e63..c548d5fd 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using NUnit.Framework; using Shouldly; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.Scripts.UpgradeInternal; using SqlDatabase.TestApi; @@ -27,8 +28,8 @@ public void BeforeEachTest() _scriptFactory = new Mock(MockBehavior.Strict); _scriptFactory - .Setup(f => f.IsSupported(It.IsAny())) - .Returns(s => ".sql".Equals(Path.GetExtension(s)) || ".exe".Equals(Path.GetExtension(s))); + .Setup(f => f.IsSupported(It.IsAny())) + .Returns(f => ".sql".Equals(f.Extension) || ".exe".Equals(f.Extension)); _versionResolver = new Mock(MockBehavior.Strict); @@ -49,15 +50,21 @@ public void BuildSequence(BuildSequenceCase testCase) { var file = AddFile(_root, sourceFile.Name); - var dependencies = Array.Empty(); - if (sourceFile.Dependencies != null) + var script = new Mock(MockBehavior.Strict); + script.SetupGet(s => s.DisplayName).Returns(file.Name); + + if (sourceFile.Dependencies == null) { - dependencies = sourceFile.Dependencies.Select(i => new ScriptDependency(i.Module, new Version(i.Version))).ToArray(); + script.Setup(s => s.GetDependencies()).Returns((TextReader?)null); } + else + { + var dependenciesText = string.Join( + Environment.NewLine, + sourceFile.Dependencies.Select(i => $"-- module dependency: {i.Module} {i.Version}")); - var script = new Mock(MockBehavior.Strict); - script.SetupGet(s => s.DisplayName).Returns(file.Name); - script.Setup(s => s.GetDependencies()).Returns(dependencies); + script.Setup(s => s.GetDependencies()).Returns(new StringReader(dependenciesText)); + } _scriptFactory .Setup(s => s.FromFile(file)) diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 992a96a3..b0f49456 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -3,21 +3,18 @@ net472;net6.0;net7.0 SqlDatabase - NU1702 ..\..\bin\Tests - - @@ -55,5 +52,9 @@ + + + + diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj.user b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj.user index 8e59251a..88a55094 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj.user +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj.user @@ -1,9 +1,4 @@  - - - Component - - \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs b/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs index 629caaf5..709cd5b7 100644 --- a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs +++ b/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs @@ -1,5 +1,6 @@ using System; using Moq; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; using SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs b/Sources/SqlDatabase.TestApi/FileFactory.cs similarity index 91% rename from Sources/SqlDatabase.Test/TestApi/FileFactory.cs rename to Sources/SqlDatabase.TestApi/FileFactory.cs index 4599288b..69b58c61 100644 --- a/Sources/SqlDatabase.Test/TestApi/FileFactory.cs +++ b/Sources/SqlDatabase.TestApi/FileFactory.cs @@ -3,18 +3,19 @@ using System.Linq; using System.Text; using Moq; -using NUnit.Framework; +using Shouldly; using SqlDatabase.FileSystem; namespace SqlDatabase.TestApi; -internal static class FileFactory +public static class FileFactory { public static IFile File(string name, byte[]? content, IFolder? parent) { var file = new Mock(MockBehavior.Strict); file.SetupGet(f => f.Name).Returns(name); + file.SetupGet(f => f.Extension).Returns(Path.GetExtension(name)); if (content != null) { @@ -55,7 +56,7 @@ public static IFolder Folder(string name, params IFileSystemInfo[] content) public static string ReadAllText(this IFile file) { - Assert.IsNotNull(file); + file.ShouldNotBeNull(); using (var stream = file.OpenRead()) using (var reader = new StreamReader(stream)) diff --git a/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj b/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj index e88207ce..3793781f 100644 --- a/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj +++ b/Sources/SqlDatabase.TestApi/SqlDatabase.TestApi.csproj @@ -6,5 +6,10 @@ + + + + + diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index f64375fa..11656616 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -30,6 +30,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.TestApi", "SqlD EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter", "SqlDatabase.Adapter\SqlDatabase.Adapter.csproj", "{CDC9677C-6205-402B-ADE2-C958B8A7DD24}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.AssemblyScripts", "SqlDatabase.Adapter.AssemblyScripts\SqlDatabase.Adapter.AssemblyScripts.csproj", "{A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.AssemblyScripts.Test", "SqlDatabase.Adapter.AssemblyScripts.Test\SqlDatabase.Adapter.AssemblyScripts.Test.csproj", "{68DC9F11-567F-4A51-85E6-4C87994F9FFF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -72,6 +78,18 @@ Global {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Debug|Any CPU.Build.0 = Debug|Any CPU {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Release|Any CPU.ActiveCfg = Release|Any CPU {8724A867-C5F5-4A7C-B414-D84AB9830AA0}.Release|Any CPU.Build.0 = Release|Any CPU + {CDC9677C-6205-402B-ADE2-C958B8A7DD24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDC9677C-6205-402B-ADE2-C958B8A7DD24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDC9677C-6205-402B-ADE2-C958B8A7DD24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDC9677C-6205-402B-ADE2-C958B8A7DD24}.Release|Any CPU.Build.0 = Release|Any CPU + {A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}.Release|Any CPU.Build.0 = Release|Any CPU + {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -82,6 +100,7 @@ Global {4F35E6D2-99FB-4B7B-90A5-3BFA936FB8CF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {4334C327-A578-4247-B1CC-23A63B2CC7F2} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {8724A867-C5F5-4A7C-B414-D84AB9830AA0} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {68DC9F11-567F-4A51-85E6-4C87994F9FFF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs b/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs index 97a5041e..299fb358 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCommandBase.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Scripts; +using SqlDatabase.Adapter; +using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index e6aef975..5b1e2b68 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -1,5 +1,6 @@ using System.Configuration; using System.Diagnostics; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs index 27bb145f..3bc03edc 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 5b302b1d..713c1467 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.IO; using System.Text; +using SqlDatabase.Adapter; using SqlDatabase.Export; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs index 89de2e3e..84b28d88 100644 --- a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Linq; using System.Text; +using SqlDatabase.Adapter; using SqlDatabase.Scripts; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/EchoCommand.cs b/Sources/SqlDatabase/Commands/EchoCommand.cs index 0908d4f7..31423d4d 100644 --- a/Sources/SqlDatabase/Commands/EchoCommand.cs +++ b/Sources/SqlDatabase/Commands/EchoCommand.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Configuration; +using SqlDatabase.Adapter; +using SqlDatabase.Configuration; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs b/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs index 68d1c63d..54f9dabd 100644 --- a/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs +++ b/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs @@ -17,17 +17,17 @@ public AssemblyScriptConfiguration(string className, string methodName) MethodName = methodName; } - [ConfigurationProperty(PropertyClassName, DefaultValue = "SqlDatabaseScript")] - public string ClassName + [ConfigurationProperty(PropertyClassName)] + public string? ClassName { - get => (string)this[PropertyClassName]; + get => (string?)this[PropertyClassName]; set => this[PropertyClassName] = value; } - [ConfigurationProperty(PropertyMethodName, DefaultValue = "Execute")] - public string MethodName + [ConfigurationProperty(PropertyMethodName)] + public string? MethodName { - get => (string)this[PropertyMethodName]; + get => (string?)this[PropertyMethodName]; set => this[PropertyMethodName] = value; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/CommandLineBase.cs b/Sources/SqlDatabase/Configuration/CommandLineBase.cs index fe3cc9e0..99aa383b 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineBase.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs index 2684fe4b..3ed6e183 100644 --- a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs @@ -1,4 +1,5 @@ using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Scripts; using SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs b/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs index ce3fda3c..760aab58 100644 --- a/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs +++ b/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs @@ -9,16 +9,16 @@ public sealed class DatabaseConfiguration : ConfigurationElement private const string PropertyVariables = "variables"; [ConfigurationProperty(PropertyGetCurrentVersionScript)] - public string GetCurrentVersionScript + public string? GetCurrentVersionScript { - get => (string)this[PropertyGetCurrentVersionScript]; + get => (string?)this[PropertyGetCurrentVersionScript]; set => this[PropertyGetCurrentVersionScript] = value; } [ConfigurationProperty(PropertySetCurrentVersionScript)] - public string SetCurrentVersionScript + public string? SetCurrentVersionScript { - get => (string)this[PropertySetCurrentVersionScript]; + get => (string?)this[PropertySetCurrentVersionScript]; set => this[PropertySetCurrentVersionScript] = value; } diff --git a/Sources/SqlDatabase/Configuration/EchoCommandLine.cs b/Sources/SqlDatabase/Configuration/EchoCommandLine.cs index 0f282def..9d40232f 100644 --- a/Sources/SqlDatabase/Configuration/EchoCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/EchoCommandLine.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Commands; +using SqlDatabase.Adapter; +using SqlDatabase.Commands; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs index 921a610c..0ec0c37c 100644 --- a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Scripts; using SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs index 84680dee..3da050a4 100644 --- a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Export; using SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Configuration/ICommandLine.cs b/Sources/SqlDatabase/Configuration/ICommandLine.cs index fbf5ef51..a16d5062 100644 --- a/Sources/SqlDatabase/Configuration/ICommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ICommandLine.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Commands; +using SqlDatabase.Adapter; +using SqlDatabase.Commands; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs index 38d3dc84..71792be1 100644 --- a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Scripts; using SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Export/DataExportLogger.cs b/Sources/SqlDatabase/Export/DataExportLogger.cs index 4be946f7..5ad666af 100644 --- a/Sources/SqlDatabase/Export/DataExportLogger.cs +++ b/Sources/SqlDatabase/Export/DataExportLogger.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Text; +using SqlDatabase.Adapter; namespace SqlDatabase.Export; diff --git a/Sources/SqlDatabase/Export/DataExporter.cs b/Sources/SqlDatabase/Export/DataExporter.cs index 5880c84c..c4e01372 100644 --- a/Sources/SqlDatabase/Export/DataExporter.cs +++ b/Sources/SqlDatabase/Export/DataExporter.cs @@ -1,4 +1,5 @@ using System.Data; +using SqlDatabase.Adapter; namespace SqlDatabase.Export; diff --git a/Sources/SqlDatabase/Export/IDataExporter.cs b/Sources/SqlDatabase/Export/IDataExporter.cs index 5cbddd36..390cba28 100644 --- a/Sources/SqlDatabase/Export/IDataExporter.cs +++ b/Sources/SqlDatabase/Export/IDataExporter.cs @@ -1,4 +1,5 @@ using System.Data; +using SqlDatabase.Adapter; namespace SqlDatabase.Export; diff --git a/Sources/SqlDatabase/Log/CombinedLogger.cs b/Sources/SqlDatabase/Log/CombinedLogger.cs index bfe31cc7..12bea88d 100644 --- a/Sources/SqlDatabase/Log/CombinedLogger.cs +++ b/Sources/SqlDatabase/Log/CombinedLogger.cs @@ -1,4 +1,5 @@ using System; +using SqlDatabase.Adapter; namespace SqlDatabase.Log; diff --git a/Sources/SqlDatabase/Log/LoggerBase.cs b/Sources/SqlDatabase/Log/LoggerBase.cs index 74759098..9cbad70c 100644 --- a/Sources/SqlDatabase/Log/LoggerBase.cs +++ b/Sources/SqlDatabase/Log/LoggerBase.cs @@ -1,4 +1,5 @@ using System; +using SqlDatabase.Adapter; namespace SqlDatabase.Log; diff --git a/Sources/SqlDatabase/Log/LoggerFactory.cs b/Sources/SqlDatabase/Log/LoggerFactory.cs index 3ff4c6a5..b6b73c22 100644 --- a/Sources/SqlDatabase/Log/LoggerFactory.cs +++ b/Sources/SqlDatabase/Log/LoggerFactory.cs @@ -1,4 +1,6 @@ -namespace SqlDatabase.Log; +using SqlDatabase.Adapter; + +namespace SqlDatabase.Log; internal static class LoggerFactory { diff --git a/Sources/SqlDatabase/Program.cs b/Sources/SqlDatabase/Program.cs index 2f06b6a4..00f6539a 100644 --- a/Sources/SqlDatabase/Program.cs +++ b/Sources/SqlDatabase/Program.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Log; diff --git a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs index 8b109b59..4bf2455d 100644 --- a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts; @@ -27,9 +28,9 @@ public IList BuildSequence() { Build(folder, null, ScriptFactory, result); } - else if (ScriptFactory.IsSupported(source.Name)) + else if ((source is IFile file) && ScriptFactory.IsSupported(file)) { - result.Add(ScriptFactory.FromFile((IFile)source)); + result.Add(ScriptFactory.FromFile(file)); } } @@ -46,7 +47,7 @@ private static void Build( var files = root .GetFiles() - .Where(i => factory.IsSupported(i.Name)) + .Where(factory.IsSupported) .OrderBy(i => i.Name) .Select(factory.FromFile); diff --git a/Sources/SqlDatabase/Scripts/Database.cs b/Sources/SqlDatabase/Scripts/Database.cs index 5c58df4b..a47e8e53 100644 --- a/Sources/SqlDatabase/Scripts/Database.cs +++ b/Sources/SqlDatabase/Scripts/Database.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index c64f5aa8..00b5b71e 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -5,6 +5,7 @@ using System.Data.SqlClient; using MySqlConnector; using Npgsql; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts.MsSql; using SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs b/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs index 86ff0c0c..fff5eca0 100644 --- a/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/IDatabase.cs b/Sources/SqlDatabase/Scripts/IDatabase.cs index 462ff7bb..6f9807fb 100644 --- a/Sources/SqlDatabase/Scripts/IDatabase.cs +++ b/Sources/SqlDatabase/Scripts/IDatabase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs b/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs index 6a61091e..10191051 100644 --- a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs +++ b/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs @@ -1,4 +1,5 @@ -using SqlDatabase.Scripts.PowerShellInternal; +using SqlDatabase.Adapter; +using SqlDatabase.Scripts.PowerShellInternal; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs b/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs index 442fe36f..305137f6 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs @@ -1,6 +1,7 @@ using System.Data; using System.Data.SqlClient; using System.IO; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Export; @@ -73,7 +74,7 @@ public string GetVersionSelectScript() script = DefaultSelectVersion; } - return script; + return script!; } public string GetVersionUpdateScript() @@ -89,7 +90,7 @@ public string GetVersionUpdateScript() script = DefaultUpdateVersion; } - return script; + return script!; } private void OnConnectionInfoMessage(object sender, SqlInfoMessageEventArgs e) diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs index 5ddaad7b..8bf25d78 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs @@ -1,6 +1,7 @@ using System.Data; using System.IO; using MySqlConnector; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Export; @@ -75,7 +76,7 @@ public string GetVersionSelectScript() script = DefaultSelectVersion; } - return script; + return script!; } public string GetVersionUpdateScript() @@ -91,7 +92,7 @@ public string GetVersionUpdateScript() script = DefaultUpdateVersion; } - return script; + return script!; } private void OnConnectionInfoMessage(object sender, MySqlInfoMessageEventArgs args) diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs index 10243fb5..a96f0af3 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs @@ -1,6 +1,7 @@ using System.Data; using System.IO; using Npgsql; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Export; @@ -79,7 +80,7 @@ public string GetVersionSelectScript() script = DefaultSelectVersion; } - return script; + return script!; } public string GetVersionUpdateScript() @@ -95,7 +96,7 @@ public string GetVersionUpdateScript() script = DefaultUpdateVersion; } - return script; + return script!; } private void OnConnectionNotice(object sender, NpgsqlNoticeEventArgs e) diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs index 1837dd77..791aea68 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs index 5e5d54fc..0d0cf60e 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Management.Automation; using System.Management.Automation.Runspaces; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs index aad83e5f..9d3d6ead 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs @@ -1,4 +1,5 @@ using System; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs index 097665ec..2a37b033 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Loader; +using SqlDatabase.Adapter; using SqlDatabase.Configuration; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs index 97f076c0..ef6b5da3 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Management.Automation; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs index 891ecb96..be460013 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Dynamic; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PowerShellInternal; diff --git a/Sources/SqlDatabase/Scripts/PowerShellScript.cs b/Sources/SqlDatabase/Scripts/PowerShellScript.cs index 2a890cba..811b4c6b 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellScript.cs +++ b/Sources/SqlDatabase/Scripts/PowerShellScript.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Data; using System.IO; -using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.Scripts.PowerShellInternal; namespace SqlDatabase.Scripts; @@ -58,20 +58,15 @@ public IEnumerable ExecuteReader(IDbCommand command, IVariables var throw new NotSupportedException("PowerShell script does not support readers."); } - public IList GetDependencies() + public TextReader? GetDependencies() { - using (var description = ReadDescriptionContent()) + var description = ReadDescriptionContent(); + if (description == null) { - if (description == null) - { - return Array.Empty(); - } - - using (var reader = new StreamReader(description)) - { - return DependencyParser.ExtractDependencies(reader, DisplayName).ToArray(); - } + return null; } + + return new StreamReader(description); } private static void Invoke(IPowerShell powerShell, string script, IDbCommand? command, IVariables variables, ILogger logger, bool whatIf) diff --git a/Sources/SqlDatabase/Scripts/ScriptFactory.cs b/Sources/SqlDatabase/Scripts/ScriptFactory.cs index e3abc159..b7e23bd3 100644 --- a/Sources/SqlDatabase/Scripts/ScriptFactory.cs +++ b/Sources/SqlDatabase/Scripts/ScriptFactory.cs @@ -1,6 +1,8 @@ using System; using System.IO; using System.Linq; +using SqlDatabase.Adapter; +using SqlDatabase.Adapter.AssemblyScripts; using SqlDatabase.Configuration; using SqlDatabase.FileSystem; @@ -8,49 +10,83 @@ namespace SqlDatabase.Scripts; internal sealed class ScriptFactory : IScriptFactory { + private readonly IScriptFactory[] _concrete; + public ScriptFactory(AssemblyScriptConfiguration assemblyScriptConfiguration, IPowerShellFactory? powerShellFactory, ISqlTextReader textReader) { - AssemblyScriptConfiguration = assemblyScriptConfiguration; - PowerShellFactory = powerShellFactory; - TextReader = textReader; + _concrete = new IScriptFactory[] + { + new SqlScriptFactory(textReader), + new PowerShellScriptFactory(powerShellFactory), + new AssemblyScriptFactory(assemblyScriptConfiguration.ClassName, assemblyScriptConfiguration.MethodName) + }; } - public AssemblyScriptConfiguration AssemblyScriptConfiguration { get; } + internal IPowerShellFactory? PowerShellFactory + { + get => ((PowerShellScriptFactory)_concrete[1]).PowerShellFactory; + set => ((PowerShellScriptFactory)_concrete[1]).PowerShellFactory = value; + } + + public bool IsSupported(IFile file) => FindSupported(file) != null; - public IPowerShellFactory? PowerShellFactory { get; internal set; } + public IScript FromFile(IFile file) + { + var factory = FindSupported(file); + if (factory == null) + { + throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); + } - public ISqlTextReader TextReader { get; } + return factory.FromFile(file); + } - public bool IsSupported(string fileName) + private static Func CreateScriptDescriptionReader(IFile file) { - var ext = Path.GetExtension(fileName); + return () => + { + var parent = file.GetParent(); + if (parent == null) + { + return null; + } + + var descriptionName = Path.GetFileNameWithoutExtension(file.Name) + ".txt"; + var description = parent.GetFiles().FirstOrDefault(i => string.Equals(descriptionName, i.Name, StringComparison.OrdinalIgnoreCase)); - return ".sql".Equals(ext, StringComparison.OrdinalIgnoreCase) - || ".exe".Equals(ext, StringComparison.OrdinalIgnoreCase) - || ".dll".Equals(ext, StringComparison.OrdinalIgnoreCase) - || (PowerShellFactory != null && ".ps1".Equals(ext, StringComparison.OrdinalIgnoreCase)); + return description?.OpenRead(); + }; } - public IScript FromFile(IFile file) + private IScriptFactory? FindSupported(IFile file) { - var ext = Path.GetExtension(file.Name); + for (var i = 0; i < _concrete.Length; i++) + { + var result = _concrete[i]; + if (result.IsSupported(file)) + { + return result; + } + } + + return null; + } - if (".sql".Equals(ext, StringComparison.OrdinalIgnoreCase)) + private sealed class PowerShellScriptFactory : IScriptFactory + { + public PowerShellScriptFactory(IPowerShellFactory? powerShellFactory) { - return new TextScript(file.Name, file.OpenRead, TextReader); + PowerShellFactory = powerShellFactory; } - if (".exe".Equals(ext, StringComparison.OrdinalIgnoreCase) - || ".dll".Equals(ext, StringComparison.OrdinalIgnoreCase)) + public IPowerShellFactory? PowerShellFactory { get; set; } + + public bool IsSupported(IFile file) { - return new AssemblyScript( - file.Name, - CreateBinaryReader(file), - CreateScriptDescriptionReader(file), - AssemblyScriptConfiguration); + return PowerShellFactory != null && ".ps1".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); } - if (".ps1".Equals(ext, StringComparison.OrdinalIgnoreCase)) + public IScript FromFile(IFile file) { if (PowerShellFactory == null) { @@ -65,40 +101,25 @@ public IScript FromFile(IFile file) CreateScriptDescriptionReader(file), PowerShellFactory); } - - throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); } - private static Func CreateBinaryReader(IFile file) + private sealed class SqlScriptFactory : IScriptFactory { - return () => BinaryRead(file); - } + private readonly ISqlTextReader _textReader; - private static Func CreateScriptDescriptionReader(IFile file) - { - return () => + public SqlScriptFactory(ISqlTextReader textReader) { - var parent = file.GetParent(); - if (parent == null) - { - return null; - } - - var descriptionName = Path.GetFileNameWithoutExtension(file.Name) + ".txt"; - var description = parent.GetFiles().FirstOrDefault(i => string.Equals(descriptionName, i.Name, StringComparison.OrdinalIgnoreCase)); - - return description?.OpenRead(); - }; - } + _textReader = textReader; + } - private static byte[] BinaryRead(IFile file) - { - using (var source = file.OpenRead()) - using (var dest = new MemoryStream()) + public bool IsSupported(IFile file) { - source.CopyTo(dest); + return ".sql".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); + } - return dest.ToArray(); + public IScript FromFile(IFile file) + { + return new TextScript(file.Name, file.OpenRead, _textReader); } } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ScriptStep.cs b/Sources/SqlDatabase/Scripts/ScriptStep.cs index 4c816aef..808e2e38 100644 --- a/Sources/SqlDatabase/Scripts/ScriptStep.cs +++ b/Sources/SqlDatabase/Scripts/ScriptStep.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs b/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs index 114a9524..436488dc 100644 --- a/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs +++ b/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/TextScript.cs b/Sources/SqlDatabase/Scripts/TextScript.cs index fc0dd9ed..aa31189e 100644 --- a/Sources/SqlDatabase/Scripts/TextScript.cs +++ b/Sources/SqlDatabase/Scripts/TextScript.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.IO; using System.Linq; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; @@ -74,7 +75,7 @@ public IEnumerable ExecuteReader(IDbCommand command, IVariables var } } - public IList GetDependencies() + public TextReader? GetDependencies() { string? batch; using (var sql = ReadSqlContent()) @@ -84,10 +85,10 @@ public IList GetDependencies() if (string.IsNullOrWhiteSpace(batch)) { - return Array.Empty(); + return null; } - return DependencyParser.ExtractDependencies(new StringReader(batch), DisplayName).ToArray(); + return new StringReader(batch); } private static string[]? GetReaderColumns(IDataReader reader) diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs index 52fdb28c..86705162 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.UpgradeInternal; diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs index ecd9afe2..c65517ce 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; namespace SqlDatabase.Scripts.UpgradeInternal; @@ -101,7 +102,13 @@ public void LoadDependencies() { foreach (var step in steps) { - var dependencies = step.Script.GetDependencies(); + var dependencies = Array.Empty(); + using var reader = step.Script.GetDependencies(); + if (reader != null) + { + dependencies = DependencyParser.ExtractDependencies(reader, step.Script.DisplayName).ToArray(); + } + _dependencyByStep.Add(step.Script, dependencies); } } @@ -287,7 +294,7 @@ private void LoadFrom(IEnumerable sources, IScriptFactory scrip else { var file = (IFile)source; - if (scriptFactory.IsSupported(file.Name) && TryParseFileName(file.Name, out var moduleName, out var from, out var to)) + if (scriptFactory.IsSupported(file) && TryParseFileName(file.Name, out var moduleName, out var from, out var to)) { if (FolderAsModuleName && string.IsNullOrEmpty(rootFolderName)) { diff --git a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs index d3074893..c30a79c4 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs +++ b/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.Scripts.UpgradeInternal; diff --git a/Sources/SqlDatabase/Scripts/Variables.cs b/Sources/SqlDatabase/Scripts/Variables.cs index 8e683ae6..a9826ff7 100644 --- a/Sources/SqlDatabase/Scripts/Variables.cs +++ b/Sources/SqlDatabase/Scripts/Variables.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 2e0d5d98..a3df7379 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -14,7 +14,6 @@ - ..\Dependencies\System.Management.Automation.dll @@ -44,7 +43,7 @@ - + From 0bcb15a9cf5a38435031b54555dd2dad7ee5c46c Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Mon, 6 Nov 2023 18:03:47 +0100 Subject: [PATCH 16/38] SqlDatabase.Adapter.PowerShellScripts --- .../DiagnosticsToolsTest.cs | 2 +- .../InstallationSeekerTest.cs | 3 +- .../PowerShellScriptFactoryTest.cs | 52 ++++ .../PowerShellScriptTest.cs | 7 +- .../PowerShellTest.ExecuteWhatIfIgnore.ps1 | 0 .../PowerShellTest.ExecuteWhatIfInvoke.ps1 | 0 .../PowerShellTest.HandleOutput.ps1 | 0 .../PowerShellTest.HandleThrow.ps1 | 0 .../PowerShellTest.HandleWriteError.ps1 | 0 .../PowerShellTest.ParametersBinding.ps1 | 0 .../PowerShellTest.cs | 7 +- ...base.Adapter.PowerShellScripts.Test.csproj | 23 ++ .../CodeAnalysis/AllowNullAttribute.cs | 8 + .../CodeAnalysis/NotNullWhenAttribute.cs | 10 + .../DiagnosticsTools.cs | 2 +- .../IPowerShell.cs | 3 +- .../IPowerShellFactory.cs | 8 + .../InstallationInfo.cs | 55 +++++ .../InstallationSeeker.cs | 53 +---- .../PowerShell.cs | 3 +- .../PowerShellFactory.cs | 21 +- .../PowerShellFactory.hosted.cs | 10 +- .../PowerShellFactory.native.cs | 7 + .../PowerShellScript.cs | 4 +- .../PowerShellScriptFactory.cs | 56 +++++ .../PowerShellStreamsListener.cs | 3 +- .../Properties/AssemblyInfo.cs | 4 + .../ReflectionTools.cs | 9 +- ...lDatabase.Adapter.PowerShellScripts.csproj | 29 +++ .../VariablesProxy.cs | 3 +- .../SqlDatabase.Adapter/IScriptEnvironment.cs | 8 + .../Commands/DatabaseCreateCommandTest.cs | 30 ++- .../Commands/DatabaseExecuteCommandTest.cs | 16 +- .../Commands/DatabaseExportCommandTest.cs | 35 ++- .../Commands/DatabaseUpgradeCommandTest.cs | 18 +- .../Configuration/CommandLineBaseTest.cs | 56 +---- .../Configuration/CreateCommandLineTest.cs | 27 ++- .../Configuration/EnvironmentBuilderMock.cs | 99 ++++++++ .../Configuration/EnvironmentBuilderTest.cs | 89 +++++++ .../Configuration/ExecuteCommandLineTest.cs | 28 ++- .../Configuration/ExportCommandLineTest.cs | 19 +- .../Configuration/UpgradeCommandLineTest.cs | 32 +-- .../IntegrationTests/MsSql/ProgramTest.cs | 2 - .../IntegrationTests/MySql/ProgramTest.cs | 2 - .../IntegrationTests/PgSql/ProgramTest.cs | 2 - .../Scripts/ScriptFactoryTest.cs | 84 ------- .../Scripts/ScriptResolverTest.cs | 77 ++++++ .../SqlDatabase.Test/SqlDatabase.Test.csproj | 10 - .../TestApi/TestPowerShellHost.cs | 39 --- Sources/SqlDatabase.sln | 19 +- .../Commands/DatabaseCreateCommand.cs | 8 +- .../Commands/DatabaseExecuteCommand.cs | 12 +- .../Commands/DatabaseExportCommand.cs | 10 + .../Commands/DatabaseUpgradeCommand.cs | 8 +- .../Configuration/CommandLineBase.cs | 48 ---- .../Configuration/CreateCommandLine.cs | 33 +-- .../Configuration/EnvironmentBuilder.cs | 223 ++++++++++++++++++ .../Configuration/ExecuteCommandLine.cs | 30 ++- .../Configuration/ExportCommandLine.cs | 22 +- .../Configuration/IEnvironmentBuilder.cs | 29 +++ .../Configuration/UpgradeCommandLine.cs | 40 ++-- .../SqlDatabase/Scripts/IPowerShellFactory.cs | 15 -- .../SqlDatabase/Scripts/IScriptResolver.cs | 9 + .../PowerShellFactory.native.cs | 8 - Sources/SqlDatabase/Scripts/ScriptFactory.cs | 125 ---------- Sources/SqlDatabase/Scripts/ScriptResolver.cs | 79 +++++++ Sources/SqlDatabase/SqlDatabase.csproj | 16 +- 67 files changed, 1121 insertions(+), 668 deletions(-) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/DiagnosticsToolsTest.cs (94%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/InstallationSeekerTest.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptFactoryTest.cs rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellScriptTest.cs (96%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.ExecuteWhatIfIgnore.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.ExecuteWhatIfInvoke.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.HandleOutput.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.HandleThrow.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.HandleWriteError.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.ParametersBinding.ps1 (100%) rename Sources/{SqlDatabase.Test/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts.Test}/PowerShellTest.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/AllowNullAttribute.cs create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/NotNullWhenAttribute.cs rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/DiagnosticsTools.cs (98%) rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/IPowerShell.cs (74%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShellFactory.cs create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationInfo.cs rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/InstallationSeeker.cs (74%) rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/PowerShell.cs (95%) rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/PowerShellFactory.cs (63%) rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/PowerShellFactory.hosted.cs (88%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.native.cs rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter.PowerShellScripts}/PowerShellScript.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScriptFactory.cs rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/PowerShellStreamsListener.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/Properties/AssemblyInfo.cs rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/ReflectionTools.cs (69%) create mode 100644 Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj rename Sources/{SqlDatabase/Scripts/PowerShellInternal => SqlDatabase.Adapter.PowerShellScripts}/VariablesProxy.cs (86%) create mode 100644 Sources/SqlDatabase.Adapter/IScriptEnvironment.cs create mode 100644 Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs create mode 100644 Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs delete mode 100644 Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs create mode 100644 Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs delete mode 100644 Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs create mode 100644 Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs create mode 100644 Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs delete mode 100644 Sources/SqlDatabase/Scripts/IPowerShellFactory.cs create mode 100644 Sources/SqlDatabase/Scripts/IScriptResolver.cs delete mode 100644 Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs delete mode 100644 Sources/SqlDatabase/Scripts/ScriptFactory.cs create mode 100644 Sources/SqlDatabase/Scripts/ScriptResolver.cs diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/DiagnosticsToolsTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/DiagnosticsToolsTest.cs similarity index 94% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/DiagnosticsToolsTest.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/DiagnosticsToolsTest.cs index 228ca6e3..bc4bbf79 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/DiagnosticsToolsTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/DiagnosticsToolsTest.cs @@ -4,7 +4,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; [TestFixture] public class DiagnosticsToolsTest diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs index 95889e96..52ccd81f 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/InstallationSeekerTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs @@ -6,9 +6,8 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.TestApi; -using InstallationInfo = SqlDatabase.Scripts.PowerShellInternal.InstallationSeeker.InstallationInfo; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; [TestFixture] public class InstallationSeekerTest diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptFactoryTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptFactoryTest.cs new file mode 100644 index 00000000..aae7b12b --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptFactoryTest.cs @@ -0,0 +1,52 @@ +using System.IO; +using Moq; +using NUnit.Framework; +using Shouldly; +using SqlDatabase.FileSystem; +using SqlDatabase.TestApi; + +namespace SqlDatabase.Adapter.PowerShellScripts; + +[TestFixture] +public class PowerShellScriptFactoryTest +{ + private Mock _powerShell = null!; + private PowerShellScriptFactory _sut = null!; + + [SetUp] + public void BeforeEachTest() + { + _powerShell = new Mock(MockBehavior.Strict); + _sut = new PowerShellScriptFactory(_powerShell.Object); + } + + [Test] + [TestCase(".Ps1", true)] + [TestCase(".sql", false)] + [TestCase(null, false)] + public void IsSupported(string? ext, bool expected) + { + var file = new Mock(MockBehavior.Strict); + file + .SetupGet(f => f.Extension) + .Returns(ext!); + + _sut.IsSupported(file.Object).ShouldBe(expected); + } + + [Test] + public void FromFile() + { + var file = FileFactory.File( + "11.ps1", + "some script", + FileFactory.Folder("name", FileFactory.File("11.txt", "3, 2, 1"))); + + var script = _sut.FromFile(file).ShouldBeOfType(); + + script.DisplayName.ShouldBe("11.ps1"); + script.PowerShellFactory.ShouldBe(_powerShell.Object); + new StreamReader(script.ReadScriptContent()).ReadToEnd().ShouldBe("some script"); + new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptTest.cs index 6fd1d057..f69fa0b8 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellScriptTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellScriptTest.cs @@ -1,15 +1,12 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using System.IO; using System.Text; using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Scripts.PowerShellInternal; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.PowerShellScripts; [TestFixture] public class PowerShellScriptTest diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ExecuteWhatIfIgnore.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ExecuteWhatIfIgnore.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ExecuteWhatIfIgnore.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ExecuteWhatIfIgnore.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ExecuteWhatIfInvoke.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ExecuteWhatIfInvoke.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ExecuteWhatIfInvoke.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ExecuteWhatIfInvoke.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleOutput.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleOutput.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleOutput.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleOutput.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleThrow.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleThrow.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleThrow.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleThrow.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleWriteError.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleWriteError.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.HandleWriteError.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.HandleWriteError.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ParametersBinding.ps1 b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ParametersBinding.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.ParametersBinding.ps1 rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.ParametersBinding.ps1 diff --git a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs index 6a2bea7e..93cc118b 100644 --- a/Sources/SqlDatabase.Test/Scripts/PowerShellInternal/PowerShellTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs @@ -5,10 +5,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; [TestFixture] public class PowerShellTest @@ -36,7 +34,8 @@ public void BeforeAllTests() .Setup(l => l.Indent()) .Returns((IDisposable)null!); - _factory = TestPowerShellHost.GetOrCreateFactory(); + _factory = PowerShellFactory.Create(null); + _factory.Initialize(_logger.Object); } [SetUp] diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj new file mode 100644 index 00000000..a058583b --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj @@ -0,0 +1,23 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.PowerShellScripts + ..\..\bin\Tests + + + + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/AllowNullAttribute.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/AllowNullAttribute.cs new file mode 100644 index 00000000..39be8db8 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/AllowNullAttribute.cs @@ -0,0 +1,8 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] +internal sealed class AllowNullAttribute : Attribute +{ +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/NotNullWhenAttribute.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/NotNullWhenAttribute.cs new file mode 100644 index 00000000..e3d56cf7 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/CodeAnalysis/NotNullWhenAttribute.cs @@ -0,0 +1,10 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +internal sealed class NotNullWhenAttribute : Attribute +{ + public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; + + public bool ReturnValue { get; } +} +#endif diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/DiagnosticsTools.cs similarity index 98% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/DiagnosticsTools.cs index e6794fd6..269719e7 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/DiagnosticsTools.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/DiagnosticsTools.cs @@ -3,7 +3,7 @@ using System.IO; using System.Runtime.InteropServices; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal static class DiagnosticsTools { diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShell.cs similarity index 74% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShell.cs index 791aea68..0f3bd82a 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/IPowerShell.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShell.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal interface IPowerShell { diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShellFactory.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShellFactory.cs new file mode 100644 index 00000000..c9ffe25e --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/IPowerShellFactory.cs @@ -0,0 +1,8 @@ +namespace SqlDatabase.Adapter.PowerShellScripts; + +internal interface IPowerShellFactory +{ + void Initialize(ILogger logger); + + IPowerShell Create(); +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationInfo.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationInfo.cs new file mode 100644 index 00000000..b81c8cc0 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationInfo.cs @@ -0,0 +1,55 @@ +using System; +using System.Diagnostics; + +namespace SqlDatabase.Adapter.PowerShellScripts; + +[DebuggerDisplay("{Version}")] +internal readonly struct InstallationInfo : IComparable +{ + public InstallationInfo(string location, Version version, string productVersion) + { + Location = location; + Version = version; + ProductVersion = productVersion ?? string.Empty; + } + + public string Location { get; } + + public Version Version { get; } + + public string ProductVersion { get; } + + public int CompareTo(InstallationInfo other) + { + var result = Version.CompareTo(other.Version); + if (result != 0) + { + return result; + } + + var isPreview = IsPreview(); + var otherIsPreview = other.IsPreview(); + if (isPreview && !otherIsPreview) + { + return -1; + } + + if (!isPreview && otherIsPreview) + { + return 1; + } + + result = StringComparer.InvariantCultureIgnoreCase.Compare(ProductVersion, other.ProductVersion); + if (result == 0) + { + result = StringComparer.InvariantCultureIgnoreCase.Compare(Location, other.Location); + } + + return result; + } + + private bool IsPreview() + { + return ProductVersion.IndexOf("preview", StringComparison.OrdinalIgnoreCase) > 0; + } +} diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs similarity index 74% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs index 07f048cd..93b820dd 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/InstallationSeeker.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs @@ -4,7 +4,7 @@ using System.Diagnostics.CodeAnalysis; using System.IO; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal static class InstallationSeeker { @@ -143,55 +143,4 @@ private static bool IsCompatibleVersion(Version version) return false; #endif } - - [DebuggerDisplay("{Version}")] - internal readonly struct InstallationInfo : IComparable - { - public InstallationInfo(string location, Version version, string productVersion) - { - Location = location; - Version = version; - ProductVersion = productVersion ?? string.Empty; - } - - public string Location { get; } - - public Version Version { get; } - - public string ProductVersion { get; } - - public int CompareTo(InstallationInfo other) - { - var result = Version.CompareTo(other.Version); - if (result != 0) - { - return result; - } - - var isPreview = IsPreview(); - var otherIsPreview = other.IsPreview(); - if (isPreview && !otherIsPreview) - { - return -1; - } - - if (!isPreview && otherIsPreview) - { - return 1; - } - - result = StringComparer.InvariantCultureIgnoreCase.Compare(ProductVersion, other.ProductVersion); - if (result == 0) - { - result = StringComparer.InvariantCultureIgnoreCase.Compare(Location, other.Location); - } - - return result; - } - - private bool IsPreview() - { - return ProductVersion.IndexOf("preview", StringComparison.OrdinalIgnoreCase) > 0; - } - } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShell.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShell.cs index 0d0cf60e..f7885734 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShell.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShell.cs @@ -2,9 +2,8 @@ using System.Collections.Generic; using System.Management.Automation; using System.Management.Automation.Runspaces; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal sealed class PowerShell : IPowerShell { diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.cs similarity index 63% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.cs index 9d3d6ead..3d9761ce 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.cs @@ -1,11 +1,9 @@ using System; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal sealed partial class PowerShellFactory : IPowerShellFactory { - private bool _requested; private bool _initialized; private PowerShellFactory(string? installationPath) @@ -15,27 +13,14 @@ private PowerShellFactory(string? installationPath) public string? InstallationPath { get; private set; } - // only for tests - internal static IPowerShellFactory? SharedTestFactory { get; set; } - public static IPowerShellFactory Create(string? installationPath) { - if (SharedTestFactory != null) - { - return SharedTestFactory; - } - return new PowerShellFactory(installationPath); } - public void Request() - { - _requested = true; - } - - public void InitializeIfRequested(ILogger logger) + public void Initialize(ILogger logger) { - if (_initialized || !_requested) + if (_initialized) { return; } diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs similarity index 88% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs index 2a37b033..5af1bb59 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.hosted.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs @@ -5,10 +5,8 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Loader; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; // https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell internal partial class PowerShellFactory @@ -29,15 +27,15 @@ partial void DoInitialize(ILogger logger) if (string.IsNullOrEmpty(InstallationPath)) { - throw new InvalidOperationException("PowerShell Core installation not found, please provide installation path via command line options {0}{1}.".FormatWith(Arg.Sign, Arg.UsePowerShell)); + throw new InvalidOperationException("PowerShell Core installation not found, please provide installation path via command line options -usePowerShell."); } if (!InstallationSeeker.TryGetInfo(InstallationPath, out var info)) { - throw new InvalidOperationException("PowerShell Core installation not found in {0}.".FormatWith(InstallationPath)); + throw new InvalidOperationException($"PowerShell Core installation not found in {InstallationPath}."); } - logger.Info("host PowerShell from {0}, version {1}".FormatWith(InstallationPath, info.ProductVersion)); + logger.Info($"host PowerShell from {InstallationPath}, version {info.ProductVersion}"); AssemblyLoadContext.Default.Resolving += AssemblyResolving; try diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.native.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.native.cs new file mode 100644 index 00000000..8f2bb9fe --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.native.cs @@ -0,0 +1,7 @@ +#if NET472 || NETSTANDARD +namespace SqlDatabase.Adapter.PowerShellScripts; + +internal partial class PowerShellFactory +{ +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellScript.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScript.cs similarity index 96% rename from Sources/SqlDatabase/Scripts/PowerShellScript.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScript.cs index 811b4c6b..b42800ec 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellScript.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScript.cs @@ -2,10 +2,8 @@ using System.Collections.Generic; using System.Data; using System.IO; -using SqlDatabase.Adapter; -using SqlDatabase.Scripts.PowerShellInternal; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.PowerShellScripts; internal sealed class PowerShellScript : IScript { diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScriptFactory.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScriptFactory.cs new file mode 100644 index 00000000..1f9cae8c --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellScriptFactory.cs @@ -0,0 +1,56 @@ +using System; +using System.IO; +using System.Linq; +using SqlDatabase.FileSystem; + +namespace SqlDatabase.Adapter.PowerShellScripts; + +public sealed class PowerShellScriptFactory : IScriptFactory, IScriptEnvironment +{ + private readonly IPowerShellFactory _powerShell; + + public PowerShellScriptFactory(string? installationPath) + : this(PowerShellFactory.Create(installationPath)) + { + } + + internal PowerShellScriptFactory(IPowerShellFactory powerShell) + { + _powerShell = powerShell; + } + + public bool IsSupported(IFile file) + { + return ".ps1".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); + } + + public IScript FromFile(IFile file) + { + return new PowerShellScript( + file.Name, + file.OpenRead, + CreateScriptDescriptionReader(file), + _powerShell); + } + + public bool IsSupported(IScript script) => script is PowerShellScript; + + public void Initialize(ILogger logger) => _powerShell.Initialize(logger); + + private static Func CreateScriptDescriptionReader(IFile file) + { + return () => + { + var parent = file.GetParent(); + if (parent == null) + { + return null; + } + + var descriptionName = Path.GetFileNameWithoutExtension(file.Name) + ".txt"; + var description = parent.GetFiles().FirstOrDefault(i => string.Equals(descriptionName, i.Name, StringComparison.OrdinalIgnoreCase)); + + return description?.OpenRead(); + }; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellStreamsListener.cs similarity index 96% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellStreamsListener.cs index ef6b5da3..86b1164c 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellStreamsListener.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellStreamsListener.cs @@ -1,9 +1,8 @@ using System; using System.Collections; using System.Management.Automation; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal sealed class PowerShellStreamsListener : IDisposable { diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ec0730a3 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.PowerShellScripts.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/ReflectionTools.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/ReflectionTools.cs similarity index 69% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/ReflectionTools.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/ReflectionTools.cs index 49c0acbe..de42ed57 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/ReflectionTools.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/ReflectionTools.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal static class ReflectionTools { @@ -10,10 +10,7 @@ public static PropertyInfo FindProperty(this Type type, string name) var result = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); if (result == null) { - throw new InvalidOperationException( - "public property {0} not found in {1}.".FormatWith( - name, - type.FullName)); + throw new InvalidOperationException($"public property {name} not found in {type.FullName}."); } return result; @@ -24,7 +21,7 @@ public static EventInfo FindEvent(this Type type, string name) var result = type.GetEvent(name, BindingFlags.Public | BindingFlags.Instance); if (result?.AddMethod == null || result.RemoveMethod == null) { - throw new InvalidOperationException("Event {0} not found in {1}.".FormatWith(name, type.FullName)); + throw new InvalidOperationException($"Event {name} not found in {type.FullName}."); } return result; diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj new file mode 100644 index 00000000..41129bef --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj @@ -0,0 +1,29 @@ + + + + net472;net6.0;net7.0;netstandard2.0 + + + + + ..\Dependencies\System.Management.Automation.dll + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/VariablesProxy.cs similarity index 86% rename from Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs rename to Sources/SqlDatabase.Adapter.PowerShellScripts/VariablesProxy.cs index be460013..126d2d53 100644 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/VariablesProxy.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/VariablesProxy.cs @@ -1,8 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Dynamic; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PowerShellInternal; +namespace SqlDatabase.Adapter.PowerShellScripts; internal sealed class VariablesProxy : DynamicObject { diff --git a/Sources/SqlDatabase.Adapter/IScriptEnvironment.cs b/Sources/SqlDatabase.Adapter/IScriptEnvironment.cs new file mode 100644 index 00000000..36c83eb1 --- /dev/null +++ b/Sources/SqlDatabase.Adapter/IScriptEnvironment.cs @@ -0,0 +1,8 @@ +namespace SqlDatabase.Adapter; + +public interface IScriptEnvironment +{ + bool IsSupported(IScript script); + + void Initialize(ILogger logger); +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index 93d7a344..06cb9ec8 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -13,7 +13,7 @@ public class DatabaseCreateCommandTest private DatabaseCreateCommand _sut = null!; private Mock _database = null!; private Mock _scriptSequence = null!; - private Mock _powerShellFactory = null!; + private Mock _scriptResolver = null!; private Mock _log = null!; [SetUp] @@ -30,7 +30,7 @@ public void BeforeEachTest() _scriptSequence = new Mock(MockBehavior.Strict); - _powerShellFactory = new Mock(MockBehavior.Strict); + _scriptResolver = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); _log.Setup(l => l.Indent()).Returns((IDisposable)null!); @@ -49,7 +49,7 @@ public void BeforeEachTest() _sut = new DatabaseCreateCommand( _scriptSequence.Object, - _powerShellFactory.Object, + _scriptResolver.Object, _database.Object, _log.Object); } @@ -73,20 +73,24 @@ public void ExecuteSequence() var step2 = new Mock(MockBehavior.Strict); step2.SetupGet(s => s.DisplayName).Returns("step 2"); - _powerShellFactory - .Setup(f => f.InitializeIfRequested(_log.Object)); + var sequence = new[] { step1.Object, step2.Object }; + + _scriptResolver + .Setup(f => f.InitializeEnvironment(_log.Object, sequence)); _database .Setup(d => d.Execute(step1.Object)) .Callback(() => _database.Setup(d => d.Execute(step2.Object))); - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new[] { step1.Object, step2.Object }); + _scriptSequence + .Setup(s => s.BuildSequence()) + .Returns(sequence); _sut.Execute(); _database.VerifyAll(); _scriptSequence.VerifyAll(); - _powerShellFactory.VerifyAll(); + _scriptResolver.VerifyAll(); } [Test] @@ -98,19 +102,23 @@ public void StopExecutionOnError() var step2 = new Mock(MockBehavior.Strict); step2.SetupGet(s => s.DisplayName).Returns("step 2"); - _powerShellFactory - .Setup(f => f.InitializeIfRequested(_log.Object)); + var sequence = new[] { step1.Object, step2.Object }; + + _scriptResolver + .Setup(f => f.InitializeEnvironment(_log.Object, sequence)); _database .Setup(d => d.Execute(step1.Object)) .Throws(); - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new[] { step1.Object, step2.Object }); + _scriptSequence + .Setup(s => s.BuildSequence()) + .Returns(sequence); Assert.Throws(_sut.Execute); _database.VerifyAll(); _scriptSequence.VerifyAll(); - _powerShellFactory.VerifyAll(); + _scriptResolver.VerifyAll(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs index 50186647..eff7b862 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs @@ -12,7 +12,7 @@ public class DatabaseExecuteCommandTest private DatabaseExecuteCommand _sut = null!; private Mock _database = null!; private Mock _scriptSequence = null!; - private Mock _powerShellFactory = null!; + private Mock _scriptResolver = null!; private Mock _log = null!; [SetUp] @@ -29,7 +29,7 @@ public void BeforeEachTest() _scriptSequence = new Mock(MockBehavior.Strict); - _powerShellFactory = new Mock(MockBehavior.Strict); + _scriptResolver = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); _log.Setup(l => l.Indent()).Returns((IDisposable)null!); @@ -42,7 +42,7 @@ public void BeforeEachTest() _sut = new DatabaseExecuteCommand( _scriptSequence.Object, - _powerShellFactory.Object, + _scriptResolver.Object, _database.Object, _log.Object); } @@ -56,20 +56,22 @@ public void ExecuteOneScript() var script2 = new Mock(MockBehavior.Strict); script2.SetupGet(s => s.DisplayName).Returns("step 2"); - _powerShellFactory - .Setup(f => f.InitializeIfRequested(_log.Object)); + var sequence = new[] { script1.Object, script2.Object }; + + _scriptResolver + .Setup(f => f.InitializeEnvironment(_log.Object, sequence)); _database .Setup(d => d.Execute(script1.Object)) .Callback(() => _database.Setup(d => d.Execute(script2.Object))); - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new[] { script1.Object, script2.Object }); + _scriptSequence.Setup(s => s.BuildSequence()).Returns(sequence); _sut.Execute(); _database.VerifyAll(); script1.VerifyAll(); script2.VerifyAll(); - _powerShellFactory.VerifyAll(); + _scriptResolver.VerifyAll(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index 16ac62ca..ec0a310c 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -16,6 +16,8 @@ public class DatabaseExportCommandTest private DatabaseExportCommand _sut = null!; private Mock _database = null!; private Mock _scriptSequence = null!; + private Mock _scriptResolver = null!; + private Mock _logger = null!; private Mock _exporter = null!; [SetUp] @@ -35,9 +37,11 @@ public void BeforeEachTest() _scriptSequence = new Mock(MockBehavior.Strict); - var log = new Mock(MockBehavior.Strict); - log.Setup(l => l.Indent()).Returns((IDisposable)null!); - log + _scriptResolver = new Mock(MockBehavior.Strict); + + _logger = new Mock(MockBehavior.Strict); + _logger.Setup(l => l.Indent()).Returns((IDisposable)null!); + _logger .Setup(l => l.Info(It.IsAny())) .Callback(m => { @@ -48,13 +52,14 @@ public void BeforeEachTest() _exporter .SetupProperty(e => e.Output); _exporter - .SetupSet(e => e.Log = log.Object); + .SetupSet(e => e.Log = _logger.Object); _sut = new DatabaseExportCommand( _scriptSequence.Object, + _scriptResolver.Object, () => Console.Out, _database.Object, - log.Object) + _logger.Object) { ExporterFactory = () => _exporter.Object, }; @@ -66,6 +71,11 @@ public void ExportOneScript() var script = new Mock(MockBehavior.Strict); script.SetupGet(s => s.DisplayName).Returns("display name"); + var sequence = new[] { script.Object }; + + _scriptResolver + .Setup(f => f.InitializeEnvironment(_logger.Object, sequence)); + var reader = new Mock(MockBehavior.Strict); reader .Setup(r => r.NextResult()) @@ -78,13 +88,16 @@ public void ExportOneScript() _exporter .Setup(e => e.Export(reader.Object, "dbo.SqlDatabaseExport")); - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new[] { script.Object }); + _scriptSequence + .Setup(s => s.BuildSequence()) + .Returns(sequence); _sut.Execute(); _database.VerifyAll(); script.VerifyAll(); _exporter.VerifyAll(); + _scriptResolver.VerifyAll(); } [Test] @@ -93,6 +106,11 @@ public void ReaderNextResult() var script = new Mock(MockBehavior.Strict); script.SetupGet(s => s.DisplayName).Returns("display name"); + var sequence = new[] { script.Object }; + + _scriptResolver + .Setup(f => f.InitializeEnvironment(_logger.Object, sequence)); + var reader = new Mock(MockBehavior.Strict); reader .Setup(r => r.NextResult()) @@ -109,12 +127,15 @@ public void ReaderNextResult() _exporter .Setup(e => e.Export(reader.Object, "dbo.SqlDatabaseExport_2")); - _scriptSequence.Setup(s => s.BuildSequence()).Returns(new[] { script.Object }); + _scriptSequence + .Setup(s => s.BuildSequence()) + .Returns(sequence); _sut.Execute(); _database.VerifyAll(); script.VerifyAll(); _exporter.VerifyAll(); + _scriptResolver.VerifyAll(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs index 526f4f20..06d5e3f5 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs @@ -12,7 +12,7 @@ public class DatabaseUpgradeCommandTest private DatabaseUpgradeCommand _sut = null!; private Mock _database = null!; private Mock _scriptSequence = null!; - private Mock _powerShellFactory = null!; + private Mock _scriptResolver = null!; private Mock _log = null!; [SetUp] @@ -29,7 +29,7 @@ public void BeforeEachTest() _scriptSequence = new Mock(MockBehavior.Strict); - _powerShellFactory = new Mock(MockBehavior.Strict); + _scriptResolver = new Mock(MockBehavior.Strict); _log = new Mock(MockBehavior.Strict); _log.Setup(l => l.Indent()).Returns((IDisposable)null!); @@ -48,7 +48,7 @@ public void BeforeEachTest() _sut = new DatabaseUpgradeCommand( _scriptSequence.Object, - _powerShellFactory.Object, + _scriptResolver.Object, _database.Object, _log.Object); } @@ -78,8 +78,8 @@ public void ExecuteSequence() var stepTo2 = new ScriptStep("module1", currentVersion, new Version("2.0"), updateTo2.Object); var stepTo3 = new ScriptStep("module2", new Version("2.0"), new Version("3.0"), updateTo3.Object); - _powerShellFactory - .Setup(f => f.InitializeIfRequested(_log.Object)); + _scriptResolver + .Setup(f => f.InitializeEnvironment(_log.Object, new[] { stepTo2.Script, stepTo3.Script })); _database .Setup(d => d.Execute(updateTo2.Object, "module1", stepTo2.From, stepTo2.To)) @@ -91,7 +91,7 @@ public void ExecuteSequence() _database.VerifyAll(); _scriptSequence.VerifyAll(); - _powerShellFactory.VerifyAll(); + _scriptResolver.VerifyAll(); } [Test] @@ -108,8 +108,8 @@ public void StopExecutionOnError() var stepTo2 = new ScriptStep(string.Empty, currentVersion, new Version("2.0"), updateTo2.Object); var stepTo3 = new ScriptStep(string.Empty, new Version("2.0"), new Version("3.0"), updateTo3.Object); - _powerShellFactory - .Setup(f => f.InitializeIfRequested(_log.Object)); + _scriptResolver + .Setup(f => f.InitializeEnvironment(_log.Object, new[] { stepTo2.Script, stepTo3.Script })); _database.Setup(d => d.Execute(updateTo2.Object, string.Empty, stepTo2.From, stepTo2.To)).Throws(); @@ -119,6 +119,6 @@ public void StopExecutionOnError() _database.VerifyAll(); _scriptSequence.VerifyAll(); - _powerShellFactory.VerifyAll(); + _scriptResolver.VerifyAll(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs index abaf0621..582b7e28 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs @@ -3,80 +3,26 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; using SqlDatabase.FileSystem; -using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; [TestFixture] public class CommandLineBaseTest { - private Mock _log = null!; - private Mock _configurationManager = null!; - private AppConfiguration _configuration = null!; private Mock _fs = null!; private CommandLineBase _sut = null!; [SetUp] public void BeforeEachTest() { - _log = new Mock(MockBehavior.Strict); - - _configuration = new AppConfiguration(); - - _configurationManager = new Mock(MockBehavior.Strict); - _configurationManager - .SetupGet(c => c.SqlDatabase) - .Returns(_configuration); - _fs = new Mock(MockBehavior.Strict); _sut = new Mock { CallBase = true }.Object; - _sut.ConnectionString = MsSqlQuery.ConnectionString; + _sut.ConnectionString = "connection-string"; _sut.FileSystemFactory = _fs.Object; } - [Test] - public void CreateDatabase() - { - var actual = _sut.CreateDatabase(_log.Object, _configurationManager.Object, TransactionMode.PerStep, true); - - actual.Log.ShouldBe(_log.Object); - actual.Adapter.ShouldNotBeNull(); - actual.Transaction.ShouldBe(TransactionMode.PerStep); - actual.WhatIf.ShouldBeTrue(); - } - - [Test] - public void CreateDatabaseApplyVariables() - { - _sut.Variables.Add("a", "1"); - _sut.Variables.Add("b", "2"); - - _configuration.Variables.Add(new NameValueConfigurationElement("b", "2.2")); - _configuration.Variables.Add(new NameValueConfigurationElement("c", "3")); - - var actual = _sut.CreateDatabase(_log.Object, _configurationManager.Object, TransactionMode.None, false); - - Assert.AreEqual("1", actual.Variables.GetValue("a")); - Assert.AreEqual("2", actual.Variables.GetValue("b")); - Assert.AreEqual("3", actual.Variables.GetValue("c")); - } - - [Test] - public void CreateDatabaseValidateVariables() - { - _sut.Variables.Add("a b", "1"); - - _configuration.Variables.Add(new NameValueConfigurationElement("c d", "1")); - - var ex = Assert.Throws(() => _sut.CreateDatabase(_log.Object, _configurationManager.Object, TransactionMode.None, false)); - - ex!.Message.ShouldContain("a b"); - ex.Message.ShouldContain("c d"); - } - [Test] public void ParseFrom() { diff --git a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs index 68c56e72..bbd31da4 100644 --- a/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CreateCommandLineTest.cs @@ -4,8 +4,6 @@ using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts; -using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; @@ -65,20 +63,27 @@ public void Parse() public void CreateCommand() { _sut.WhatIf = true; - _sut.ConnectionString = MsSqlQuery.ConnectionString; + _sut.ConnectionString = "connection string"; _sut.UsePowerShell = @"c:\PowerShell"; + var builder = new EnvironmentBuilderMock() + .WithLogger(_log.Object) + .WithConfiguration(_sut.ConfigurationFile) + .WithPowerShellScripts(_sut.UsePowerShell) + .WithAssemblyScripts() + .WithVariables(_sut.Variables) + .WithDataBase(_sut.ConnectionString, TransactionMode.None, _sut.WhatIf) + .WithCreateSequence(_sut.Scripts); + var actual = _sut - .CreateCommand(_log.Object) + .CreateCommand(_log.Object, builder.Build()) .ShouldBeOfType(); - actual.Log.ShouldBe(_log.Object); - var database = actual.Database.ShouldBeOfType(); - database.WhatIf.ShouldBeTrue(); - - var scriptFactory = actual.ScriptSequence.ShouldBeOfType().ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); + builder.VerifyAll(); - actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); + actual.Log.ShouldBe(_log.Object); + actual.Database.ShouldBe(builder.Database); + actual.ScriptResolver.ShouldBe(builder.ScriptResolver); + actual.ScriptSequence.ShouldBe(builder.CreateSequence); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs new file mode 100644 index 00000000..01c63625 --- /dev/null +++ b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using System.Linq; +using Moq; +using Shouldly; +using SqlDatabase.Adapter; +using SqlDatabase.FileSystem; +using SqlDatabase.Scripts; + +namespace SqlDatabase.Configuration; + +internal sealed class EnvironmentBuilderMock +{ + private readonly Mock _mock = new(MockBehavior.Strict); + private readonly List _mockSequence = new(); + + public IDatabase Database { get; } = new Mock(MockBehavior.Strict).Object; + + public IScriptResolver ScriptResolver { get; } = new Mock(MockBehavior.Strict).Object; + + public IUpgradeScriptSequence UpgradeSequence { get; } = new Mock(MockBehavior.Strict).Object; + + public ICreateScriptSequence CreateSequence { get; } = new Mock(MockBehavior.Strict).Object; + + public EnvironmentBuilderMock WithLogger(ILogger logger) + { + _mock.Setup(b => b.WithLogger(logger)).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithLogger)); + return this; + } + + public EnvironmentBuilderMock WithConfiguration(string? configurationFile) + { + _mock.Setup(b => b.WithConfiguration(configurationFile)).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithConfiguration)); + return this; + } + + public EnvironmentBuilderMock WithPowerShellScripts(string? installationPath) + { + _mock.Setup(b => b.WithPowerShellScripts(installationPath)).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithPowerShellScripts)); + return this; + } + + public EnvironmentBuilderMock WithAssemblyScripts() + { + _mock.Setup(b => b.WithAssemblyScripts()).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithAssemblyScripts)); + return this; + } + + public EnvironmentBuilderMock WithVariables(IDictionary variables) + { + _mock.Setup(b => b.WithVariables(variables)).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithVariables)); + return this; + } + + public EnvironmentBuilderMock WithDataBase(string connectionString, TransactionMode transaction, bool whatIf) + { + _mock.Setup(b => b.WithDataBase(connectionString, transaction, whatIf)).Returns(_mock.Object); + _mockSequence.Add(nameof(IEnvironmentBuilder.WithDataBase)); + return this; + } + + public EnvironmentBuilderMock WithUpgradeSequence(IList scripts, bool folderAsModuleName) + { + _mock.Setup(b => b.BuildUpgradeSequence(scripts, folderAsModuleName)).Returns(UpgradeSequence); + _mockSequence.Add(nameof(IEnvironmentBuilder.BuildUpgradeSequence)); + return this; + } + + public EnvironmentBuilderMock WithCreateSequence(IList scripts) + { + _mock.Setup(b => b.BuildCreateSequence(scripts)).Returns(CreateSequence); + _mockSequence.Add(nameof(IEnvironmentBuilder.BuildCreateSequence)); + return this; + } + + public IEnvironmentBuilder Build() + { + _mock.Setup(b => b.BuildDatabase()).Returns(Database); + _mock.Setup(b => b.BuildScriptResolver()).Returns(ScriptResolver); + + return _mock.Object; + } + + public void VerifyAll() + { + _mock.VerifyAll(); + + var sequence = _mock + .Invocations + .Select(i => i.Method.Name) + .Where(i => i != nameof(IEnvironmentBuilder.BuildDatabase) && i != nameof(IEnvironmentBuilder.BuildScriptResolver)) + .ToArray(); + sequence.ShouldBe(_mockSequence); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs new file mode 100644 index 00000000..1e4d5491 --- /dev/null +++ b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using Moq; +using NUnit.Framework; +using Shouldly; +using SqlDatabase.Adapter; +using SqlDatabase.Scripts; + +namespace SqlDatabase.Configuration; + +[TestFixture] +public class EnvironmentBuilderTest +{ + private Mock _log = null!; + private AppConfiguration _configuration = null!; + private EnvironmentBuilder _sut = null!; + + [SetUp] + public void BeforeEachTest() + { + _log = new Mock(MockBehavior.Strict); + _configuration = new AppConfiguration(); + + _sut = new EnvironmentBuilder(); + + _sut + .WithConfiguration(_configuration) + .WithLogger(_log.Object); + } + + [Test] + public void CreateDatabase() + { + _sut + .WithDataBase("Data Source=.;Initial Catalog=SqlDatabaseTest", TransactionMode.PerStep, true) + .WithVariables(new Dictionary()); + + var actual = _sut.BuildDatabase().ShouldBeOfType(); + + actual.Log.ShouldBe(_log.Object); + actual.Adapter.ShouldNotBeNull(); + actual.Transaction.ShouldBe(TransactionMode.PerStep); + actual.WhatIf.ShouldBeTrue(); + } + + [Test] + public void CreateDatabaseApplyVariables() + { + var variables = new Dictionary + { + { "a", "1" }, + { "b", "2" } + }; + + _sut + .WithDataBase("Data Source=.;Initial Catalog=SqlDatabaseTest", TransactionMode.None, false) + .WithVariables(variables); + + _configuration.Variables.Add(new NameValueConfigurationElement("b", "2.2")); + _configuration.Variables.Add(new NameValueConfigurationElement("c", "3")); + + var actual = _sut.BuildDatabase().ShouldBeOfType(); + + actual.Variables.GetValue("a").ShouldBe("1"); + actual.Variables.GetValue("b").ShouldBe("2"); + actual.Variables.GetValue("c").ShouldBe("3"); + } + + [Test] + public void CreateDatabaseValidateVariables() + { + var variables = new Dictionary + { + { "a b", "1" } + }; + + _sut + .WithDataBase("Data Source=.;Initial Catalog=SqlDatabaseTest", TransactionMode.None, false) + .WithVariables(variables); + + _configuration.Variables.Add(new NameValueConfigurationElement("c d", "1")); + + var ex = Assert.Throws(() => _sut.BuildDatabase()); + + ex!.Message.ShouldContain("a b"); + ex.Message.ShouldContain("c d"); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs index 8871e0a4..5ed2b3c9 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExecuteCommandLineTest.cs @@ -4,8 +4,6 @@ using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts; -using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; @@ -75,20 +73,28 @@ public void Parse() public void CreateCommand() { _sut.WhatIf = true; - _sut.ConnectionString = MsSqlQuery.ConnectionString; + _sut.ConnectionString = "connection string"; + _sut.Transaction = TransactionMode.PerStep; _sut.UsePowerShell = @"c:\PowerShell"; + var builder = new EnvironmentBuilderMock() + .WithLogger(_log.Object) + .WithConfiguration(_sut.ConfigurationFile) + .WithPowerShellScripts(_sut.UsePowerShell) + .WithAssemblyScripts() + .WithVariables(_sut.Variables) + .WithDataBase(_sut.ConnectionString, _sut.Transaction, _sut.WhatIf) + .WithCreateSequence(_sut.Scripts); + var actual = _sut - .CreateCommand(_log.Object) + .CreateCommand(_log.Object, builder.Build()) .ShouldBeOfType(); - actual.Log.ShouldBe(_log.Object); - var database = actual.Database.ShouldBeOfType(); - database.WhatIf.ShouldBeTrue(); - - var scriptFactory = actual.ScriptSequence.ShouldBeOfType().ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); + builder.VerifyAll(); - actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); + actual.Log.ShouldBe(_log.Object); + actual.Database.ShouldBe(builder.Database); + actual.ScriptResolver.ShouldBe(builder.ScriptResolver); + actual.ScriptSequence.ShouldBe(builder.CreateSequence); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs index 4be3077a..a44971ba 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs @@ -6,7 +6,6 @@ using SqlDatabase.Commands; using SqlDatabase.Export; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts; using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; @@ -58,16 +57,26 @@ public void Parse() [Test] public void CreateCommand() { - _sut.ConnectionString = MsSqlQuery.ConnectionString; + _sut.ConnectionString = "connection string"; _sut.DestinationTableName = "table 1"; + var builder = new EnvironmentBuilderMock() + .WithLogger(_log.Object) + .WithConfiguration(_sut.ConfigurationFile) + .WithVariables(_sut.Variables) + .WithDataBase(_sut.ConnectionString, TransactionMode.None, false) + .WithCreateSequence(_sut.Scripts); + var actual = _sut - .CreateCommand(_log.Object) + .CreateCommand(_log.Object, builder.Build()) .ShouldBeOfType(); + builder.VerifyAll(); + actual.Log.ShouldNotBe(_log.Object); - actual.Database.ShouldBeOfType(); - actual.ScriptSequence.ShouldBeOfType(); + actual.Database.ShouldBe(builder.Database); + actual.ScriptResolver.ShouldBe(builder.ScriptResolver); + actual.ScriptSequence.ShouldBe(builder.CreateSequence); actual.OpenOutput.ShouldNotBeNull(); actual.DestinationTableName.ShouldBe("table 1"); } diff --git a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs index e9d0150a..e2bb4077 100644 --- a/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/UpgradeCommandLineTest.cs @@ -4,8 +4,6 @@ using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts; -using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; @@ -71,24 +69,28 @@ public void CreateCommand() { _sut.WhatIf = true; _sut.FolderAsModuleName = true; - _sut.ConnectionString = MsSqlQuery.ConnectionString; + _sut.Transaction = TransactionMode.PerStep; + _sut.ConnectionString = "connection string"; _sut.UsePowerShell = @"c:\PowerShell"; + var builder = new EnvironmentBuilderMock() + .WithLogger(_log.Object) + .WithConfiguration(_sut.ConfigurationFile) + .WithPowerShellScripts(_sut.UsePowerShell) + .WithAssemblyScripts() + .WithVariables(_sut.Variables) + .WithDataBase(_sut.ConnectionString, _sut.Transaction, _sut.WhatIf) + .WithUpgradeSequence(_sut.Scripts, _sut.FolderAsModuleName); + var actual = _sut - .CreateCommand(_log.Object) + .CreateCommand(_log.Object, builder.Build()) .ShouldBeOfType(); - actual.Log.ShouldBe(_log.Object); - var database = actual.Database.ShouldBeOfType(); - database.WhatIf.ShouldBeTrue(); - - var sequence = actual.ScriptSequence.ShouldBeOfType(); - sequence.WhatIf.ShouldBeTrue(); - sequence.FolderAsModuleName.ShouldBeTrue(); + builder.VerifyAll(); - var scriptFactory = sequence.ScriptFactory.ShouldBeOfType(); - scriptFactory.PowerShellFactory!.InstallationPath.ShouldBe(@"c:\PowerShell"); - - actual.PowerShellFactory.ShouldBe(scriptFactory.PowerShellFactory); + actual.Log.ShouldBe(_log.Object); + actual.Database.ShouldBe(builder.Database); + actual.ScriptResolver.ShouldBe(builder.ScriptResolver); + actual.ScriptSequence.ShouldBe(builder.UpgradeSequence); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs index 2d95a8aa..c70bec07 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs @@ -27,8 +27,6 @@ public class ProgramTest [SetUp] public void BeforeEachTest() { - TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["MsSql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs index 634f98b8..40735909 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs @@ -27,8 +27,6 @@ public class ProgramTest [SetUp] public void BeforeEachTest() { - TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["MySql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs index 47e9b898..bf8b4bbd 100644 --- a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs +++ b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs @@ -27,8 +27,6 @@ public class ProgramTest [SetUp] public void BeforeEachTest() { - TestPowerShellHost.GetOrCreateFactory(); - _scriptsLocation = ConfigurationManager.AppSettings["PgSql.IntegrationTestsScriptsLocation"]!; if (!Path.IsPathRooted(_scriptsLocation)) { diff --git a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs deleted file mode 100644 index 0724f4cc..00000000 --- a/Sources/SqlDatabase.Test/Scripts/ScriptFactoryTest.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.IO; -using Moq; -using NUnit.Framework; -using Shouldly; -using SqlDatabase.Configuration; -using SqlDatabase.TestApi; - -namespace SqlDatabase.Scripts; - -[TestFixture] -public class ScriptFactoryTest -{ - private ScriptFactory _sut = null!; - private Mock _powerShellFactory = null!; - private AssemblyScriptConfiguration _configuration = null!; - private Mock _textReader = null!; - - [SetUp] - public void BeforeEachTest() - { - _configuration = new AssemblyScriptConfiguration(); - _powerShellFactory = new Mock(MockBehavior.Strict); - _textReader = new Mock(MockBehavior.Strict); - - _sut = new ScriptFactory(_configuration, _powerShellFactory.Object, _textReader.Object); - } - - [Test] - public void FromSqlFile() - { - var file = FileFactory.File("11.sql", "some script"); - - _sut.IsSupported(file).ShouldBeTrue(); - - var script = _sut.FromFile(file).ShouldBeOfType(); - - script.DisplayName.ShouldBe("11.sql"); - script.TextReader.ShouldBe(_textReader.Object); - new StreamReader(script.ReadSqlContent()).ReadToEnd().ShouldBe("some script"); - } - - [Test] - public void FromPs1File() - { - var file = FileFactory.File( - "11.ps1", - "some script", - FileFactory.Folder("name", FileFactory.File("11.txt", "3, 2, 1"))); - - _powerShellFactory - .Setup(f => f.Request()); - - _sut.IsSupported(file).ShouldBeTrue(); - - var script = _sut.FromFile(file).ShouldBeOfType(); - - script.PowerShellFactory.ShouldBe(_powerShellFactory.Object); - script.DisplayName.ShouldBe("11.ps1"); - new StreamReader(script.ReadScriptContent()).ReadToEnd().ShouldBe("some script"); - new StreamReader(script.ReadDescriptionContent()!).ReadToEnd().ShouldBe("3, 2, 1"); - _powerShellFactory.VerifyAll(); - } - - [Test] - public void FromPs1FileNotSupported() - { - var file = FileFactory.File("11.ps1", "some script"); - _sut.PowerShellFactory = null; - - _sut.IsSupported(file).ShouldBeFalse(); - - Assert.Throws(() => _sut.FromFile(file)); - } - - [Test] - public void FromFileNotSupported() - { - var file = FileFactory.File("11.txt"); - - _sut.IsSupported(file).ShouldBeFalse(); - Assert.Throws(() => _sut.FromFile(file)); - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs b/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs new file mode 100644 index 00000000..5ae26ebc --- /dev/null +++ b/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using Moq; +using NUnit.Framework; +using Shouldly; +using SqlDatabase.Adapter; +using SqlDatabase.TestApi; + +namespace SqlDatabase.Scripts; + +[TestFixture] +public class ScriptResolverTest +{ + private ScriptResolver _sut = null!; + private Mock _factory = null!; + + [SetUp] + public void BeforeEachTest() + { + _factory = new Mock(MockBehavior.Strict); + _sut = new ScriptResolver(new[] { _factory.Object }); + } + + ////[Test] + ////public void FromSqlFile() + ////{ + //// _textReader = new Mock(MockBehavior.Strict); + + //// var file = FileFactory.File("11.sql", "some script"); + + //// _sut.IsSupported(file).ShouldBeTrue(); + + //// var script = _sut.FromFile(file).ShouldBeOfType(); + + //// script.DisplayName.ShouldBe("11.sql"); + //// script.TextReader.ShouldBe(_textReader.Object); + //// new StreamReader(script.ReadSqlContent()).ReadToEnd().ShouldBe("some script"); + ////} + + [Test] + public void FromFile() + { + var file = FileFactory.File( + "11.ps1", + "some script", + FileFactory.Folder("name", FileFactory.File("11.txt", "3, 2, 1"))); + + _factory + .Setup(f => f.IsSupported(file)) + .Returns(true); + + _sut.IsSupported(file).ShouldBeTrue(); + + var script = new Mock(MockBehavior.Strict); + + _factory + .Setup(f => f.FromFile(file)) + .Returns(script.Object); + + _sut.FromFile(file).ShouldBe(script.Object); + + _factory.VerifyAll(); + } + + [Test] + public void FromFileNotSupported() + { + var file = FileFactory.File("11.txt"); + + _factory + .Setup(f => f.IsSupported(file)) + .Returns(false); + + _sut.IsSupported(file).ShouldBeFalse(); + Assert.Throws(() => _sut.FromFile(file)); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index b0f49456..30f5e8ec 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -31,12 +31,6 @@ - - - - - - @@ -52,9 +46,5 @@ - - - - diff --git a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs b/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs deleted file mode 100644 index 709cd5b7..00000000 --- a/Sources/SqlDatabase.Test/TestApi/TestPowerShellHost.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using Moq; -using SqlDatabase.Adapter; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.PowerShellInternal; - -namespace SqlDatabase.TestApi; - -internal static class TestPowerShellHost -{ - public static IPowerShellFactory GetOrCreateFactory() - { - if (PowerShellFactory.SharedTestFactory == null) - { - PowerShellFactory.SharedTestFactory = CreateFactory(); - } - - return PowerShellFactory.SharedTestFactory; - } - - private static IPowerShellFactory CreateFactory() - { - var logger = new Mock(MockBehavior.Strict); - logger - .Setup(l => l.Info(It.IsNotNull())) - .Callback(m => Console.WriteLine("info: " + m)); - logger - .Setup(l => l.Error(It.IsNotNull())) - .Callback(m => Console.WriteLine("error: " + m)); - logger - .Setup(l => l.Indent()) - .Returns((IDisposable)null!); - - var factory = PowerShellFactory.Create(null); - factory.Request(); - factory.InitializeIfRequested(logger.Object); - return factory; - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index 11656616..66d71cc1 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -30,11 +30,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.TestApi", "SqlD EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter", "SqlDatabase.Adapter\SqlDatabase.Adapter.csproj", "{CDC9677C-6205-402B-ADE2-C958B8A7DD24}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter", "SqlDatabase.Adapter\SqlDatabase.Adapter.csproj", "{CDC9677C-6205-402B-ADE2-C958B8A7DD24}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.AssemblyScripts", "SqlDatabase.Adapter.AssemblyScripts\SqlDatabase.Adapter.AssemblyScripts.csproj", "{A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.AssemblyScripts", "SqlDatabase.Adapter.AssemblyScripts\SqlDatabase.Adapter.AssemblyScripts.csproj", "{A5D5FEF3-6675-4E1A-9A7F-C3B3CDB3ACB5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.AssemblyScripts.Test", "SqlDatabase.Adapter.AssemblyScripts.Test\SqlDatabase.Adapter.AssemblyScripts.Test.csproj", "{68DC9F11-567F-4A51-85E6-4C87994F9FFF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.AssemblyScripts.Test", "SqlDatabase.Adapter.AssemblyScripts.Test\SqlDatabase.Adapter.AssemblyScripts.Test.csproj", "{68DC9F11-567F-4A51-85E6-4C87994F9FFF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PowerShellScripts", "SqlDatabase.Adapter.PowerShellScripts\SqlDatabase.Adapter.PowerShellScripts.csproj", "{F8FEE835-4DFB-4143-BC93-EB7C50C951CB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PowerShellScripts.Test", "SqlDatabase.Adapter.PowerShellScripts.Test\SqlDatabase.Adapter.PowerShellScripts.Test.csproj", "{4539721A-947F-4AD1-B007-EE695761B8F9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -90,6 +94,14 @@ Global {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Debug|Any CPU.Build.0 = Debug|Any CPU {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Release|Any CPU.ActiveCfg = Release|Any CPU {68DC9F11-567F-4A51-85E6-4C87994F9FFF}.Release|Any CPU.Build.0 = Release|Any CPU + {F8FEE835-4DFB-4143-BC93-EB7C50C951CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8FEE835-4DFB-4143-BC93-EB7C50C951CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8FEE835-4DFB-4143-BC93-EB7C50C951CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8FEE835-4DFB-4143-BC93-EB7C50C951CB}.Release|Any CPU.Build.0 = Release|Any CPU + {4539721A-947F-4AD1-B007-EE695761B8F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4539721A-947F-4AD1-B007-EE695761B8F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4539721A-947F-4AD1-B007-EE695761B8F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4539721A-947F-4AD1-B007-EE695761B8F9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -101,6 +113,7 @@ Global {4334C327-A578-4247-B1CC-23A63B2CC7F2} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {8724A867-C5F5-4A7C-B414-D84AB9830AA0} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {68DC9F11-567F-4A51-85E6-4C87994F9FFF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {4539721A-947F-4AD1-B007-EE695761B8F9} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index 5b1e2b68..7f9a7137 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -9,18 +9,18 @@ internal sealed class DatabaseCreateCommand : DatabaseCommandBase { public DatabaseCreateCommand( ICreateScriptSequence scriptSequence, - IPowerShellFactory powerShellFactory, + IScriptResolver scriptResolver, IDatabase database, ILogger log) : base(database, log) { ScriptSequence = scriptSequence; - PowerShellFactory = powerShellFactory; + ScriptResolver = scriptResolver; } public ICreateScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; } + public IScriptResolver ScriptResolver { get; } protected override void Greet(string databaseLocation) { @@ -35,7 +35,7 @@ protected override void ExecuteCore() throw new ConfigurationErrorsException("scripts to create database not found."); } - PowerShellFactory.InitializeIfRequested(Log); + ScriptResolver.InitializeEnvironment(Log, sequences); foreach (var script in sequences) { diff --git a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs index 3bc03edc..a2a3a454 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs @@ -8,18 +8,18 @@ internal sealed class DatabaseExecuteCommand : DatabaseCommandBase { public DatabaseExecuteCommand( ICreateScriptSequence scriptSequence, - IPowerShellFactory powerShellFactory, + IScriptResolver scriptResolver, IDatabase database, ILogger log) : base(database, log) { ScriptSequence = scriptSequence; - PowerShellFactory = powerShellFactory; + ScriptResolver = scriptResolver; } public ICreateScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; } + public IScriptResolver ScriptResolver { get; } protected override void Greet(string databaseLocation) { @@ -29,8 +29,12 @@ protected override void Greet(string databaseLocation) protected override void ExecuteCore() { var sequences = ScriptSequence.BuildSequence(); + if (sequences.Count == 0) + { + return; + } - PowerShellFactory.InitializeIfRequested(Log); + ScriptResolver.InitializeEnvironment(Log, sequences); foreach (var script in sequences) { diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 713c1467..13dbec93 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -12,17 +12,21 @@ internal sealed class DatabaseExportCommand : DatabaseCommandBase { public DatabaseExportCommand( ICreateScriptSequence scriptSequence, + IScriptResolver scriptResolver, Func openOutput, IDatabase database, ILogger log) : base(database, log) { ScriptSequence = scriptSequence; + ScriptResolver = scriptResolver; OpenOutput = openOutput; } public ICreateScriptSequence ScriptSequence { get; } + public IScriptResolver ScriptResolver { get; } + public Func OpenOutput { get; } public string? DestinationTableName { get; set; } @@ -37,6 +41,12 @@ protected override void Greet(string databaseLocation) protected override void ExecuteCore() { var sequences = ScriptSequence.BuildSequence(); + if (sequences.Count == 0) + { + return; + } + + ScriptResolver.InitializeEnvironment(Log, sequences); using (var output = OpenOutput()) { diff --git a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs index 84b28d88..6c89bbf2 100644 --- a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs @@ -11,18 +11,18 @@ internal sealed class DatabaseUpgradeCommand : DatabaseCommandBase { public DatabaseUpgradeCommand( IUpgradeScriptSequence scriptSequence, - IPowerShellFactory powerShellFactory, + IScriptResolver scriptResolver, IDatabase database, ILogger log) : base(database, log) { ScriptSequence = scriptSequence; - PowerShellFactory = powerShellFactory; + ScriptResolver = scriptResolver; } public IUpgradeScriptSequence ScriptSequence { get; } - public IPowerShellFactory PowerShellFactory { get; } + public IScriptResolver ScriptResolver { get; } protected override void Greet(string databaseLocation) { @@ -47,7 +47,7 @@ protected override void ExecuteCore() ShowMigrationSequenceFull(sequence); } - PowerShellFactory.InitializeIfRequested(Log); + ScriptResolver.InitializeEnvironment(Log, sequence.Select(i => i.Script)); foreach (var step in sequence) { diff --git a/Sources/SqlDatabase/Configuration/CommandLineBase.cs b/Sources/SqlDatabase/Configuration/CommandLineBase.cs index 99aa383b..82fcc182 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineBase.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineBase.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using System.Linq; using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts; namespace SqlDatabase.Configuration; @@ -42,52 +40,6 @@ public void Parse(CommandLine args) public abstract ICommand CreateCommand(ILogger logger); - internal Database CreateDatabase(ILogger logger, IConfigurationManager configuration, TransactionMode transaction, bool whatIf) - { - IDatabaseAdapter adapter; - try - { - adapter = DatabaseAdapterFactory.CreateAdapter(ConnectionString!, configuration.SqlDatabase, logger); - } - catch (Exception ex) - { - throw new InvalidCommandLineException(Arg.Database, "Invalid connection string value.", ex); - } - - var database = new Database(adapter, logger, transaction, whatIf); - - var configurationVariables = configuration.SqlDatabase.Variables; - foreach (var name in configurationVariables.AllKeys) - { - database.Variables.SetValue(VariableSource.ConfigurationFile, name, configurationVariables[name].Value); - } - - foreach (var entry in Variables) - { - database.Variables.SetValue(VariableSource.CommandLine, entry.Key, entry.Value); - } - - var invalidNames = database - .Variables - .GetNames() - .OrderBy(i => i) - .Where(i => !SqlScriptVariableParser.IsValidVariableName(i)) - .Select(i => "[{0}]".FormatWith(i)) - .ToList(); - - if (invalidNames.Count == 1) - { - throw new InvalidOperationException("The variable name {0} is invalid.".FormatWith(invalidNames[0])); - } - - if (invalidNames.Count > 1) - { - throw new InvalidOperationException("The following variable names are invalid: {0}.".FormatWith(string.Join(", ", invalidNames))); - } - - return database; - } - protected internal virtual void Validate() { } diff --git a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs index 3ed6e183..6556c3c8 100644 --- a/Sources/SqlDatabase/Configuration/CreateCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/CreateCommandLine.cs @@ -1,8 +1,5 @@ -using System.Linq; -using SqlDatabase.Adapter; +using SqlDatabase.Adapter; using SqlDatabase.Commands; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.PowerShellInternal; namespace SqlDatabase.Configuration; @@ -12,19 +9,23 @@ internal sealed class CreateCommandLine : CommandLineBase public bool WhatIf { get; set; } - public override ICommand CreateCommand(ILogger logger) - { - var configuration = new ConfigurationManager(); - configuration.LoadFrom(ConfigurationFile); - - var powerShellFactory = PowerShellFactory.Create(UsePowerShell); - var database = CreateDatabase(logger, configuration, TransactionMode.None, WhatIf); + public override ICommand CreateCommand(ILogger logger) => CreateCommand(logger, new EnvironmentBuilder()); - var sequence = new CreateScriptSequence( - Scripts.ToArray(), - new ScriptFactory(configuration.SqlDatabase.AssemblyScript, powerShellFactory, database.Adapter.CreateSqlTextReader())); - - return new DatabaseCreateCommand(sequence, powerShellFactory, database, logger); + internal ICommand CreateCommand(ILogger logger, IEnvironmentBuilder builder) + { + builder + .WithLogger(logger) + .WithConfiguration(ConfigurationFile) + .WithPowerShellScripts(UsePowerShell) + .WithAssemblyScripts() + .WithVariables(Variables) + .WithDataBase(ConnectionString!, TransactionMode.None, WhatIf); + + var database = builder.BuildDatabase(); + var scriptResolver = builder.BuildScriptResolver(); + var sequence = builder.BuildCreateSequence(Scripts); + + return new DatabaseCreateCommand(sequence, scriptResolver, database, logger); } protected override bool ParseArg(Arg arg) diff --git a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs new file mode 100644 index 00000000..998a44bf --- /dev/null +++ b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SqlDatabase.Adapter; +using SqlDatabase.Adapter.AssemblyScripts; +using SqlDatabase.Adapter.PowerShellScripts; +using SqlDatabase.FileSystem; +using SqlDatabase.Scripts; +using SqlDatabase.Scripts.UpgradeInternal; + +namespace SqlDatabase.Configuration; + +internal sealed class EnvironmentBuilder : IEnvironmentBuilder +{ + private ILogger? _logger; + private AppConfiguration? _configuration; + private string? _connectionString; + private TransactionMode _transactionMode; + private bool _whatIf; + private IDictionary? _variables; + private PowerShellScriptFactory? _powerShellScript; + private AssemblyScriptFactory? _assemblyScript; + private ScriptResolver? _scriptResolver; + private IDatabase? _database; + + public IEnvironmentBuilder WithConfiguration(string? configurationFile) + { + var configuration = new ConfigurationManager(); + configuration.LoadFrom(configurationFile); + + return WithConfiguration(configuration.SqlDatabase); + } + + public IEnvironmentBuilder WithLogger(ILogger logger) + { + _logger = logger; + + return this; + } + + public IEnvironmentBuilder WithPowerShellScripts(string? installationPath) + { + _powerShellScript = new PowerShellScriptFactory(installationPath); + return this; + } + + public IEnvironmentBuilder WithAssemblyScripts() + { + var configuration = GetConfiguration().AssemblyScript; + _assemblyScript = new AssemblyScriptFactory(configuration.ClassName, configuration.ClassName); + return this; + } + + public IEnvironmentBuilder WithVariables(IDictionary variables) + { + _variables = variables; + return this; + } + + public IEnvironmentBuilder WithDataBase(string connectionString, TransactionMode transaction, bool whatIf) + { + _connectionString = connectionString; + _transactionMode = transaction; + _whatIf = whatIf; + return this; + } + + public IDatabase BuildDatabase() + { + if (_database == null) + { + _database = CreateDatabase(); + } + + return _database; + } + + public IScriptResolver BuildScriptResolver() + { + if (_scriptResolver == null) + { + _scriptResolver = CreateScriptResolver(); + } + + return _scriptResolver; + } + + public IUpgradeScriptSequence BuildUpgradeSequence(IList scripts, bool folderAsModuleName) + { + var scriptResolver = (ScriptResolver)BuildScriptResolver(); + var database = BuildDatabase(); + + return new UpgradeScriptSequence( + scriptResolver, + new ModuleVersionResolver(GetLogger(), database), + scripts.ToArray(), + GetLogger(), + folderAsModuleName, + _whatIf); + } + + public ICreateScriptSequence BuildCreateSequence(IList scripts) + { + var scriptResolver = (ScriptResolver)BuildScriptResolver(); + return new CreateScriptSequence(scripts.ToArray(), scriptResolver); + } + + internal IEnvironmentBuilder WithConfiguration(AppConfiguration configuration) + { + _configuration = configuration; + return this; + } + + private Database CreateDatabase() + { + if (_connectionString == null || _variables == null) + { + throw new InvalidOperationException(); + } + + IDatabaseAdapter adapter; + try + { + adapter = DatabaseAdapterFactory.CreateAdapter(_connectionString, GetConfiguration(), GetLogger()); + } + catch (Exception ex) + { + throw new InvalidCommandLineException(Arg.Database, "Invalid connection string value.", ex); + } + + var database = new Database(adapter, GetLogger(), _transactionMode, _whatIf); + + var configurationVariables = GetConfiguration().Variables; + foreach (var name in configurationVariables.AllKeys) + { + database.Variables.SetValue(VariableSource.ConfigurationFile, name, configurationVariables[name].Value); + } + + foreach (var entry in _variables) + { + database.Variables.SetValue(VariableSource.CommandLine, entry.Key, entry.Value); + } + + var invalidNames = database + .Variables + .GetNames() + .OrderBy(i => i) + .Where(i => !SqlScriptVariableParser.IsValidVariableName(i)) + .Select(i => "[{0}]".FormatWith(i)) + .ToList(); + + if (invalidNames.Count == 1) + { + throw new InvalidOperationException("The variable name {0} is invalid.".FormatWith(invalidNames[0])); + } + + if (invalidNames.Count > 1) + { + throw new InvalidOperationException("The following variable names are invalid: {0}.".FormatWith(string.Join(", ", invalidNames))); + } + + return database; + } + + private ScriptResolver CreateScriptResolver() + { + var factories = new List(3); + + factories.Add(new SqlScriptFactory(BuildDatabase().Adapter.CreateSqlTextReader())); + + if (_powerShellScript != null) + { + factories.Add(_powerShellScript); + } + + if (_assemblyScript != null) + { + factories.Add(_assemblyScript); + } + + return new ScriptResolver(factories.ToArray()); + } + + private AppConfiguration GetConfiguration() + { + if (_configuration == null) + { + throw new InvalidOperationException(); + } + + return _configuration; + } + + private ILogger GetLogger() + { + if (_logger == null) + { + throw new InvalidOperationException(); + } + + return _logger; + } + + private sealed class SqlScriptFactory : IScriptFactory + { + private readonly ISqlTextReader _textReader; + + public SqlScriptFactory(ISqlTextReader textReader) + { + _textReader = textReader; + } + + public bool IsSupported(IFile file) + { + return ".sql".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); + } + + public IScript FromFile(IFile file) + { + return new TextScript(file.Name, file.OpenRead, _textReader); + } + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs index 0ec0c37c..d06f660e 100644 --- a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs @@ -1,9 +1,6 @@ using System; -using System.Linq; using SqlDatabase.Adapter; using SqlDatabase.Commands; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.PowerShellInternal; namespace SqlDatabase.Configuration; @@ -15,22 +12,23 @@ internal sealed class ExecuteCommandLine : CommandLineBase public bool WhatIf { get; set; } - public override ICommand CreateCommand(ILogger logger) - { - var configuration = new ConfigurationManager(); - configuration.LoadFrom(ConfigurationFile); + public override ICommand CreateCommand(ILogger logger) => CreateCommand(logger, new EnvironmentBuilder()); - var powerShellFactory = PowerShellFactory.Create(UsePowerShell); - var database = CreateDatabase(logger, configuration, TransactionMode.None, WhatIf); + internal ICommand CreateCommand(ILogger logger, IEnvironmentBuilder builder) + { + builder + .WithLogger(logger) + .WithConfiguration(ConfigurationFile) + .WithPowerShellScripts(UsePowerShell) + .WithAssemblyScripts() + .WithVariables(Variables) + .WithDataBase(ConnectionString!, Transaction, WhatIf); - var sequence = new CreateScriptSequence( - Scripts.ToArray(), - new ScriptFactory( - configuration.SqlDatabase.AssemblyScript, - powerShellFactory, - database.Adapter.CreateSqlTextReader())); + var database = builder.BuildDatabase(); + var scriptResolver = builder.BuildScriptResolver(); + var sequence = builder.BuildCreateSequence(Scripts); - return new DatabaseExecuteCommand(sequence, powerShellFactory, database, logger); + return new DatabaseExecuteCommand(sequence, scriptResolver, database, logger); } protected override bool ParseArg(Arg arg) diff --git a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs index 3da050a4..f66363c3 100644 --- a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs @@ -1,10 +1,8 @@ using System; using System.IO; -using System.Linq; using SqlDatabase.Adapter; using SqlDatabase.Commands; using SqlDatabase.Export; -using SqlDatabase.Scripts; namespace SqlDatabase.Configuration; @@ -14,19 +12,23 @@ internal sealed class ExportCommandLine : CommandLineBase public string? DestinationFileName { get; set; } - public override ICommand CreateCommand(ILogger logger) - { - var configuration = new ConfigurationManager(); - configuration.LoadFrom(ConfigurationFile); + public override ICommand CreateCommand(ILogger logger) => CreateCommand(logger, new EnvironmentBuilder()); - var database = CreateDatabase(logger, configuration, TransactionMode.None, false); + internal ICommand CreateCommand(ILogger logger, IEnvironmentBuilder builder) + { + builder + .WithLogger(logger) + .WithConfiguration(ConfigurationFile) + .WithVariables(Variables) + .WithDataBase(ConnectionString!, TransactionMode.None, false); - var sequence = new CreateScriptSequence( - Scripts.ToArray(), - new ScriptFactory(configuration.SqlDatabase.AssemblyScript, null, database.Adapter.CreateSqlTextReader())); + var database = builder.BuildDatabase(); + var scriptResolver = builder.BuildScriptResolver(); + var sequence = builder.BuildCreateSequence(Scripts); return new DatabaseExportCommand( sequence, + scriptResolver, CreateOutput(), database, WrapLogger(logger)) diff --git a/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs new file mode 100644 index 00000000..0d42f373 --- /dev/null +++ b/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using SqlDatabase.Adapter; +using SqlDatabase.FileSystem; +using SqlDatabase.Scripts; + +namespace SqlDatabase.Configuration; + +internal interface IEnvironmentBuilder +{ + IEnvironmentBuilder WithConfiguration(string? configurationFile); + + IEnvironmentBuilder WithLogger(ILogger logger); + + IEnvironmentBuilder WithPowerShellScripts(string? installationPath); + + IEnvironmentBuilder WithAssemblyScripts(); + + IEnvironmentBuilder WithVariables(IDictionary variables); + + IEnvironmentBuilder WithDataBase(string connectionString, TransactionMode transaction, bool whatIf); + + IDatabase BuildDatabase(); + + IScriptResolver BuildScriptResolver(); + + IUpgradeScriptSequence BuildUpgradeSequence(IList scripts, bool folderAsModuleName); + + ICreateScriptSequence BuildCreateSequence(IList scripts); +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs index 71792be1..6319afaf 100644 --- a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs @@ -1,10 +1,6 @@ using System; -using System.Linq; using SqlDatabase.Adapter; using SqlDatabase.Commands; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.PowerShellInternal; -using SqlDatabase.Scripts.UpgradeInternal; namespace SqlDatabase.Configuration; @@ -18,27 +14,23 @@ internal sealed class UpgradeCommandLine : CommandLineBase public bool WhatIf { get; set; } - public override ICommand CreateCommand(ILogger logger) + public override ICommand CreateCommand(ILogger logger) => CreateCommand(logger, new EnvironmentBuilder()); + + internal ICommand CreateCommand(ILogger logger, IEnvironmentBuilder builder) { - var configuration = new ConfigurationManager(); - configuration.LoadFrom(ConfigurationFile); - - var database = CreateDatabase(logger, configuration, Transaction, WhatIf); - var powerShellFactory = PowerShellFactory.Create(UsePowerShell); - var scriptFactory = new ScriptFactory( - configuration.SqlDatabase.AssemblyScript, - powerShellFactory, - database.Adapter.CreateSqlTextReader()); - - var sequence = new UpgradeScriptSequence( - scriptFactory, - new ModuleVersionResolver(logger, database), - Scripts.ToArray(), - logger, - FolderAsModuleName, - WhatIf); - - return new DatabaseUpgradeCommand(sequence, powerShellFactory, database, logger); + builder + .WithLogger(logger) + .WithConfiguration(ConfigurationFile) + .WithPowerShellScripts(UsePowerShell) + .WithAssemblyScripts() + .WithVariables(Variables) + .WithDataBase(ConnectionString!, Transaction, WhatIf); + + var database = builder.BuildDatabase(); + var scriptResolver = builder.BuildScriptResolver(); + var sequence = builder.BuildUpgradeSequence(Scripts, FolderAsModuleName); + + return new DatabaseUpgradeCommand(sequence, scriptResolver, database, logger); } protected override bool ParseArg(Arg arg) diff --git a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs b/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs deleted file mode 100644 index 10191051..00000000 --- a/Sources/SqlDatabase/Scripts/IPowerShellFactory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using SqlDatabase.Adapter; -using SqlDatabase.Scripts.PowerShellInternal; - -namespace SqlDatabase.Scripts; - -internal interface IPowerShellFactory -{ - string? InstallationPath { get; } - - void Request(); - - void InitializeIfRequested(ILogger logger); - - IPowerShell Create(); -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/IScriptResolver.cs b/Sources/SqlDatabase/Scripts/IScriptResolver.cs new file mode 100644 index 00000000..65915cc9 --- /dev/null +++ b/Sources/SqlDatabase/Scripts/IScriptResolver.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using SqlDatabase.Adapter; + +namespace SqlDatabase.Scripts; + +internal interface IScriptResolver +{ + void InitializeEnvironment(ILogger logger, IEnumerable scripts); +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs b/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs deleted file mode 100644 index cd32fcc0..00000000 --- a/Sources/SqlDatabase/Scripts/PowerShellInternal/PowerShellFactory.native.cs +++ /dev/null @@ -1,8 +0,0 @@ -#if NET472 || NETSTANDARD -namespace SqlDatabase.Scripts.PowerShellInternal -{ - internal partial class PowerShellFactory - { - } -} -#endif \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ScriptFactory.cs b/Sources/SqlDatabase/Scripts/ScriptFactory.cs deleted file mode 100644 index b7e23bd3..00000000 --- a/Sources/SqlDatabase/Scripts/ScriptFactory.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using SqlDatabase.Adapter; -using SqlDatabase.Adapter.AssemblyScripts; -using SqlDatabase.Configuration; -using SqlDatabase.FileSystem; - -namespace SqlDatabase.Scripts; - -internal sealed class ScriptFactory : IScriptFactory -{ - private readonly IScriptFactory[] _concrete; - - public ScriptFactory(AssemblyScriptConfiguration assemblyScriptConfiguration, IPowerShellFactory? powerShellFactory, ISqlTextReader textReader) - { - _concrete = new IScriptFactory[] - { - new SqlScriptFactory(textReader), - new PowerShellScriptFactory(powerShellFactory), - new AssemblyScriptFactory(assemblyScriptConfiguration.ClassName, assemblyScriptConfiguration.MethodName) - }; - } - - internal IPowerShellFactory? PowerShellFactory - { - get => ((PowerShellScriptFactory)_concrete[1]).PowerShellFactory; - set => ((PowerShellScriptFactory)_concrete[1]).PowerShellFactory = value; - } - - public bool IsSupported(IFile file) => FindSupported(file) != null; - - public IScript FromFile(IFile file) - { - var factory = FindSupported(file); - if (factory == null) - { - throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); - } - - return factory.FromFile(file); - } - - private static Func CreateScriptDescriptionReader(IFile file) - { - return () => - { - var parent = file.GetParent(); - if (parent == null) - { - return null; - } - - var descriptionName = Path.GetFileNameWithoutExtension(file.Name) + ".txt"; - var description = parent.GetFiles().FirstOrDefault(i => string.Equals(descriptionName, i.Name, StringComparison.OrdinalIgnoreCase)); - - return description?.OpenRead(); - }; - } - - private IScriptFactory? FindSupported(IFile file) - { - for (var i = 0; i < _concrete.Length; i++) - { - var result = _concrete[i]; - if (result.IsSupported(file)) - { - return result; - } - } - - return null; - } - - private sealed class PowerShellScriptFactory : IScriptFactory - { - public PowerShellScriptFactory(IPowerShellFactory? powerShellFactory) - { - PowerShellFactory = powerShellFactory; - } - - public IPowerShellFactory? PowerShellFactory { get; set; } - - public bool IsSupported(IFile file) - { - return PowerShellFactory != null && ".ps1".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); - } - - public IScript FromFile(IFile file) - { - if (PowerShellFactory == null) - { - throw new NotSupportedException(".ps1 scripts are not supported in this context."); - } - - PowerShellFactory.Request(); - - return new PowerShellScript( - file.Name, - file.OpenRead, - CreateScriptDescriptionReader(file), - PowerShellFactory); - } - } - - private sealed class SqlScriptFactory : IScriptFactory - { - private readonly ISqlTextReader _textReader; - - public SqlScriptFactory(ISqlTextReader textReader) - { - _textReader = textReader; - } - - public bool IsSupported(IFile file) - { - return ".sql".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); - } - - public IScript FromFile(IFile file) - { - return new TextScript(file.Name, file.OpenRead, _textReader); - } - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ScriptResolver.cs b/Sources/SqlDatabase/Scripts/ScriptResolver.cs new file mode 100644 index 00000000..9ca747fb --- /dev/null +++ b/Sources/SqlDatabase/Scripts/ScriptResolver.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using SqlDatabase.Adapter; +using SqlDatabase.FileSystem; + +namespace SqlDatabase.Scripts; + +internal sealed class ScriptResolver : IScriptResolver, IScriptFactory +{ + public ScriptResolver(IScriptFactory[] factories) + { + Factories = factories; + } + + public IScriptFactory[] Factories { get; } + + public bool IsSupported(IFile file) => FindSupported(file) != null; + + public IScript FromFile(IFile file) + { + var factory = FindSupported(file); + if (factory == null) + { + throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); + } + + return factory.FromFile(file); + } + + public void InitializeEnvironment(ILogger logger, IEnumerable scripts) + { + var environments = new List(Factories.Length); + for (var i = 0; i < Factories.Length; i++) + { + if (Factories[i] is IScriptEnvironment env) + { + environments.Add(env); + } + } + + if (environments.Count == 0) + { + return; + } + + foreach (var script in scripts) + { + for (var i = 0; i < environments.Count; i++) + { + var env = environments[i]; + if (env.IsSupported(script)) + { + env.Initialize(logger); + environments.RemoveAt(i); + break; + } + } + + if (environments.Count == 0) + { + return; + } + } + } + + private IScriptFactory? FindSupported(IFile file) + { + for (var i = 0; i < Factories.Length; i++) + { + var result = Factories[i]; + if (result.IsSupported(file)) + { + return result; + } + } + + return null; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index a3df7379..e5787a43 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -14,21 +14,6 @@ - - ..\Dependencies\System.Management.Automation.dll - - - - - - - - - - - - - @@ -44,6 +29,7 @@ + From 0b8450593f6d8ccaac399134374bcbcb5424df16 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Mon, 6 Nov 2023 19:35:47 +0100 Subject: [PATCH 17/38] SqlDatabase.Sequence --- ...tabase.Adapter.AssemblyScripts.Test.csproj | 6 --- .../PowerShellFactory.hosted.cs | 9 +++- .../CreateScriptSequenceTest.cs | 2 +- .../DependencyParserTest.cs | 10 ++--- .../DependencyParserTest}/Case01.sql | 0 .../DependencyParserTest}/Case02.sql | 0 .../DependencyParserTest}/Case03.sql | 0 .../DependencyParserTest}/Case04.sql | 0 .../DependencyParserTest}/Case05.sql | 0 .../DependencyParserTest}/Empty.sql | 0 .../ModuleVersionResolverTest.cs | 41 +++++++++-------- .../SqlDatabase.Sequence.Test.csproj | 25 +++++++++++ .../UpgradeScriptCollectionTest.cs | 6 +-- .../UpgradeScriptSequenceTest.cs | 3 +- .../FolderAsModuleName.json | 0 .../UpgradeScriptSequenceTest/OneModule.json | 0 .../ThreeModules.json | 0 .../UpgradeScriptSequenceTest/TwoModules.json | 0 .../CodeAnalysis/AllowNullAttribute.cs | 8 ++++ .../CodeAnalysis/NotNullWhenAttribute.cs | 10 +++++ .../CreateScriptSequence.cs | 4 +- .../DependencyParser.cs | 4 +- .../GetDatabaseCurrentVersion.cs | 5 +++ .../ICreateScriptSequence.cs | 2 +- .../IModuleVersionResolver.cs | 2 +- .../IUpgradeScriptSequence.cs | 2 +- .../ModuleVersionResolver.cs | 12 ++--- .../Properties/AssemblyInfo.cs | 4 ++ .../ScriptDependency.cs | 6 +-- .../ScriptStep.cs | 2 +- .../SqlDatabase.Sequence.csproj | 11 +++++ .../UpgradeScriptCollection.cs | 43 +++++++----------- .../UpgradeScriptSequence.cs | 20 ++++++--- .../Commands/DatabaseCreateCommandTest.cs | 1 + .../Commands/DatabaseExecuteCommandTest.cs | 1 + .../Commands/DatabaseExportCommandTest.cs | 1 + .../Commands/DatabaseUpgradeCommandTest.cs | 1 + .../Configuration/EnvironmentBuilderMock.cs | 1 + .../Docker/mssql.entrypoint.sh | 2 +- .../Scripts/MsSql/MsSqlTextReaderTest.cs | 14 +++--- .../Scripts/ScriptResolverTest.cs | 1 - .../SqlDatabase.Test/SqlDatabase.Test.csproj | 11 ----- .../ResourceReader.cs | 44 +++++++++++++------ Sources/SqlDatabase.sln | 13 ++++++ .../Commands/DatabaseCreateCommand.cs | 1 + .../Commands/DatabaseExecuteCommand.cs | 1 + .../Commands/DatabaseExportCommand.cs | 1 + .../Commands/DatabaseUpgradeCommand.cs | 1 + .../Configuration/EnvironmentBuilder.cs | 4 +- .../Configuration/IEnvironmentBuilder.cs | 1 + Sources/SqlDatabase/SqlDatabase.csproj | 1 + 51 files changed, 216 insertions(+), 121 deletions(-) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/CreateScriptSequenceTest.cs (98%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/DependencyParserTest.cs (83%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Case01.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Case02.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Case03.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Case04.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Case05.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Dependencies => SqlDatabase.Sequence.Test/DependencyParserTest}/Empty.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/UpgradeInternal => SqlDatabase.Sequence.Test}/ModuleVersionResolverTest.cs (68%) create mode 100644 Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj rename Sources/{SqlDatabase.Test/Scripts/UpgradeInternal => SqlDatabase.Sequence.Test}/UpgradeScriptCollectionTest.cs (86%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/UpgradeScriptSequenceTest.cs (98%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/UpgradeScriptSequenceTest/FolderAsModuleName.json (100%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/UpgradeScriptSequenceTest/OneModule.json (100%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/UpgradeScriptSequenceTest/ThreeModules.json (100%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Sequence.Test}/UpgradeScriptSequenceTest/TwoModules.json (100%) create mode 100644 Sources/SqlDatabase.Sequence/CodeAnalysis/AllowNullAttribute.cs create mode 100644 Sources/SqlDatabase.Sequence/CodeAnalysis/NotNullWhenAttribute.cs rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/CreateScriptSequence.cs (94%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/DependencyParser.cs (86%) create mode 100644 Sources/SqlDatabase.Sequence/GetDatabaseCurrentVersion.cs rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/ICreateScriptSequence.cs (81%) rename Sources/{SqlDatabase/Scripts/UpgradeInternal => SqlDatabase.Sequence}/IModuleVersionResolver.cs (80%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/IUpgradeScriptSequence.cs (79%) rename Sources/{SqlDatabase/Scripts/UpgradeInternal => SqlDatabase.Sequence}/ModuleVersionResolver.cs (72%) create mode 100644 Sources/SqlDatabase.Sequence/Properties/AssemblyInfo.cs rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/ScriptDependency.cs (80%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/ScriptStep.cs (93%) create mode 100644 Sources/SqlDatabase.Sequence/SqlDatabase.Sequence.csproj rename Sources/{SqlDatabase/Scripts/UpgradeInternal => SqlDatabase.Sequence}/UpgradeScriptCollection.cs (78%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Sequence}/UpgradeScriptSequence.cs (89%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases => SqlDatabase.TestApi}/ResourceReader.cs (66%) diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj index cbde9d41..9966cc45 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj @@ -19,10 +19,4 @@ - - - Component - - - diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs index 5af1bb59..ef3d7c27 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/PowerShellFactory.hosted.cs @@ -11,6 +11,8 @@ namespace SqlDatabase.Adapter.PowerShellScripts; // https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell internal partial class PowerShellFactory { + private static string? _initializedInstallationPath; + partial void DoInitialize(ILogger logger) { if (string.IsNullOrEmpty(InstallationPath)) @@ -93,7 +95,12 @@ private void Test(ILogger logger) [MethodImpl(MethodImplOptions.NoInlining)] private void SetPowerShellAssemblyLoadContext() { - PowerShellAssemblyLoadContextInitializer.SetPowerShellAssemblyLoadContext(InstallationPath); + // The singleton of PowerShellAssemblyLoadContext has already been initialized + if (_initializedInstallationPath == null || !_initializedInstallationPath.Equals(InstallationPath, StringComparison.OrdinalIgnoreCase)) + { + PowerShellAssemblyLoadContextInitializer.SetPowerShellAssemblyLoadContext(InstallationPath); + _initializedInstallationPath = InstallationPath; + } } } #endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs b/Sources/SqlDatabase.Sequence.Test/CreateScriptSequenceTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs rename to Sources/SqlDatabase.Sequence.Test/CreateScriptSequenceTest.cs index e15d7ee5..1bcf819f 100644 --- a/Sources/SqlDatabase.Test/Scripts/CreateScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/CreateScriptSequenceTest.cs @@ -6,7 +6,7 @@ using SqlDatabase.FileSystem; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; [TestFixture] public class CreateScriptSequenceTest diff --git a/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest.cs similarity index 83% rename from Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest.cs index 624f2c8e..6fa611ba 100644 --- a/Sources/SqlDatabase.Test/Scripts/DependencyParserTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest.cs @@ -4,19 +4,19 @@ using System.Linq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Scripts.SqlTestCases; +using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; [TestFixture] public class DependencyParserTest { [Test] [TestCaseSource(nameof(GetExtractDependenciesTestCases))] - public void ExtractDependencies(string sql, ScriptDependency[] expected) + public void ExtractDependencies(string sql, Array expected) { var actual = DependencyParser.ExtractDependencies(new StringReader(sql), "file name").ToArray(); - actual.ShouldBe(expected); + actual.ShouldBe((ScriptDependency[])expected); } [Test] @@ -33,7 +33,7 @@ public void ExtractDependenciesInvalidVersion(string versionText) private static IEnumerable GetExtractDependenciesTestCases() { - foreach (var testCase in ResourceReader.Read("Dependencies")) + foreach (var testCase in ResourceReader.Read(typeof(DependencyParserTest).Assembly, nameof(DependencyParserTest))) { var expected = new List(); foreach (var line in testCase.Expected) diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case01.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case01.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case01.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case01.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case02.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case02.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case02.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case02.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case03.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case03.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case03.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case03.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case04.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case04.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case04.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case04.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case05.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case05.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Case05.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Case05.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Empty.sql b/Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Empty.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Dependencies/Empty.sql rename to Sources/SqlDatabase.Sequence.Test/DependencyParserTest/Empty.sql diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs b/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs similarity index 68% rename from Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs rename to Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs index 15ffd1b6..f53d0a35 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/ModuleVersionResolverTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs @@ -5,20 +5,17 @@ using Shouldly; using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.UpgradeInternal; +namespace SqlDatabase.Sequence; [TestFixture] public class ModuleVersionResolverTest { private ModuleVersionResolver _sut = null!; - private Mock _database = null!; private IList _logOutput = null!; [SetUp] public void BeforeEachTest() { - _database = new Mock(MockBehavior.Strict); - _logOutput = new List(); var log = new Mock(MockBehavior.Strict); log @@ -29,7 +26,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new ModuleVersionResolver(log.Object, _database.Object); + _sut = new ModuleVersionResolver(log.Object, null!); } [Test] @@ -38,13 +35,14 @@ public void GetCurrentVersionModuleName() const string ModuleName = "the-module"; var moduleVersion = new Version("1.0"); - _database - .Setup(d => d.GetCurrentVersion(ModuleName)) - .Returns(moduleVersion); + _sut.Database = name => + { + name.ShouldBe(ModuleName); + return moduleVersion; + }; _sut.GetCurrentVersion(ModuleName).ShouldBe(moduleVersion); - _database.VerifyAll(); _logOutput.Count.ShouldBe(1); _logOutput[0].ShouldContain(ModuleName); _logOutput[0].ShouldContain(moduleVersion.ToString()); @@ -55,13 +53,14 @@ public void GetCurrentVersionNoModule() { var version = new Version("1.0"); - _database - .Setup(d => d.GetCurrentVersion(string.Empty)) - .Returns(version); + _sut.Database = name => + { + name.ShouldBeEmpty(); + return version; + }; _sut.GetCurrentVersion(null).ShouldBe(version); - _database.VerifyAll(); _logOutput.Count.ShouldBe(1); _logOutput[0].ShouldContain("database version"); _logOutput[0].ShouldContain(version.ToString()); @@ -72,16 +71,20 @@ public void GetCurrentVersionCache() { var version = new Version("1.0"); - _database - .Setup(d => d.GetCurrentVersion(string.Empty)) - .Returns(new Version("1.0")); + _sut.Database = name => + { + name.ShouldBeEmpty(); + return version; + }; _sut.GetCurrentVersion(null).ShouldBe(version); _logOutput.Clear(); - _database - .Setup(d => d.GetCurrentVersion(string.Empty)) - .Throws(); + _sut.Database = name => + { + name.ShouldBeEmpty(); + throw new NotSupportedException(); + }; _sut.GetCurrentVersion(null).ShouldBe(version); _logOutput.ShouldBeEmpty(); diff --git a/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj new file mode 100644 index 00000000..0512478e --- /dev/null +++ b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj @@ -0,0 +1,25 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Sequence + ..\..\bin\Tests + + + + + + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/UpgradeScriptCollectionTest.cs b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptCollectionTest.cs similarity index 86% rename from Sources/SqlDatabase.Test/Scripts/UpgradeInternal/UpgradeScriptCollectionTest.cs rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptCollectionTest.cs index 838fc35a..031f5fcc 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeInternal/UpgradeScriptCollectionTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptCollectionTest.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Shouldly; -namespace SqlDatabase.Scripts.UpgradeInternal; +namespace SqlDatabase.Sequence; [TestFixture] public class UpgradeScriptCollectionTest @@ -20,7 +20,7 @@ public class UpgradeScriptCollectionTest [TestCase("1.0_xxx.sql", null, null, null)] [TestCase("2.0_1.0.sql", null, null, null)] [TestCase("_1.0_1.1.sql", null, null, null)] - public void TryParseFileName(string name, string moduleName, string from, string to) + public void TryParseFileName(string name, string? moduleName, string? from, string? to) { var actual = UpgradeScriptCollection.TryParseFileName(name, out var actualModuleName, out var actualFrom, out var actualTo); @@ -33,7 +33,7 @@ public void TryParseFileName(string name, string moduleName, string from, string actual.ShouldBeTrue(); actualModuleName.ShouldBe(moduleName); actualFrom.ShouldBe(new Version(from)); - actualTo.ShouldBe(new Version(to)); + actualTo.ShouldBe(new Version(to!)); } } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs index c548d5fd..8f233ed6 100644 --- a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs @@ -8,10 +8,9 @@ using Shouldly; using SqlDatabase.Adapter; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts.UpgradeInternal; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; [TestFixture] public class UpgradeScriptSequenceTest diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/FolderAsModuleName.json b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/FolderAsModuleName.json similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/FolderAsModuleName.json rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/FolderAsModuleName.json diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/OneModule.json b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/OneModule.json similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/OneModule.json rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/OneModule.json diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/ThreeModules.json b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/ThreeModules.json similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/ThreeModules.json rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/ThreeModules.json diff --git a/Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/TwoModules.json b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/TwoModules.json similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/UpgradeScriptSequenceTest/TwoModules.json rename to Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest/TwoModules.json diff --git a/Sources/SqlDatabase.Sequence/CodeAnalysis/AllowNullAttribute.cs b/Sources/SqlDatabase.Sequence/CodeAnalysis/AllowNullAttribute.cs new file mode 100644 index 00000000..39be8db8 --- /dev/null +++ b/Sources/SqlDatabase.Sequence/CodeAnalysis/AllowNullAttribute.cs @@ -0,0 +1,8 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] +internal sealed class AllowNullAttribute : Attribute +{ +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Sequence/CodeAnalysis/NotNullWhenAttribute.cs b/Sources/SqlDatabase.Sequence/CodeAnalysis/NotNullWhenAttribute.cs new file mode 100644 index 00000000..e3d56cf7 --- /dev/null +++ b/Sources/SqlDatabase.Sequence/CodeAnalysis/NotNullWhenAttribute.cs @@ -0,0 +1,10 @@ +#if NET472 || NETSTANDARD2_0 +namespace System.Diagnostics.CodeAnalysis; + +internal sealed class NotNullWhenAttribute : Attribute +{ + public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; + + public bool ReturnValue { get; } +} +#endif diff --git a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs b/Sources/SqlDatabase.Sequence/CreateScriptSequence.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/CreateScriptSequence.cs rename to Sources/SqlDatabase.Sequence/CreateScriptSequence.cs index 4bf2455d..826f0e89 100644 --- a/Sources/SqlDatabase/Scripts/CreateScriptSequence.cs +++ b/Sources/SqlDatabase.Sequence/CreateScriptSequence.cs @@ -4,9 +4,9 @@ using SqlDatabase.Adapter; using SqlDatabase.FileSystem; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; -internal sealed class CreateScriptSequence : ICreateScriptSequence +public sealed class CreateScriptSequence : ICreateScriptSequence { public CreateScriptSequence(IList sources, IScriptFactory scriptFactory) { diff --git a/Sources/SqlDatabase/Scripts/DependencyParser.cs b/Sources/SqlDatabase.Sequence/DependencyParser.cs similarity index 86% rename from Sources/SqlDatabase/Scripts/DependencyParser.cs rename to Sources/SqlDatabase.Sequence/DependencyParser.cs index bf0d8cee..e96db1e8 100644 --- a/Sources/SqlDatabase/Scripts/DependencyParser.cs +++ b/Sources/SqlDatabase.Sequence/DependencyParser.cs @@ -4,7 +4,7 @@ using System.IO; using System.Text.RegularExpressions; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; internal static class DependencyParser { @@ -19,7 +19,7 @@ public static IEnumerable ExtractDependencies(TextReader reade { if (!Version.TryParse(versionText, out var version)) { - throw new InvalidOperationException("The current version value [{0}] of module [{1}] is invalid, script {2}.".FormatWith(versionText, moduleName, scriptName)); + throw new InvalidOperationException($"The current version value [{versionText}] of module [{moduleName}] is invalid, script {scriptName}."); } yield return new ScriptDependency(moduleName, version); diff --git a/Sources/SqlDatabase.Sequence/GetDatabaseCurrentVersion.cs b/Sources/SqlDatabase.Sequence/GetDatabaseCurrentVersion.cs new file mode 100644 index 00000000..6f5fb245 --- /dev/null +++ b/Sources/SqlDatabase.Sequence/GetDatabaseCurrentVersion.cs @@ -0,0 +1,5 @@ +using System; + +namespace SqlDatabase.Sequence; + +public delegate Version GetDatabaseCurrentVersion(string? moduleName); \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs b/Sources/SqlDatabase.Sequence/ICreateScriptSequence.cs similarity index 81% rename from Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs rename to Sources/SqlDatabase.Sequence/ICreateScriptSequence.cs index fff5eca0..a2024e4f 100644 --- a/Sources/SqlDatabase/Scripts/ICreateScriptSequence.cs +++ b/Sources/SqlDatabase.Sequence/ICreateScriptSequence.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; public interface ICreateScriptSequence { diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs b/Sources/SqlDatabase.Sequence/IModuleVersionResolver.cs similarity index 80% rename from Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs rename to Sources/SqlDatabase.Sequence/IModuleVersionResolver.cs index 61f5fd03..6f863691 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/IModuleVersionResolver.cs +++ b/Sources/SqlDatabase.Sequence/IModuleVersionResolver.cs @@ -1,6 +1,6 @@ using System; -namespace SqlDatabase.Scripts.UpgradeInternal; +namespace SqlDatabase.Sequence; internal interface IModuleVersionResolver { diff --git a/Sources/SqlDatabase/Scripts/IUpgradeScriptSequence.cs b/Sources/SqlDatabase.Sequence/IUpgradeScriptSequence.cs similarity index 79% rename from Sources/SqlDatabase/Scripts/IUpgradeScriptSequence.cs rename to Sources/SqlDatabase.Sequence/IUpgradeScriptSequence.cs index aad5a73d..333d30ee 100644 --- a/Sources/SqlDatabase/Scripts/IUpgradeScriptSequence.cs +++ b/Sources/SqlDatabase.Sequence/IUpgradeScriptSequence.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; public interface IUpgradeScriptSequence { diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs b/Sources/SqlDatabase.Sequence/ModuleVersionResolver.cs similarity index 72% rename from Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs rename to Sources/SqlDatabase.Sequence/ModuleVersionResolver.cs index 86705162..64bc845d 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/ModuleVersionResolver.cs +++ b/Sources/SqlDatabase.Sequence/ModuleVersionResolver.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.UpgradeInternal; +namespace SqlDatabase.Sequence; internal sealed class ModuleVersionResolver : IModuleVersionResolver { private readonly IDictionary _versionByModule = new Dictionary(StringComparer.OrdinalIgnoreCase); - public ModuleVersionResolver(ILogger log, IDatabase database) + public ModuleVersionResolver(ILogger log, GetDatabaseCurrentVersion database) { Log = log; Database = database; @@ -16,7 +16,7 @@ public ModuleVersionResolver(ILogger log, IDatabase database) public ILogger Log { get; } - public IDatabase Database { get; } + public GetDatabaseCurrentVersion Database { get; internal set; } public Version GetCurrentVersion(string? moduleName) { @@ -36,15 +36,15 @@ public Version GetCurrentVersion(string? moduleName) private Version LoadVersion(string moduleName) { - var version = Database.GetCurrentVersion(moduleName); + var version = Database(moduleName); if (moduleName.Length == 0) { - Log.Info("database version: {0}".FormatWith(version)); + Log.Info($"database version: {version}"); } else { - Log.Info("module [{0}] version: {1}".FormatWith(moduleName, version)); + Log.Info($"module [{moduleName}] version: {version}"); } return version; diff --git a/Sources/SqlDatabase.Sequence/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Sequence/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..33420c3c --- /dev/null +++ b/Sources/SqlDatabase.Sequence/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Sequence.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ScriptDependency.cs b/Sources/SqlDatabase.Sequence/ScriptDependency.cs similarity index 80% rename from Sources/SqlDatabase/Scripts/ScriptDependency.cs rename to Sources/SqlDatabase.Sequence/ScriptDependency.cs index f14ba915..17704981 100644 --- a/Sources/SqlDatabase/Scripts/ScriptDependency.cs +++ b/Sources/SqlDatabase.Sequence/ScriptDependency.cs @@ -1,8 +1,8 @@ using System; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; -public readonly struct ScriptDependency : IEquatable +internal readonly struct ScriptDependency : IEquatable { public ScriptDependency(string moduleName, Version version) { @@ -33,5 +33,5 @@ public override int GetHashCode() return (int)((uint)(h1 << 5) | (uint)h1 >> 27) + h1 ^ h2; } - public override string ToString() => "{0} {1}".FormatWith(ModuleName, Version); + public override string ToString() => $"{ModuleName} {Version}"; } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/ScriptStep.cs b/Sources/SqlDatabase.Sequence/ScriptStep.cs similarity index 93% rename from Sources/SqlDatabase/Scripts/ScriptStep.cs rename to Sources/SqlDatabase.Sequence/ScriptStep.cs index 808e2e38..b008b11d 100644 --- a/Sources/SqlDatabase/Scripts/ScriptStep.cs +++ b/Sources/SqlDatabase.Sequence/ScriptStep.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; [DebuggerDisplay("{Script.DisplayName}")] public readonly struct ScriptStep diff --git a/Sources/SqlDatabase.Sequence/SqlDatabase.Sequence.csproj b/Sources/SqlDatabase.Sequence/SqlDatabase.Sequence.csproj new file mode 100644 index 00000000..dfc4d620 --- /dev/null +++ b/Sources/SqlDatabase.Sequence/SqlDatabase.Sequence.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.0 + + + + + + + diff --git a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs b/Sources/SqlDatabase.Sequence/UpgradeScriptCollection.cs similarity index 78% rename from Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs rename to Sources/SqlDatabase.Sequence/UpgradeScriptCollection.cs index c65517ce..83cf967e 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeInternal/UpgradeScriptCollection.cs +++ b/Sources/SqlDatabase.Sequence/UpgradeScriptCollection.cs @@ -6,7 +6,7 @@ using SqlDatabase.Adapter; using SqlDatabase.FileSystem; -namespace SqlDatabase.Scripts.UpgradeInternal; +namespace SqlDatabase.Sequence; internal sealed class UpgradeScriptCollection { @@ -45,10 +45,10 @@ public void BuildModuleSequence(string moduleName, Version moduleVersion) { if (string.IsNullOrEmpty(moduleName)) { - throw new InvalidOperationException("The current version [{0}] is greater then latest upgrade [{1}].".FormatWith(moduleVersion, maxVersion)); + throw new InvalidOperationException($"The current version [{moduleVersion}] is greater then latest upgrade [{maxVersion}]."); } - throw new InvalidOperationException("Module [{0}], the current version [{1}] is greater then latest upgrade [{2}].".FormatWith(moduleName, moduleVersion, maxVersion)); + throw new InvalidOperationException($"Module [{moduleName}], the current version [{moduleVersion}] is greater then latest upgrade [{maxVersion}]."); } files = files @@ -73,10 +73,10 @@ public void BuildModuleSequence(string moduleName, Version moduleVersion) { if (string.IsNullOrEmpty(moduleName)) { - throw new InvalidOperationException("Duplicated step found [{0}] and [{1}].".FormatWith(file.Script.DisplayName, files[0].Script.DisplayName)); + throw new InvalidOperationException($"Duplicated step found [{file.Script.DisplayName}] and [{files[0].Script.DisplayName}]."); } - throw new InvalidOperationException("Module [{0}], duplicated step found [{1}] and [{2}].".FormatWith(moduleName, file.Script.DisplayName, files[0].Script.DisplayName)); + throw new InvalidOperationException($"Module [{moduleName}], duplicated step found [{file.Script.DisplayName}] and [{files[0].Script.DisplayName}]."); } sequence.Add(file); @@ -87,10 +87,10 @@ public void BuildModuleSequence(string moduleName, Version moduleVersion) { if (string.IsNullOrEmpty(moduleName)) { - throw new InvalidOperationException("Upgrade step from [{0}] to a next not found.".FormatWith(version)); + throw new InvalidOperationException($"Upgrade step from [{version}] to a next not found."); } - throw new InvalidOperationException("Module [{0}], upgrade step from [{1}] to a next not found.".FormatWith(moduleName, version)); + throw new InvalidOperationException($"Module [{moduleName}], upgrade step from [{version}] to a next not found."); } _stepsByModule[moduleName] = sequence; @@ -119,10 +119,9 @@ public void ShowWithDependencies(ILogger logger) foreach (var moduleName in _stepsByModule.Keys.OrderBy(i => i)) { var steps = _stepsByModule[moduleName]; - logger.Info("module [{0}], {1} step{2}:".FormatWith( - moduleName, - steps.Count, - steps.Count == 1 ? null : "s")); + + var s = steps.Count == 1 ? null : "s"; + logger.Info($"module [{moduleName}], {steps.Count} step{s}:"); using (logger.Indent()) { @@ -131,13 +130,12 @@ public void ShowWithDependencies(ILogger logger) var dependencies = GetDependencies(step); if (dependencies.Count == 0) { - logger.Info("{0}, no dependencies".FormatWith(step.Script.DisplayName)); + logger.Info($"{step.Script.DisplayName}, no dependencies"); } else { - logger.Info("{0}, depends on {1}".FormatWith( - step.Script.DisplayName, - string.Join("; ", dependencies.OrderBy(i => i.ModuleName)))); + var dependsOn = string.Join("; ", dependencies.OrderBy(i => i.ModuleName)); + logger.Info($"{step.Script.DisplayName}, depends on {dependsOn}"); } } } @@ -153,11 +151,7 @@ public void ValidateModuleDependencies(string moduleName, IModuleVersionResolver var currentVersion = versionResolver.GetCurrentVersion(dependency.ModuleName); if (currentVersion > dependency.Version) { - throw new InvalidOperationException("Migration step [{0}] requires module [{1}] to be version [{2}], but current is [{3}].".FormatWith( - step.Script.DisplayName, - dependency.ModuleName, - dependency.Version, - currentVersion)); + throw new InvalidOperationException($"Migration step [{step.Script.DisplayName}] requires module [{dependency.ModuleName}] to be version [{dependency.Version}], but current is [{currentVersion}]."); } if (currentVersion != dependency.Version) @@ -167,10 +161,7 @@ public void ValidateModuleDependencies(string moduleName, IModuleVersionResolver if (!contains) { - throw new InvalidOperationException("Migration step [{0}] depends on module [{1}] version [{2}], but upgrade for this module not found.".FormatWith( - step.Script.DisplayName, - dependency.ModuleName, - dependency.Version)); + throw new InvalidOperationException($"Migration step [{step.Script.DisplayName}] depends on module [{dependency.ModuleName}] version [{dependency.Version}], but upgrade for this module not found."); } } } @@ -298,12 +289,12 @@ private void LoadFrom(IEnumerable sources, IScriptFactory scrip { if (FolderAsModuleName && string.IsNullOrEmpty(rootFolderName)) { - throw new InvalidOperationException("File [{0}] is not expected in the root folder.".FormatWith(file.Name)); + throw new InvalidOperationException($"File [{file.Name}] is not expected in the root folder."); } if (FolderAsModuleName && !string.IsNullOrEmpty(moduleName) && !moduleName.Equals(rootFolderName, StringComparison.OrdinalIgnoreCase)) { - throw new InvalidOperationException("File [{0}] with module name [{1}] is not expected in the folder [{2}].".FormatWith(file.Name, moduleName, rootFolderName)); + throw new InvalidOperationException($"File [{file.Name}] with module name [{moduleName}] is not expected in the folder [{rootFolderName}]."); } if (FolderAsModuleName) diff --git a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs b/Sources/SqlDatabase.Sequence/UpgradeScriptSequence.cs similarity index 89% rename from Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs rename to Sources/SqlDatabase.Sequence/UpgradeScriptSequence.cs index c30a79c4..3c838782 100644 --- a/Sources/SqlDatabase/Scripts/UpgradeScriptSequence.cs +++ b/Sources/SqlDatabase.Sequence/UpgradeScriptSequence.cs @@ -4,13 +4,23 @@ using System.Text; using SqlDatabase.Adapter; using SqlDatabase.FileSystem; -using SqlDatabase.Scripts.UpgradeInternal; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Sequence; -internal sealed class UpgradeScriptSequence : IUpgradeScriptSequence +public sealed class UpgradeScriptSequence : IUpgradeScriptSequence { public UpgradeScriptSequence( + IScriptFactory scriptFactory, + GetDatabaseCurrentVersion versionResolver, + IList sources, + ILogger log, + bool folderAsModuleName, + bool whatIf) + : this(scriptFactory, new ModuleVersionResolver(log, versionResolver), sources, log, folderAsModuleName, whatIf) + { + } + + internal UpgradeScriptSequence( IScriptFactory scriptFactory, IModuleVersionResolver versionResolver, IList sources, @@ -30,14 +40,14 @@ public UpgradeScriptSequence( public IScriptFactory ScriptFactory { get; } - public IModuleVersionResolver VersionResolver { get; } - public ILogger Log { get; } public bool FolderAsModuleName { get; set; } public bool WhatIf { get; } + internal IModuleVersionResolver VersionResolver { get; } + public IList BuildSequence() { var scripts = new UpgradeScriptCollection(FolderAsModuleName); diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index 06cb9ec8..64378483 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs index eff7b862..95e9c5a6 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs @@ -3,6 +3,7 @@ using NUnit.Framework; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index ec0a310c..b7d46eb3 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -7,6 +7,7 @@ using SqlDatabase.Export; using SqlDatabase.Scripts; using SqlDatabase.Scripts.MsSql; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs index 06d5e3f5..60f94654 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs @@ -3,6 +3,7 @@ using NUnit.Framework; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs index 01c63625..1d911f81 100644 --- a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs +++ b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderMock.cs @@ -5,6 +5,7 @@ using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh b/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh index a1a3147a..41e0409e 100644 --- a/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh +++ b/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh @@ -1,5 +1,5 @@ # wait for SQL Server to come up -sleep 5s +sleep 10s # create database /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P P@ssw0rd -l 60 -i ./mssql.create-database.sql \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs index 12a136ee..5dfdd213 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs @@ -3,7 +3,7 @@ using System.Text; using NUnit.Framework; using Shouldly; -using SqlDatabase.Scripts.SqlTestCases; +using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.MsSql; @@ -34,23 +34,21 @@ public void IsGo(string line, bool expected) [Test] [TestCaseSource(nameof(GetSplitByGoTestCases))] - public void SplitByGo(Stream input, string[] expected) + public void SplitByGo(byte[] input, string[] expected) { - var batches = _sut.ReadBatches(input); + var batches = _sut.ReadBatches(new MemoryStream(input)); batches.ShouldBe(expected); - input.Position = 0; - - var first = _sut.ReadFirstBatch(input); + var first = _sut.ReadFirstBatch(new MemoryStream(input)); first.ShouldBe(expected[0]); } private static IEnumerable GetSplitByGoTestCases() { - foreach (var testCase in ResourceReader.Read("Go")) + foreach (var testCase in ResourceReader.Read(typeof(MsSqlTextReaderTest).Assembly, "SqlTestCases.Go")) { yield return new TestCaseData( - new MemoryStream(Encoding.Default.GetBytes(testCase.Input)), + Encoding.Default.GetBytes(testCase.Input), testCase.Expected) { TestName = testCase.Name diff --git a/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs b/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs index 5ae26ebc..b343c2e9 100644 --- a/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/ScriptResolverTest.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using Moq; using NUnit.Framework; using Shouldly; diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 30f5e8ec..b3085e6e 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -9,7 +9,6 @@ - @@ -31,20 +30,10 @@ - - - - - - - - - - diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs b/Sources/SqlDatabase.TestApi/ResourceReader.cs similarity index 66% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs rename to Sources/SqlDatabase.TestApi/ResourceReader.cs index 978512f6..c83ddf8b 100644 --- a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/ResourceReader.cs +++ b/Sources/SqlDatabase.TestApi/ResourceReader.cs @@ -2,32 +2,32 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using System.Text; +using Shouldly; -namespace SqlDatabase.Scripts.SqlTestCases; +namespace SqlDatabase.TestApi; -internal static class ResourceReader +public static class ResourceReader { - public static IEnumerable<(string Name, string Input, string[] Expected)> Read(string folder) + public static IEnumerable<(string Name, string Input, string[] Expected)> Read(Assembly assembly, string filter) { - var anchor = typeof(ResourceReader); - var prefix = anchor.Namespace + "." + anchor.Name + "." + folder + "."; - - var sources = anchor - .Assembly + var sources = assembly .GetManifestResourceNames() - .Where(i => i.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) - .OrderBy(i => i); + .Where(i => i.IndexOf(filter, StringComparison.Ordinal) >= 0) + .OrderBy(i => i) + .ToArray(); + + sources.ShouldNotBeEmpty(); foreach (var sourceName in sources) { - using (var stream = anchor.Assembly.GetManifestResourceStream(sourceName)) + using (var stream = assembly.GetManifestResourceStream(sourceName)) using (var reader = new StreamReader(stream!)) { - var name = Path.GetFileNameWithoutExtension(sourceName.Substring(prefix.Length)); var (input, expected) = ParseResource(reader); - yield return (name, input, expected); + yield return (GetShortName(sourceName), input, expected); } } } @@ -81,4 +81,22 @@ private static (string Input, string[] Expected) ParseResource(TextReader reader return (input.ToString(), expected.ToArray()); } + + private static string GetShortName(string fullName) + { + var result = fullName; + + var index = fullName.LastIndexOf('.'); + if (index > 0) + { + index = fullName.LastIndexOf('.', index - 1); + } + + if (index > 0) + { + result = fullName.Substring(index + 1); + } + + return result; + } } \ No newline at end of file diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index 66d71cc1..0c472c5c 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -40,6 +40,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PowerSh EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PowerShellScripts.Test", "SqlDatabase.Adapter.PowerShellScripts.Test\SqlDatabase.Adapter.PowerShellScripts.Test.csproj", "{4539721A-947F-4AD1-B007-EE695761B8F9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence", "SqlDatabase.Sequence\SqlDatabase.Sequence.csproj", "{AB3E3C7B-1475-4967-84DA-970D663D6FA3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence.Test", "SqlDatabase.Sequence.Test\SqlDatabase.Sequence.Test.csproj", "{1C4B4036-9C17-49AD-B087-A4D044296D1A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -102,6 +106,14 @@ Global {4539721A-947F-4AD1-B007-EE695761B8F9}.Debug|Any CPU.Build.0 = Debug|Any CPU {4539721A-947F-4AD1-B007-EE695761B8F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {4539721A-947F-4AD1-B007-EE695761B8F9}.Release|Any CPU.Build.0 = Release|Any CPU + {AB3E3C7B-1475-4967-84DA-970D663D6FA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB3E3C7B-1475-4967-84DA-970D663D6FA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB3E3C7B-1475-4967-84DA-970D663D6FA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB3E3C7B-1475-4967-84DA-970D663D6FA3}.Release|Any CPU.Build.0 = Release|Any CPU + {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -114,6 +126,7 @@ Global {8724A867-C5F5-4A7C-B414-D84AB9830AA0} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {68DC9F11-567F-4A51-85E6-4C87994F9FFF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {4539721A-947F-4AD1-B007-EE695761B8F9} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {1C4B4036-9C17-49AD-B087-A4D044296D1A} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index 7f9a7137..70e47dd2 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs index a2a3a454..57c88054 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 13dbec93..277a47c0 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -5,6 +5,7 @@ using SqlDatabase.Adapter; using SqlDatabase.Export; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs index 6c89bbf2..972129b5 100644 --- a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs @@ -4,6 +4,7 @@ using System.Text; using SqlDatabase.Adapter; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Commands; diff --git a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs index 998a44bf..95cdc030 100644 --- a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs +++ b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs @@ -6,7 +6,7 @@ using SqlDatabase.Adapter.PowerShellScripts; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; -using SqlDatabase.Scripts.UpgradeInternal; +using SqlDatabase.Sequence; namespace SqlDatabase.Configuration; @@ -92,7 +92,7 @@ public IUpgradeScriptSequence BuildUpgradeSequence(IList script return new UpgradeScriptSequence( scriptResolver, - new ModuleVersionResolver(GetLogger(), database), + database.GetCurrentVersion, scripts.ToArray(), GetLogger(), folderAsModuleName, diff --git a/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs index 0d42f373..47d7e0b9 100644 --- a/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs +++ b/Sources/SqlDatabase/Configuration/IEnvironmentBuilder.cs @@ -2,6 +2,7 @@ using SqlDatabase.Adapter; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; +using SqlDatabase.Sequence; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index e5787a43..23849d65 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -30,6 +30,7 @@ + From 597208d6c9036f0c565ee3d0324193654db6e333 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Tue, 7 Nov 2023 08:20:22 +0100 Subject: [PATCH 18/38] SqlDatabase.Adapter.MsSql --- .../MsSqlDataExporterTest.cs | 20 +- .../MsSqlDatabaseAdapterFactoryTest.cs | 14 + .../MsSqlDatabaseAdapterTest.cs | 21 +- .../MsSqlQuery.cs | 15 +- .../MsSqlTextReaderTest.Go}/Case01.sql | 0 .../MsSqlTextReaderTest.Go}/Case02.sql | 0 .../CaseOneLineComment.sql | 0 .../CaseStoredProcedure.sql | 0 .../MsSqlTextReaderTest.cs | 4 +- .../MsSqlWriterTest.cs | 3 +- .../SqlDatabase.Adapter.MsSql.Test.csproj | 30 ++ .../SqlDatabase.Adapter.MsSql.Test.dll.config | 6 + .../TextScriptOutputMsSqlTest.cs | 46 +-- .../MsSqlDatabaseAdapter.cs | 57 +--- .../MsSqlDatabaseAdapterFactory.cs | 51 ++++ .../MsSqlDefaults.cs | 7 + .../MsSqlTextReader.cs | 2 +- .../MsSqlWriter.cs | 7 +- .../Properties/AssemblyInfo.cs | 4 + .../SqlDatabase.Adapter.MsSql.csproj | 15 + .../Export/DataExportLoggerTest.cs | 3 +- .../SqlDatabase.Adapter.Sql.Test.csproj | 20 ++ .../SqlScriptVariableParserTest.cs | 3 +- .../TextScriptTest.cs | 72 +++-- .../Export/DataExportLogger.cs | 5 +- .../Export/DataExporter.cs | 9 +- .../Export/IDataExporter.cs | 5 +- .../Properties/AssemblyInfo.cs | 4 + .../SqlDatabase.Adapter.Sql.csproj | 11 + .../SqlScriptVariableParser.cs | 7 +- .../TextScript.cs | 10 +- .../TextScriptFactory.cs | 24 ++ .../DataReaderTools.cs | 4 +- .../ExportTable.cs | 6 +- .../ExportTableColumn.cs | 6 +- .../IDatabaseAdapter.cs | 5 +- .../ISqlTextReader.cs | 4 +- .../SqlWriterBase.cs | 6 +- .../Commands/DatabaseExportCommandTest.cs | 5 +- .../Configuration/ExportCommandLineTest.cs | 2 +- .../Export/MySqlDataExporterTest.cs | 1 + .../Export/PgSqlDataExporterTest.cs | 1 + .../IntegrationTests/MsSql/ProgramTest.cs | 275 ------------------ .../Scripts/DatabaseAdapterFactoryTest.cs | 15 +- .../MySql/TextScriptOutputMySqlTest.cs | 44 +-- .../PgSql/TextScriptOutputPgSqlTest.cs | 44 +-- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 4 - .../ConfigurationExtensions.cs | 28 ++ .../TempConsoleOut.cs | 2 +- .../TextExtensions.cs | 2 +- Sources/SqlDatabase.sln | 26 ++ .../Commands/DatabaseExportCommand.cs | 2 +- .../Configuration/EnvironmentBuilder.cs | 23 +- .../Configuration/ExportCommandLine.cs | 2 +- Sources/SqlDatabase/Scripts/Database.cs | 1 + .../Scripts/DatabaseAdapterFactory.cs | 19 +- .../Scripts/MySql/MySqlDatabaseAdapter.cs | 1 - .../Scripts/MySql/MySqlTextReader.cs | 1 + .../SqlDatabase/Scripts/MySql/MySqlWriter.cs | 2 +- .../Scripts/PgSql/PgSqlDatabaseAdapter.cs | 1 - .../Scripts/PgSql/PgSqlTextReader.cs | 1 + .../SqlDatabase/Scripts/PgSql/PgSqlWriter.cs | 2 +- Sources/SqlDatabase/SqlDatabase.csproj | 4 +- 63 files changed, 469 insertions(+), 545 deletions(-) rename Sources/{SqlDatabase.Test/Export => SqlDatabase.Adapter.MsSql.Test}/MsSqlDataExporterTest.cs (93%) create mode 100644 Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterFactoryTest.cs rename Sources/{SqlDatabase.Test/Scripts/MsSql => SqlDatabase.Adapter.MsSql.Test}/MsSqlDatabaseAdapterTest.cs (89%) rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.Adapter.MsSql.Test}/MsSqlQuery.cs (51%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Go => SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go}/Case01.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Go => SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go}/Case02.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Go => SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go}/CaseOneLineComment.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/SqlTestCases/Go => SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go}/CaseStoredProcedure.sql (100%) rename Sources/{SqlDatabase.Test/Scripts/MsSql => SqlDatabase.Adapter.MsSql.Test}/MsSqlTextReaderTest.cs (93%) rename Sources/{SqlDatabase.Test/Scripts/MsSql => SqlDatabase.Adapter.MsSql.Test}/MsSqlWriterTest.cs (97%) create mode 100644 Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj create mode 100644 Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config rename Sources/{SqlDatabase.Test/Scripts/MsSql => SqlDatabase.Adapter.MsSql.Test}/TextScriptOutputMsSqlTest.cs (74%) rename Sources/{SqlDatabase/Scripts/MsSql => SqlDatabase.Adapter.MsSql}/MsSqlDatabaseAdapter.cs (52%) create mode 100644 Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs create mode 100644 Sources/SqlDatabase.Adapter.MsSql/MsSqlDefaults.cs rename Sources/{SqlDatabase/Scripts/MsSql => SqlDatabase.Adapter.MsSql}/MsSqlTextReader.cs (97%) rename Sources/{SqlDatabase/Scripts/MsSql => SqlDatabase.Adapter.MsSql}/MsSqlWriter.cs (95%) create mode 100644 Sources/SqlDatabase.Adapter.MsSql/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj rename Sources/{SqlDatabase.Test => SqlDatabase.Adapter.Sql.Test}/Export/DataExportLoggerTest.cs (94%) create mode 100644 Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Adapter.Sql.Test}/SqlScriptVariableParserTest.cs (98%) rename Sources/{SqlDatabase.Test/Scripts => SqlDatabase.Adapter.Sql.Test}/TextScriptTest.cs (63%) rename Sources/{SqlDatabase => SqlDatabase.Adapter.Sql}/Export/DataExportLogger.cs (88%) rename Sources/{SqlDatabase => SqlDatabase.Adapter.Sql}/Export/DataExporter.cs (91%) rename Sources/{SqlDatabase => SqlDatabase.Adapter.Sql}/Export/IDataExporter.cs (62%) create mode 100644 Sources/SqlDatabase.Adapter.Sql/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Adapter.Sql/SqlDatabase.Adapter.Sql.csproj rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter.Sql}/SqlScriptVariableParser.cs (90%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter.Sql}/TextScript.cs (94%) create mode 100644 Sources/SqlDatabase.Adapter.Sql/TextScriptFactory.cs rename Sources/{SqlDatabase/Export => SqlDatabase.Adapter}/DataReaderTools.cs (75%) rename Sources/{SqlDatabase/Export => SqlDatabase.Adapter}/ExportTable.cs (62%) rename Sources/{SqlDatabase/Export => SqlDatabase.Adapter}/ExportTableColumn.cs (69%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter}/IDatabaseAdapter.cs (83%) rename Sources/{SqlDatabase/Scripts => SqlDatabase.Adapter}/ISqlTextReader.cs (69%) rename Sources/{SqlDatabase/Export => SqlDatabase.Adapter}/SqlWriterBase.cs (91%) delete mode 100644 Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs create mode 100644 Sources/SqlDatabase.TestApi/ConfigurationExtensions.cs rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.TestApi}/TempConsoleOut.cs (92%) rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.TestApi}/TextExtensions.cs (86%) diff --git a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs similarity index 93% rename from Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs index cdcf0150..f82621c5 100644 --- a/Sources/SqlDatabase.Test/Export/MsSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs @@ -6,11 +6,9 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Scripts.MsSql; -using SqlDatabase.TestApi; +using SqlDatabase.Adapter.Sql.Export; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.MsSql; [TestFixture] public class MsSqlDataExporterTest @@ -51,7 +49,7 @@ public void Export(string dataType, object minValue, object maxValue) script.Text("SELECT * FROM @input"); - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = sql.ToString(); @@ -68,7 +66,7 @@ public void Export(string dataType, object minValue, object maxValue) exportSql.ShouldContain(" " + dataType + " "); - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = exportSql.Replace("GO", string.Empty) + "\r\n\r\nSELECT * FROM #tmp"; @@ -91,7 +89,7 @@ public void Export(string dataType, object minValue, object maxValue) [Test] public void ExportReplaceRowVersionWithVarbinary() { - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = @" @@ -113,7 +111,7 @@ insert into @x(Id) values(1) var exportSql = _output.ToString(); Console.WriteLine(exportSql); - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = exportSql.Replace("GO", string.Empty) + "\r\n\r\nSELECT * FROM #tmp"; @@ -130,7 +128,7 @@ insert into @x(Id) values(1) [Test] public void ExportHierarchyId() { - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = @" @@ -151,7 +149,7 @@ public void EmptySchemaTable() { ExportTable actual; - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = "select 1, N'2' x, NULL"; @@ -184,7 +182,7 @@ public void InsertBatchSize() string slq500; string slq2; - using (var connection = new SqlConnection(MsSqlQuery.ConnectionString)) + using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = "select * from sys.databases"; diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterFactoryTest.cs new file mode 100644 index 00000000..204fada7 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterFactoryTest.cs @@ -0,0 +1,14 @@ +using NUnit.Framework; +using Shouldly; + +namespace SqlDatabase.Adapter.MsSql; + +[TestFixture] +public class MsSqlDatabaseAdapterFactoryTest +{ + [Test] + public void CanBe() + { + MsSqlDatabaseAdapterFactory.CanBe(MsSqlQuery.GetConnectionString()).ShouldBeTrue(); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs similarity index 89% rename from Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs index 3503a9ce..28a1394d 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs @@ -4,11 +4,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; [TestFixture] public class MsSqlDatabaseAdapterTest @@ -18,7 +15,6 @@ public class MsSqlDatabaseAdapterTest private const string UpdateModuleVersion = "EXEC sys.sp_updateextendedproperty @name=N'version-{{ModuleName}}', @value=N'{{TargetVersion}}'"; private MsSqlDatabaseAdapter _sut = null!; - private AppConfiguration _configuration = null!; private IList _logOutput = null!; [SetUp] @@ -34,9 +30,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _configuration = new AppConfiguration(); - - _sut = new MsSqlDatabaseAdapter(MsSqlQuery.ConnectionString, _configuration, log.Object); + _sut = new MsSqlDatabaseAdapter(MsSqlQuery.GetConnectionString(), null!, null!, log.Object); } [Test] @@ -127,8 +121,11 @@ public void SqlOutputIntoLog(string script, string expected) [Test] public void GetSetVersionScriptDefault() { - _sut.GetVersionSelectScript().ShouldBe(MsSqlDatabaseAdapter.DefaultSelectVersion); - _sut.GetVersionUpdateScript().ShouldBe(MsSqlDatabaseAdapter.DefaultUpdateVersion); + _sut.GetCurrentVersionScript = MsSqlDefaults.DefaultSelectVersion; + _sut.SetCurrentVersionScript = MsSqlDefaults.DefaultUpdateVersion; + + _sut.GetVersionSelectScript().ShouldBe(MsSqlDefaults.DefaultSelectVersion); + _sut.GetVersionUpdateScript().ShouldBe(MsSqlDefaults.DefaultUpdateVersion); using (var connection = _sut.CreateConnection(false)) { @@ -156,8 +153,8 @@ public void GetSetVersionScriptDefault() [Test] public void GetSetVersionScriptModuleName() { - _configuration.GetCurrentVersionScript = SelectModuleVersion; - _configuration.SetCurrentVersionScript = UpdateModuleVersion; + _sut.GetCurrentVersionScript = SelectModuleVersion; + _sut.SetCurrentVersionScript = UpdateModuleVersion; _sut.GetVersionSelectScript().ShouldBe(SelectModuleVersion); _sut.GetVersionUpdateScript().ShouldBe(UpdateModuleVersion); diff --git a/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlQuery.cs similarity index 51% rename from Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlQuery.cs index dd314e58..7e710597 100644 --- a/Sources/SqlDatabase.Test/TestApi/MsSqlQuery.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlQuery.cs @@ -1,17 +1,18 @@ -using System.Configuration; -using System.Data.SqlClient; +using System.Data.SqlClient; +using SqlDatabase.TestApi; -namespace SqlDatabase.TestApi; +namespace SqlDatabase.Adapter.MsSql; internal static class MsSqlQuery { - public static string ConnectionString => ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; - - public static string DatabaseName => new SqlConnectionStringBuilder(ConnectionString).InitialCatalog; + public static string GetConnectionString() + { + return ConfigurationExtensions.GetConnectionString("mssql"); + } public static SqlConnection Open() { - var con = new SqlConnection(ConnectionString); + var con = new SqlConnection(GetConnectionString()); con.Open(); return con; diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/Case01.sql b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/Case01.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/Case01.sql rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/Case01.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/Case02.sql b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/Case02.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/Case02.sql rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/Case02.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/CaseOneLineComment.sql b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/CaseOneLineComment.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/CaseOneLineComment.sql rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/CaseOneLineComment.sql diff --git a/Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/CaseStoredProcedure.sql b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/CaseStoredProcedure.sql similarity index 100% rename from Sources/SqlDatabase.Test/Scripts/SqlTestCases/Go/CaseStoredProcedure.sql rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.Go/CaseStoredProcedure.sql diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.cs similarity index 93% rename from Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.cs index 5dfdd213..5a10012c 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlTextReaderTest.cs @@ -5,7 +5,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; [TestFixture] public class MsSqlTextReaderTest @@ -45,7 +45,7 @@ public void SplitByGo(byte[] input, string[] expected) private static IEnumerable GetSplitByGoTestCases() { - foreach (var testCase in ResourceReader.Read(typeof(MsSqlTextReaderTest).Assembly, "SqlTestCases.Go")) + foreach (var testCase in ResourceReader.Read(typeof(MsSqlTextReaderTest).Assembly, "MsSqlTextReaderTest.Go")) { yield return new TestCaseData( Encoding.Default.GetBytes(testCase.Input), diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs similarity index 97% rename from Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs index bc1bf8e9..04558431 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/MsSqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs @@ -3,9 +3,8 @@ using System.Text; using NUnit.Framework; using Shouldly; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; [TestFixture] public class MsSqlWriterTest diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj new file mode 100644 index 00000000..6db2c8c8 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj @@ -0,0 +1,30 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.MsSql + ..\..\bin\Tests + + + + + + + + + + + + + + + + + Always + + + + + + + diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config new file mode 100644 index 00000000..6c81a12a --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs similarity index 74% rename from Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs rename to Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs index efa0f6c1..8f68be1b 100644 --- a/Sources/SqlDatabase.Test/Scripts/MsSql/TextScriptOutputMsSqlTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs @@ -4,10 +4,10 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; [TestFixture] public class TextScriptOutputMsSqlTest @@ -15,15 +15,14 @@ public class TextScriptOutputMsSqlTest private SqlConnection _connection = null!; private SqlCommand _command = null!; private Mock _logger = null!; - private Variables _variables = null!; - private TextScript _sut = null!; + private Mock _variables = null!; private IList _logOutput = null!; [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); _logOutput = new List(); _logger = new Mock(MockBehavior.Strict); @@ -38,7 +37,6 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript("dummy", null!, new MsSqlTextReader()); _connection = MsSqlQuery.Open(); _command = _connection.CreateCommand(); } @@ -53,9 +51,9 @@ public void AfterEachTest() [Test] public void ExecuteEmpty() { - _sut.ReadSqlContent = "/* do nothing */".AsFuncStream(); + var sut = CreateSut("/* do nothing */"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.ShouldBeEmpty(); } @@ -63,7 +61,7 @@ public void ExecuteEmpty() [Test] public void ExecuteDdlWithReader() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" create table dbo.TextScriptIntegrationTest(Id int, Name nvarchar(20)) go insert into dbo.TextScriptIntegrationTest values(1, 'name 1') @@ -71,10 +69,9 @@ insert into dbo.TextScriptIntegrationTest values(2, 'name 2') go select * from dbo.TextScriptIntegrationTest go -drop table dbo.TextScriptIntegrationTest" - .AsFuncStream(); +drop table dbo.TextScriptIntegrationTest"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(8); _logOutput[0].ShouldBe("output: Id; Name"); @@ -90,9 +87,9 @@ drop table dbo.TextScriptIntegrationTest" [Test] public void NoColumnName() { - _sut.ReadSqlContent = "select 1".AsFuncStream(); + var sut = CreateSut("select 1"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: (no name)"); @@ -104,9 +101,9 @@ public void NoColumnName() [Test] public void SelectNull() { - _sut.ReadSqlContent = "select null".AsFuncStream(); + var sut = CreateSut("select null"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: (no name)"); @@ -118,12 +115,11 @@ public void SelectNull() [Test] public void TwoSelections() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" select 1 first -select 2 second" - .AsFuncStream(); +select 2 second"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(9); @@ -143,12 +139,18 @@ select 2 second" [Test] public void SelectZeroRowsNull() { - _sut.ReadSqlContent = "select top 0 null value".AsFuncStream(); + var sut = CreateSut("select top 0 null value"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(2); _logOutput[0].ShouldBe("output: value"); _logOutput[1].ShouldBe("0 rows selected"); } + + private IScript CreateSut(string sql) + { + var file = FileFactory.File("dummy.sql", sql); + return new TextScriptFactory(new MsSqlTextReader()).FromFile(file); + } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapter.cs similarity index 52% rename from Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs rename to Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapter.cs index 305137f6..7b3f9899 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapter.cs @@ -1,30 +1,25 @@ using System.Data; using System.Data.SqlClient; using System.IO; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.Export; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; internal sealed class MsSqlDatabaseAdapter : IDatabaseAdapter { - public const string DefaultSelectVersion = "SELECT value from sys.fn_listextendedproperty('version', default, default, default, default, default, default)"; - public const string DefaultUpdateVersion = "EXEC sys.sp_updateextendedproperty @name=N'version', @value=N'{{TargetVersion}}'"; - private readonly string _connectionString; private readonly string _connectionStringMaster; - private readonly AppConfiguration _configuration; private readonly ILogger _log; private readonly SqlInfoMessageEventHandler _onConnectionInfoMessage; public MsSqlDatabaseAdapter( string connectionString, - AppConfiguration configuration, + string getCurrentVersionScript, + string setCurrentVersionScript, ILogger log) { + GetCurrentVersionScript = getCurrentVersionScript; + SetCurrentVersionScript = setCurrentVersionScript; _connectionString = connectionString; - _configuration = configuration; _log = log; var builder = new SqlConnectionStringBuilder(connectionString); @@ -37,10 +32,14 @@ public MsSqlDatabaseAdapter( public string DatabaseName { get; } + public string GetCurrentVersionScript { get; internal set; } + + public string SetCurrentVersionScript { get; internal set; } + public string GetUserFriendlyConnectionString() { var cs = new SqlConnectionStringBuilder(_connectionString); - return "database [{0}] on [{1}]".FormatWith(cs.InitialCatalog, cs.DataSource); + return $"database [{cs.InitialCatalog}] on [{cs.DataSource}]"; } public ISqlTextReader CreateSqlTextReader() => new MsSqlTextReader(); @@ -59,42 +58,14 @@ public IDbConnection CreateConnection(bool switchToMaster) public string GetServerVersionSelectScript() => "select @@version"; - public string GetDatabaseExistsScript(string databaseName) => "SELECT 1 FROM sys.databases WHERE Name=N'{0}'".FormatWith(databaseName); + public string GetDatabaseExistsScript(string databaseName) => $"SELECT 1 FROM sys.databases WHERE Name=N'{databaseName}'"; - public string GetVersionSelectScript() - { - var script = _configuration.MsSql.GetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.GetCurrentVersionScript; - } - - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultSelectVersion; - } - - return script!; - } + public string GetVersionSelectScript() => GetCurrentVersionScript; - public string GetVersionUpdateScript() - { - var script = _configuration.MsSql.SetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.SetCurrentVersionScript; - } - - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultUpdateVersion; - } - - return script!; - } + public string GetVersionUpdateScript() => SetCurrentVersionScript; private void OnConnectionInfoMessage(object sender, SqlInfoMessageEventArgs e) { - _log.Info("output: {0}".FormatWith(e.ToString())); + _log.Info($"output: {e}"); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs new file mode 100644 index 00000000..f5107a2d --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs @@ -0,0 +1,51 @@ +using System; +using System.Data.Common; +using System.Data.SqlClient; + +namespace SqlDatabase.Adapter.MsSql; + +public static class MsSqlDatabaseAdapterFactory +{ + public static bool CanBe(string connectionString) + { + if (!IsMsSql(connectionString)) + { + return false; + } + + var builder = new DbConnectionStringBuilder(false) { ConnectionString = connectionString }; + return builder.ContainsKey("Data Source") || builder.ContainsKey("Initial Catalog"); + } + + public static IDatabaseAdapter CreateAdapter( + string connectionString, + string? getCurrentVersionScript, + string? setCurrentVersionScript, + ILogger log) + { + return new MsSqlDatabaseAdapter( + connectionString, + string.IsNullOrWhiteSpace(getCurrentVersionScript) ? MsSqlDefaults.DefaultSelectVersion : getCurrentVersionScript!, + string.IsNullOrWhiteSpace(setCurrentVersionScript) ? MsSqlDefaults.DefaultUpdateVersion : setCurrentVersionScript!, + log); + } + + private static bool IsMsSql(string connectionString) + { + var builder = new SqlConnectionStringBuilder(); + + try + { + builder.ConnectionString = connectionString; + return true; + } + catch (ArgumentException) + { + return false; + } + catch (FormatException) + { + return false; + } + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MsSql/MsSqlDefaults.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDefaults.cs new file mode 100644 index 00000000..2bb7eaec --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDefaults.cs @@ -0,0 +1,7 @@ +namespace SqlDatabase.Adapter.MsSql; + +internal static class MsSqlDefaults +{ + public const string DefaultSelectVersion = "SELECT value from sys.fn_listextendedproperty('version', default, default, default, default, default, default)"; + public const string DefaultUpdateVersion = "EXEC sys.sp_updateextendedproperty @name=N'version', @value=N'{{TargetVersion}}'"; +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlTextReader.cs similarity index 97% rename from Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs rename to Sources/SqlDatabase.Adapter.MsSql/MsSqlTextReader.cs index ad15e265..8c3be1e9 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlTextReader.cs +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlTextReader.cs @@ -4,7 +4,7 @@ using System.Text; using System.Text.RegularExpressions; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; internal sealed class MsSqlTextReader : ISqlTextReader { diff --git a/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlWriter.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs rename to Sources/SqlDatabase.Adapter.MsSql/MsSqlWriter.cs index 175c8e0b..2b873c97 100644 --- a/Sources/SqlDatabase/Scripts/MsSql/MsSqlWriter.cs +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlWriter.cs @@ -4,9 +4,8 @@ using System.IO; using System.Linq; using System.Text; -using SqlDatabase.Export; -namespace SqlDatabase.Scripts.MsSql; +namespace SqlDatabase.Adapter.MsSql; internal sealed class MsSqlWriter : SqlWriterBase { @@ -56,7 +55,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, case "DECIMAL": if (scale != 0) { - sizeText = "{0},{1}".FormatWith(precision, scale); + sizeText = $"{precision},{scale}"; } else if (precision != 18) { @@ -127,7 +126,7 @@ public override ExportTable ReadSchemaTable(DataTable metadata, string tableName else if (typeName.EndsWith("sys.HIERARCHYID", StringComparison.OrdinalIgnoreCase)) { // System.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies - throw new NotSupportedException("Data type hierarchyid is not supported, to export data convert value to NVARCHAR: SELECT CAST([{0}] AND NVARCHAR(100)) [{0}]".FormatWith(name)); + throw new NotSupportedException($"Data type hierarchyid is not supported, to export data convert value to NVARCHAR: SELECT CAST([{name}] AND NVARCHAR(100)) [{name}]"); } result.Columns.Add(new ExportTableColumn diff --git a/Sources/SqlDatabase.Adapter.MsSql/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.MsSql/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0c47a6bd --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.MsSql.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj b/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj new file mode 100644 index 00000000..e96110aa --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj @@ -0,0 +1,15 @@ + + + + net472;netstandard2.0 + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs b/Sources/SqlDatabase.Adapter.Sql.Test/Export/DataExportLoggerTest.cs similarity index 94% rename from Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs rename to Sources/SqlDatabase.Adapter.Sql.Test/Export/DataExportLoggerTest.cs index d80127e2..9879b9fd 100644 --- a/Sources/SqlDatabase.Test/Export/DataExportLoggerTest.cs +++ b/Sources/SqlDatabase.Adapter.Sql.Test/Export/DataExportLoggerTest.cs @@ -2,9 +2,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.Sql.Export; [TestFixture] public class DataExportLoggerTest diff --git a/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj new file mode 100644 index 00000000..cdcbe103 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj @@ -0,0 +1,20 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.Sql + ..\..\bin\Tests + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs b/Sources/SqlDatabase.Adapter.Sql.Test/SqlScriptVariableParserTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs rename to Sources/SqlDatabase.Adapter.Sql.Test/SqlScriptVariableParserTest.cs index 933abecf..460f74b1 100644 --- a/Sources/SqlDatabase.Test/Scripts/SqlScriptVariableParserTest.cs +++ b/Sources/SqlDatabase.Adapter.Sql.Test/SqlScriptVariableParserTest.cs @@ -2,9 +2,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.Sql; [TestFixture] public class SqlScriptVariableParserTest diff --git a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs similarity index 63% rename from Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs rename to Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs index 7f6a2cf0..9148f6b3 100644 --- a/Sources/SqlDatabase.Test/Scripts/TextScriptTest.cs +++ b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs @@ -3,21 +3,18 @@ using System.Data; using System.IO; using System.Linq; -using System.Text; using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Scripts.MsSql; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.Sql; [TestFixture] public class TextScriptTest { private Mock _logger = null!; - private Variables _variables = null!; + private Mock _variables = null!; + private Mock _textReader = null!; private Mock _command = null!; private TextScript _sut = null!; @@ -28,7 +25,12 @@ public class TextScriptTest [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); + _variables + .Setup(v => v.GetValue("var1")) + .Returns("[some value]"); + + _textReader = new Mock(MockBehavior.Strict); _logOutput = new List(); _logger = new Mock(MockBehavior.Strict); @@ -53,14 +55,17 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(_executedReader.Object); - _sut = new TextScript(null!, null!, new MsSqlTextReader()); - _variables.SetValue(VariableSource.CommandLine, "var1", "[some value]"); + _sut = new TextScript(null!, null!, _textReader.Object); } [Test] public void ExecuteShowVariableReplacement() { - _sut.ReadSqlContent = "{{var1}} {{var1}}".AsFuncStream(); + var sqlContent = new MemoryStream(); + _sut.ReadSqlContent = () => sqlContent; + _textReader + .Setup(r => r.ReadBatches(sqlContent)) + .Returns(new[] { "{{var1}} {{var1}}" }); _executedReader .Setup(r => r.GetSchemaTable()) @@ -72,7 +77,7 @@ public void ExecuteShowVariableReplacement() .Setup(r => r.NextResult()) .Returns(false); - _sut.Execute(_command.Object, _variables, _logger.Object); + _sut.Execute(_command.Object, _variables.Object, _logger.Object); _executedScripts.Count.ShouldBe(1); _executedScripts[0].ShouldBe("[some value] [some value]"); @@ -85,12 +90,11 @@ public void ExecuteShowVariableReplacement() [Test] public void Execute() { - _sut.ReadSqlContent = @" -{{var1}} -go -text2 -go" - .AsFuncStream(); + var sqlContent = new MemoryStream(); + _sut.ReadSqlContent = () => sqlContent; + _textReader + .Setup(r => r.ReadBatches(sqlContent)) + .Returns(new[] { "{{var1}}", "text2" }); _executedReader .Setup(r => r.GetSchemaTable()) @@ -102,7 +106,7 @@ public void Execute() .Setup(r => r.NextResult()) .Returns(false); - _sut.Execute(_command.Object, _variables, _logger.Object); + _sut.Execute(_command.Object, _variables.Object, _logger.Object); _executedScripts.Count.ShouldBe(2); _executedScripts[0].ShouldBe("[some value]"); @@ -114,23 +118,28 @@ public void Execute() [Test] public void ExecuteWhatIf() { - _sut.ReadSqlContent = () => new MemoryStream(Encoding.Default.GetBytes(@" -{{var1}} -go -text2 -go")); + var sqlContent = new MemoryStream(); + _sut.ReadSqlContent = () => sqlContent; + _textReader + .Setup(r => r.ReadBatches(sqlContent)) + .Returns(new[] { "{{var1}}", "text2" }); - _sut.Execute(null, _variables, _logger.Object); + _sut.Execute(null, _variables.Object, _logger.Object); _executedScripts.ShouldBeEmpty(); + _textReader.VerifyAll(); } [Test] public void ExecuteReader() { - _sut.ReadSqlContent = "select {{var1}}".AsFuncStream(); + var sqlContent = new MemoryStream(); + _sut.ReadSqlContent = () => sqlContent; + _textReader + .Setup(r => r.ReadBatches(sqlContent)) + .Returns(new[] { "select {{var1}}" }); - var actual = _sut.ExecuteReader(_command.Object, _variables, _logger.Object).ToList(); + var actual = _sut.ExecuteReader(_command.Object, _variables.Object, _logger.Object).ToList(); _executedScripts.Count.ShouldBe(1); _executedScripts[0].ShouldBe("select [some value]"); @@ -144,12 +153,11 @@ public void ExecuteReader() [Test] public void GetDependencies() { - _sut.ReadSqlContent = @" --- module dependency: a 1.0 -go --- module dependency: b 1.0 -go" - .AsFuncStream(); + var sqlContent = new MemoryStream(); + _sut.ReadSqlContent = () => sqlContent; + _textReader + .Setup(r => r.ReadFirstBatch(sqlContent)) + .Returns("-- module dependency: a 1.0"); var actual = _sut.GetDependencies(); diff --git a/Sources/SqlDatabase/Export/DataExportLogger.cs b/Sources/SqlDatabase.Adapter.Sql/Export/DataExportLogger.cs similarity index 88% rename from Sources/SqlDatabase/Export/DataExportLogger.cs rename to Sources/SqlDatabase.Adapter.Sql/Export/DataExportLogger.cs index 5ad666af..6869d2fa 100644 --- a/Sources/SqlDatabase/Export/DataExportLogger.cs +++ b/Sources/SqlDatabase.Adapter.Sql/Export/DataExportLogger.cs @@ -1,11 +1,10 @@ using System; using System.IO; using System.Text; -using SqlDatabase.Adapter; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.Sql.Export; -internal sealed class DataExportLogger : ILogger +public sealed class DataExportLogger : ILogger { private readonly ILogger _origin; diff --git a/Sources/SqlDatabase/Export/DataExporter.cs b/Sources/SqlDatabase.Adapter.Sql/Export/DataExporter.cs similarity index 91% rename from Sources/SqlDatabase/Export/DataExporter.cs rename to Sources/SqlDatabase.Adapter.Sql/Export/DataExporter.cs index c4e01372..d5e78033 100644 --- a/Sources/SqlDatabase/Export/DataExporter.cs +++ b/Sources/SqlDatabase.Adapter.Sql/Export/DataExporter.cs @@ -1,9 +1,8 @@ using System.Data; -using SqlDatabase.Adapter; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.Sql.Export; -internal sealed class DataExporter : IDataExporter +public sealed class DataExporter : IDataExporter { public SqlWriterBase Output { get; set; } = null!; @@ -61,14 +60,14 @@ public void Export(IDataReader source, string tableName) batchNum++; rowNum = 0; - Log.Info("{0} rows".FormatWith(batchNum * MaxInsertBatchSize)); + Log.Info($"{batchNum * MaxInsertBatchSize} rows"); } } Output.BatchSeparator(); if (rowNum > 0) { - Log.Info("{0} rows".FormatWith((batchNum * MaxInsertBatchSize) + rowNum)); + Log.Info($"{(batchNum * MaxInsertBatchSize) + rowNum} rows"); } } diff --git a/Sources/SqlDatabase/Export/IDataExporter.cs b/Sources/SqlDatabase.Adapter.Sql/Export/IDataExporter.cs similarity index 62% rename from Sources/SqlDatabase/Export/IDataExporter.cs rename to Sources/SqlDatabase.Adapter.Sql/Export/IDataExporter.cs index 390cba28..dce30582 100644 --- a/Sources/SqlDatabase/Export/IDataExporter.cs +++ b/Sources/SqlDatabase.Adapter.Sql/Export/IDataExporter.cs @@ -1,9 +1,8 @@ using System.Data; -using SqlDatabase.Adapter; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.Sql.Export; -internal interface IDataExporter +public interface IDataExporter { SqlWriterBase Output { get; set; } diff --git a/Sources/SqlDatabase.Adapter.Sql/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.Sql/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c3b4fa92 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.Sql/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.Sql.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.Sql/SqlDatabase.Adapter.Sql.csproj b/Sources/SqlDatabase.Adapter.Sql/SqlDatabase.Adapter.Sql.csproj new file mode 100644 index 00000000..dfc4d620 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.Sql/SqlDatabase.Adapter.Sql.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.0 + + + + + + + diff --git a/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs b/Sources/SqlDatabase.Adapter.Sql/SqlScriptVariableParser.cs similarity index 90% rename from Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs rename to Sources/SqlDatabase.Adapter.Sql/SqlScriptVariableParser.cs index 436488dc..1c491d63 100644 --- a/Sources/SqlDatabase/Scripts/SqlScriptVariableParser.cs +++ b/Sources/SqlDatabase.Adapter.Sql/SqlScriptVariableParser.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.Sql; -internal sealed class SqlScriptVariableParser +public sealed class SqlScriptVariableParser { internal const string ValueIsHidden = "[value is hidden]"; @@ -60,7 +59,7 @@ private string Evaluator(Match match) var value = Variables.GetValue(name); if (value == null) { - throw new InvalidOperationException("Variable [{0}] not defined.".FormatWith(name)); + throw new InvalidOperationException($"Variable [{name}] not defined."); } OnVariablesReplace(name, value); diff --git a/Sources/SqlDatabase/Scripts/TextScript.cs b/Sources/SqlDatabase.Adapter.Sql/TextScript.cs similarity index 94% rename from Sources/SqlDatabase/Scripts/TextScript.cs rename to Sources/SqlDatabase.Adapter.Sql/TextScript.cs index aa31189e..e0c96e6f 100644 --- a/Sources/SqlDatabase/Scripts/TextScript.cs +++ b/Sources/SqlDatabase.Adapter.Sql/TextScript.cs @@ -4,9 +4,8 @@ using System.Globalization; using System.IO; using System.Linq; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter.Sql; internal sealed class TextScript : IScript { @@ -158,9 +157,8 @@ private static void ReadWithOutput(IDataReader reader, string[] columns, ILogger } } - logger.Info("{0} row{1} selected".FormatWith( - rowsCount.ToString(CultureInfo.CurrentCulture), - rowsCount == 1 ? null : "s")); + var s = rowsCount == 1 ? null : "s"; + logger.Info($"{rowsCount} row{s} selected"); } private IEnumerable ResolveBatches(IVariables variables, ILogger logger) @@ -183,7 +181,7 @@ private IEnumerable ResolveBatches(IVariables variables, ILogger logger) var report = scriptParser.ValueByName.OrderBy(i => i.Key); foreach (var entry in report) { - logger.Info("variable {0} was replaced with {1}".FormatWith(entry.Key, entry.Value)); + logger.Info($"variable {entry.Key} was replaced with {entry.Value}"); } return batches; diff --git a/Sources/SqlDatabase.Adapter.Sql/TextScriptFactory.cs b/Sources/SqlDatabase.Adapter.Sql/TextScriptFactory.cs new file mode 100644 index 00000000..dd02563b --- /dev/null +++ b/Sources/SqlDatabase.Adapter.Sql/TextScriptFactory.cs @@ -0,0 +1,24 @@ +using System; +using SqlDatabase.FileSystem; + +namespace SqlDatabase.Adapter.Sql; + +public class TextScriptFactory : IScriptFactory +{ + private readonly ISqlTextReader _textReader; + + public TextScriptFactory(ISqlTextReader textReader) + { + _textReader = textReader; + } + + public bool IsSupported(IFile file) + { + return ".sql".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); + } + + public IScript FromFile(IFile file) + { + return new TextScript(file.Name, file.OpenRead, _textReader); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Export/DataReaderTools.cs b/Sources/SqlDatabase.Adapter/DataReaderTools.cs similarity index 75% rename from Sources/SqlDatabase/Export/DataReaderTools.cs rename to Sources/SqlDatabase.Adapter/DataReaderTools.cs index 28703dd8..6a5c845c 100644 --- a/Sources/SqlDatabase/Export/DataReaderTools.cs +++ b/Sources/SqlDatabase.Adapter/DataReaderTools.cs @@ -1,8 +1,8 @@ using System; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter; -internal static class DataReaderTools +public static class DataReaderTools { public static object? CleanValue(object? value) { diff --git a/Sources/SqlDatabase/Export/ExportTable.cs b/Sources/SqlDatabase.Adapter/ExportTable.cs similarity index 62% rename from Sources/SqlDatabase/Export/ExportTable.cs rename to Sources/SqlDatabase.Adapter/ExportTable.cs index 37154045..e80e4323 100644 --- a/Sources/SqlDatabase/Export/ExportTable.cs +++ b/Sources/SqlDatabase.Adapter/ExportTable.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter; -internal sealed class ExportTable +public sealed class ExportTable { public ExportTable(string name) { @@ -12,5 +12,5 @@ public ExportTable(string name) public string Name { get; } - public IList Columns { get; } + public List Columns { get; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Export/ExportTableColumn.cs b/Sources/SqlDatabase.Adapter/ExportTableColumn.cs similarity index 69% rename from Sources/SqlDatabase/Export/ExportTableColumn.cs rename to Sources/SqlDatabase.Adapter/ExportTableColumn.cs index 9f6843f9..d2b8a69f 100644 --- a/Sources/SqlDatabase/Export/ExportTableColumn.cs +++ b/Sources/SqlDatabase.Adapter/ExportTableColumn.cs @@ -1,6 +1,6 @@ -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter; -internal struct ExportTableColumn +public struct ExportTableColumn { public string Name { get; set; } @@ -16,6 +16,6 @@ internal struct ExportTableColumn public override string ToString() { - return "{0} {1}({2})".FormatWith(Name, SqlDataTypeName, Size); + return $"{Name} {SqlDataTypeName}({Size})"; } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/IDatabaseAdapter.cs b/Sources/SqlDatabase.Adapter/IDatabaseAdapter.cs similarity index 83% rename from Sources/SqlDatabase/Scripts/IDatabaseAdapter.cs rename to Sources/SqlDatabase.Adapter/IDatabaseAdapter.cs index a646ab38..4d45dfab 100644 --- a/Sources/SqlDatabase/Scripts/IDatabaseAdapter.cs +++ b/Sources/SqlDatabase.Adapter/IDatabaseAdapter.cs @@ -1,10 +1,9 @@ using System.Data; using System.IO; -using SqlDatabase.Export; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter; -internal interface IDatabaseAdapter +public interface IDatabaseAdapter { string DatabaseName { get; } diff --git a/Sources/SqlDatabase/Scripts/ISqlTextReader.cs b/Sources/SqlDatabase.Adapter/ISqlTextReader.cs similarity index 69% rename from Sources/SqlDatabase/Scripts/ISqlTextReader.cs rename to Sources/SqlDatabase.Adapter/ISqlTextReader.cs index 8e1beedb..a4e6aa77 100644 --- a/Sources/SqlDatabase/Scripts/ISqlTextReader.cs +++ b/Sources/SqlDatabase.Adapter/ISqlTextReader.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.IO; -namespace SqlDatabase.Scripts; +namespace SqlDatabase.Adapter; -internal interface ISqlTextReader +public interface ISqlTextReader { string? ReadFirstBatch(Stream sql); diff --git a/Sources/SqlDatabase/Export/SqlWriterBase.cs b/Sources/SqlDatabase.Adapter/SqlWriterBase.cs similarity index 91% rename from Sources/SqlDatabase/Export/SqlWriterBase.cs rename to Sources/SqlDatabase.Adapter/SqlWriterBase.cs index 254410b4..f0f911e2 100644 --- a/Sources/SqlDatabase/Export/SqlWriterBase.cs +++ b/Sources/SqlDatabase.Adapter/SqlWriterBase.cs @@ -2,9 +2,9 @@ using System.Data; using System.IO; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter; -internal abstract class SqlWriterBase : IDisposable +public abstract class SqlWriterBase : IDisposable { public const char Q = '\''; @@ -61,7 +61,7 @@ public SqlWriterBase Value(object? value, string? typeNameHint = null) if (!TryWriteValue(value, typeNameHint)) { - throw new NotSupportedException("Type [{0}] is not supported.".FormatWith(value.GetType())); + throw new NotSupportedException($"Type [{value.GetType()}] is not supported."); } return this; diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index b7d46eb3..f4007a08 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -4,9 +4,8 @@ using Moq; using NUnit.Framework; using SqlDatabase.Adapter; -using SqlDatabase.Export; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Scripts; -using SqlDatabase.Scripts.MsSql; using SqlDatabase.Sequence; namespace SqlDatabase.Commands; @@ -30,7 +29,7 @@ public void BeforeEachTest() .Returns("host; database"); adapter .Setup(a => a.CreateSqlWriter(It.IsAny())) - .Returns(output => new MsSqlWriter(output)); + .Returns(output => new Mock(MockBehavior.Loose, output) { CallBase = true }.Object); _database = new Mock(MockBehavior.Strict); _database.SetupGet(d => d.Adapter).Returns(adapter.Object); diff --git a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs index a44971ba..39d8986e 100644 --- a/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/ExportCommandLineTest.cs @@ -3,8 +3,8 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Commands; -using SqlDatabase.Export; using SqlDatabase.FileSystem; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs index 6bb17c6b..37e1c58a 100644 --- a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs @@ -6,6 +6,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Scripts.MySql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs index 28f1b151..ca9caa4c 100644 --- a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs @@ -10,6 +10,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Scripts.PgSql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs deleted file mode 100644 index c70bec07..00000000 --- a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/ProgramTest.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.Data.SqlClient; -using System.IO; -using System.Linq; -using Dapper; -using Moq; -using NUnit.Framework; -using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.MsSql; -using SqlDatabase.TestApi; -using ConfigurationManager = System.Configuration.ConfigurationManager; - -namespace SqlDatabase.IntegrationTests.MsSql; - -[TestFixture] -public class ProgramTest -{ - private readonly string _connectionString = new SqlConnectionStringBuilder(MsSqlQuery.ConnectionString) { InitialCatalog = "SqlDatabaseIT" }.ToString(); - - private string _scriptsLocation = null!; - private AppConfiguration _configuration = null!; - private TempFile _logFile = null!; - - [SetUp] - public void BeforeEachTest() - { - _scriptsLocation = ConfigurationManager.AppSettings["MsSql.IntegrationTestsScriptsLocation"]!; - if (!Path.IsPathRooted(_scriptsLocation)) - { - _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); - } - - _configuration = new AppConfiguration(); - - _logFile = new TempFile(".log"); - } - - [TearDown] - public void AfterEachTest() - { - FileAssert.Exists(_logFile.Location); - var fileContent = File.ReadAllLines(_logFile.Location); - _logFile.Dispose(); - - fileContent.ShouldNotBeEmpty(); - } - - [Test] - [Order(1)] - - public void CreateDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandCreate) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "new")) - .SetVariable("JohnCity", "London") - .SetVariable("MariaCity", "Paris") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Assert.AreEqual(0, Program.Main(args)); - - const string Sql = @" -SELECT Person.Id, Person.Name, PersonAddress.City -FROM demo.Person Person - INNER JOIN demo.PersonAddress PersonAddress ON (PersonAddress.PersonId = Person.Id) -ORDER BY Person.Id"; - - Assert.AreEqual(new Version("1.2"), CreateDatabaseObject().GetCurrentVersion(null)); - - using (var c = new SqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].Id); - Assert.AreEqual("John", rows[0].Name); - Assert.AreEqual("London", rows[0].City); - - Assert.AreEqual(2, rows[1].Id); - Assert.AreEqual("Maria", rows[1].Name); - Assert.AreEqual("Paris", rows[1].City); - } - } - - [Test] - [Order(2)] - public void UpgradeDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "upgrade")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "Upgrade", "SqlDatabase.exe.config")) - .SetVariable("JohnSecondName", "Smitt") - .SetVariable("MariaSecondName", "X") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Assert.AreEqual(0, Program.Main(args)); - - const string Sql = @" -SELECT Person.Id, Person.SecondName -FROM demo.Person Person -ORDER BY Person.Id"; - - Assert.AreEqual(new Version("2.1"), CreateDatabaseObject().GetCurrentVersion(null)); - - using (var c = new SqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].Id); - Assert.AreEqual("Smitt", rows[0].SecondName); - - Assert.AreEqual(2, rows[1].Id); - Assert.AreEqual("X", rows[1].SecondName); - } - } - - [Test] - [Order(3)] - public void UpgradeDatabaseModularity() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "UpgradeModularity")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "UpgradeModularity", "SqlDatabase.exe.config")) - .SetLogFileName(_logFile.Location); - - Program.Main(args.BuildArray()).ShouldBe(0); - - const string Sql = @" -SELECT p.Name, a.City -FROM moduleA.Person p - LEFT JOIN moduleB.PersonAddress a ON a.PersonId = p.Id -ORDER BY p.Name"; - - var configuration = new SqlDatabase.Configuration.ConfigurationManager(); - configuration.LoadFrom(args.Line.ConfigurationFile); - - var db = CreateDatabaseObject(configuration.SqlDatabase); - db.GetCurrentVersion("ModuleA").ShouldBe(new Version("2.0")); - db.GetCurrentVersion("ModuleB").ShouldBe(new Version("1.1")); - db.GetCurrentVersion("ModuleC").ShouldBe(new Version("2.0")); - - using (var c = new SqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - rows.Count.ShouldBe(2); - - Assert.AreEqual("John", rows[0].Name); - Assert.AreEqual("London", rows[0].City); - - Assert.AreEqual("Maria", rows[1].Name); - Assert.IsNull(rows[1].City); - } - } - - [Test] - [Order(4)] - public void ExportDataToConsole() - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("dbo.ExportedData1") - .BuildArray(); - - int exitCode; - string output; - using (var console = new TempConsoleOut()) - { - exitCode = Program.Main(args); - output = console.GetOutput(); - } - - Console.WriteLine(output); - exitCode.ShouldBe(0); - - // exec - InvokeExecuteCommand(b => b.SetInLineScript(output)); - - // test - using (var c = new SqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM dbo.ExportedData1"); - test.ShouldBe(2); - } - } - - [Test] - [Order(5)] - public void ExportDataToFile() - { - using (var output = new TempFile(".sql")) - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("dbo.ExportedData2") - .SetExportToFile(output.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - Console.WriteLine(File.ReadAllText(output.Location)); - - // exec - InvokeExecuteCommand(b => b.SetScripts(output.Location)); - } - - // test - using (var c = new SqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM dbo.ExportedData2"); - test.ShouldBe(2); - } - } - - [Test] - [Order(6)] - public void ExecuteScript() - { - InvokeExecuteCommand(b => - b.SetScripts(Path.Combine(_scriptsLocation, "execute", "drop.database.sql"))); - - var sql = "SELECT DB_ID('{0}')".FormatWith(new SqlConnectionStringBuilder(_connectionString).InitialCatalog); - - using (var c = new SqlConnection(MsSqlQuery.ConnectionString)) - { - c.Open(); - - var test = c.ExecuteScalar(sql); - Assert.IsNull(test); - } - } - - private void InvokeExecuteCommand(Action builder) - { - var cmd = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExecute) - .SetConnection(_connectionString) - .SetLogFileName(_logFile.Location); - - builder(cmd); - var args = cmd.BuildArray(); - - Program.Main(args).ShouldBe(0); - } - - private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) - { - var log = new Mock(MockBehavior.Strict).Object; - var adapter = new MsSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); - - return new Database(adapter, log, TransactionMode.None, false); - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index 92820615..34e0827c 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -5,7 +5,6 @@ using Shouldly; using SqlDatabase.Adapter; using SqlDatabase.Configuration; -using SqlDatabase.Scripts.MsSql; using SqlDatabase.Scripts.MySql; using SqlDatabase.Scripts.PgSql; using SqlDatabase.TestApi; @@ -27,20 +26,20 @@ public void BeforeEachTest() [Test] [TestCaseSource(nameof(GetCreateAdapterCases))] - public void CreateAdapter(string connectionString, string databaseName, Type expected) + public void CreateAdapter(string connectionString, string databaseName, string expected) { var actual = DatabaseAdapterFactory.CreateAdapter(connectionString, _configuration, _log); - actual.ShouldBeOfType(expected); + actual.GetType().Name.ShouldBe(expected); actual.DatabaseName.ShouldBe(databaseName); } private static IEnumerable GetCreateAdapterCases() { yield return new TestCaseData( - MsSqlQuery.ConnectionString, - MsSqlQuery.DatabaseName, - typeof(MsSqlDatabaseAdapter)) + "Data Source=.;Initial Catalog=SqlDatabaseTest", + "SqlDatabaseTest", + "MsSqlDatabaseAdapter") { TestName = "MsSql" }; @@ -48,7 +47,7 @@ private static IEnumerable GetCreateAdapterCases() yield return new TestCaseData( PgSqlQuery.ConnectionString, PgSqlQuery.DatabaseName, - typeof(PgSqlDatabaseAdapter)) + nameof(PgSqlDatabaseAdapter)) { TestName = "PgSql" }; @@ -56,7 +55,7 @@ private static IEnumerable GetCreateAdapterCases() yield return new TestCaseData( MySqlQuery.ConnectionString, MySqlQuery.DatabaseName, - typeof(MySqlDatabaseAdapter)) + nameof(MySqlDatabaseAdapter)) { TestName = "MySql" }; diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs index d7eca3fe..309ad1e9 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.MySql; @@ -15,15 +16,14 @@ public class TextScriptOutputMySqlTest private MySqlConnection _connection = null!; private MySqlCommand _command = null!; private Mock _logger = null!; - private Variables _variables = null!; - private TextScript _sut = null!; + private Mock _variables = null!; private IList _logOutput = null!; [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); _logOutput = new List(); _logger = new Mock(MockBehavior.Strict); @@ -38,8 +38,6 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript("dummy", null!, new MySqlTextReader()); - _connection = MySqlQuery.Open(); _command = _connection.CreateCommand(); } @@ -54,9 +52,9 @@ public void AfterEachTest() [Test] public void ExecuteEmpty() { - _sut.ReadSqlContent = "/* do nothing */".AsFuncStream(); + var sut = CreateSut("/* do nothing */"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.ShouldBeEmpty(); } @@ -64,7 +62,7 @@ public void ExecuteEmpty() [Test] public void ExecuteDdlWithReader() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" create table TextScriptIntegrationTest(id int, name varchar(20)); insert into TextScriptIntegrationTest values(1, 'name 1'); @@ -72,10 +70,9 @@ public void ExecuteDdlWithReader() select * from TextScriptIntegrationTest; -drop table TextScriptIntegrationTest;" - .AsFuncStream(); +drop table TextScriptIntegrationTest;"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(8); _logOutput[0].ShouldBe("output: id; name"); @@ -91,9 +88,9 @@ public void ExecuteDdlWithReader() [Test] public void NoColumnName() { - _sut.ReadSqlContent = "select 1".AsFuncStream(); + var sut = CreateSut("select 1"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: 1"); @@ -105,9 +102,9 @@ public void NoColumnName() [Test] public void SelectNull() { - _sut.ReadSqlContent = "select null".AsFuncStream(); + var sut = CreateSut("select null"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: NULL"); @@ -119,12 +116,11 @@ public void SelectNull() [Test] public void TwoSelections() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" select 1 first_; -select 2 second_;" - .AsFuncStream(); +select 2 second_;"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(9); @@ -144,12 +140,18 @@ public void TwoSelections() [Test] public void SelectZeroRowsNull() { - _sut.ReadSqlContent = "select null value_ limit 0".AsFuncStream(); + var sut = CreateSut("select null value_ limit 0"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(2); _logOutput[0].ShouldBe("output: value_"); _logOutput[1].ShouldBe("0 rows selected"); } + + private IScript CreateSut(string sql) + { + var file = FileFactory.File("dummy.sql", sql); + return new TextScriptFactory(new MySqlTextReader()).FromFile(file); + } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs index 072f33be..7944d5ec 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts.PgSql; @@ -15,15 +16,14 @@ public class TextScriptOutputPgSqlTest private NpgsqlConnection _connection = null!; private NpgsqlCommand _command = null!; private Mock _logger = null!; - private Variables _variables = null!; - private TextScript _sut = null!; + private Mock _variables = null!; private IList _logOutput = null!; [SetUp] public void BeforeEachTest() { - _variables = new Variables(); + _variables = new Mock(MockBehavior.Strict); _logOutput = new List(); _logger = new Mock(MockBehavior.Strict); @@ -38,8 +38,6 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _sut = new TextScript("dummy", null!, new PgSqlTextReader()); - _connection = PgSqlQuery.Open(); _command = _connection.CreateCommand(); } @@ -54,9 +52,9 @@ public void AfterEachTest() [Test] public void ExecuteEmpty() { - _sut.ReadSqlContent = "/* do nothing */".AsFuncStream(); + var sut = CreateSut("/* do nothing */"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.ShouldBeEmpty(); } @@ -64,7 +62,7 @@ public void ExecuteEmpty() [Test] public void ExecuteDdlWithReader() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" create table public.TextScriptIntegrationTest(id int, name varchar(20)); insert into public.TextScriptIntegrationTest values(1, 'name 1'); @@ -72,10 +70,9 @@ public void ExecuteDdlWithReader() select * from public.TextScriptIntegrationTest; -drop table public.TextScriptIntegrationTest;" - .AsFuncStream(); +drop table public.TextScriptIntegrationTest;"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(8); _logOutput[0].ShouldBe("output: id; name"); @@ -91,9 +88,9 @@ public void ExecuteDdlWithReader() [Test] public void NoColumnName() { - _sut.ReadSqlContent = "select 1".AsFuncStream(); + var sut = CreateSut("select 1"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: (no name)"); @@ -105,9 +102,9 @@ public void NoColumnName() [Test] public void SelectNull() { - _sut.ReadSqlContent = "select null".AsFuncStream(); + var sut = CreateSut("select null"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(4); _logOutput[0].ShouldBe("output: (no name)"); @@ -119,12 +116,11 @@ public void SelectNull() [Test] public void TwoSelections() { - _sut.ReadSqlContent = @" + var sut = CreateSut(@" select 1 first_; -select 2 second_;" - .AsFuncStream(); +select 2 second_;"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(9); @@ -144,12 +140,18 @@ public void TwoSelections() [Test] public void SelectZeroRowsNull() { - _sut.ReadSqlContent = "select null value_ limit 0".AsFuncStream(); + var sut = CreateSut("select null value_ limit 0"); - _sut.Execute(_command, _variables, _logger.Object); + sut.Execute(_command, _variables.Object, _logger.Object); _logOutput.Count.ShouldBe(2); _logOutput[0].ShouldBe("output: value_"); _logOutput[1].ShouldBe("0 rows selected"); } + + private IScript CreateSut(string sql) + { + var file = FileFactory.File("dummy.sql", sql); + return new TextScriptFactory(new PgSqlTextReader()).FromFile(file); + } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index b3085e6e..9baa63f3 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -30,10 +30,6 @@ - - - - diff --git a/Sources/SqlDatabase.TestApi/ConfigurationExtensions.cs b/Sources/SqlDatabase.TestApi/ConfigurationExtensions.cs new file mode 100644 index 00000000..5a8843f9 --- /dev/null +++ b/Sources/SqlDatabase.TestApi/ConfigurationExtensions.cs @@ -0,0 +1,28 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Xml; +using Shouldly; + +namespace SqlDatabase.TestApi; + +public static class ConfigurationExtensions +{ + public static string GetConnectionString(string name, Type? anchor = null) + { + if (anchor == null) + { + anchor = new StackTrace().GetFrame(1)!.GetMethod()!.DeclaringType; + } + + var fileName = Path.Combine(AppContext.BaseDirectory, anchor.Assembly.GetName().Name + ".dll.config"); + + var config = new XmlDocument(); + config.Load(fileName); + + var node = config.SelectSingleNode($"configuration/connectionStrings/add[@name = '{name}']")?.Attributes?["connectionString"]; + node.ShouldNotBeNull(); + + return node.Value; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/TestApi/TempConsoleOut.cs b/Sources/SqlDatabase.TestApi/TempConsoleOut.cs similarity index 92% rename from Sources/SqlDatabase.Test/TestApi/TempConsoleOut.cs rename to Sources/SqlDatabase.TestApi/TempConsoleOut.cs index 7d9be97e..942c8cb7 100644 --- a/Sources/SqlDatabase.Test/TestApi/TempConsoleOut.cs +++ b/Sources/SqlDatabase.TestApi/TempConsoleOut.cs @@ -3,7 +3,7 @@ namespace SqlDatabase.TestApi; -internal sealed class TempConsoleOut : IDisposable +public sealed class TempConsoleOut : IDisposable { private readonly TextWriter _originalOutput; private readonly Buffer _buffer; diff --git a/Sources/SqlDatabase.Test/TestApi/TextExtensions.cs b/Sources/SqlDatabase.TestApi/TextExtensions.cs similarity index 86% rename from Sources/SqlDatabase.Test/TestApi/TextExtensions.cs rename to Sources/SqlDatabase.TestApi/TextExtensions.cs index 6353f3ca..a70c8949 100644 --- a/Sources/SqlDatabase.Test/TestApi/TextExtensions.cs +++ b/Sources/SqlDatabase.TestApi/TextExtensions.cs @@ -4,7 +4,7 @@ namespace SqlDatabase.TestApi; -internal static class TextExtensions +public static class TextExtensions { public static Func AsFuncStream(this string text) { diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index 0c472c5c..bd2d15e1 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -44,6 +44,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence", "Sql EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence.Test", "SqlDatabase.Sequence.Test\SqlDatabase.Sequence.Test.csproj", "{1C4B4036-9C17-49AD-B087-A4D044296D1A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MsSql", "SqlDatabase.Adapter.MsSql\SqlDatabase.Adapter.MsSql.csproj", "{D45B3C71-75DF-4613-B0CD-356C7998BE27}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MsSql.Test", "SqlDatabase.Adapter.MsSql.Test\SqlDatabase.Adapter.MsSql.Test.csproj", "{93FBF3ED-A6F3-4EBF-8779-A398D6654C03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql", "SqlDatabase.Adapter.Sql\SqlDatabase.Adapter.Sql.csproj", "{267D99B6-4882-4ECE-8EEC-A15216D97692}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql.Test", "SqlDatabase.Adapter.Sql.Test\SqlDatabase.Adapter.Sql.Test.csproj", "{74003456-8C80-402A-AD68-24B02350ADDC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -114,6 +122,22 @@ Global {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Release|Any CPU.ActiveCfg = Release|Any CPU {1C4B4036-9C17-49AD-B087-A4D044296D1A}.Release|Any CPU.Build.0 = Release|Any CPU + {D45B3C71-75DF-4613-B0CD-356C7998BE27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D45B3C71-75DF-4613-B0CD-356C7998BE27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D45B3C71-75DF-4613-B0CD-356C7998BE27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D45B3C71-75DF-4613-B0CD-356C7998BE27}.Release|Any CPU.Build.0 = Release|Any CPU + {93FBF3ED-A6F3-4EBF-8779-A398D6654C03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93FBF3ED-A6F3-4EBF-8779-A398D6654C03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93FBF3ED-A6F3-4EBF-8779-A398D6654C03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93FBF3ED-A6F3-4EBF-8779-A398D6654C03}.Release|Any CPU.Build.0 = Release|Any CPU + {267D99B6-4882-4ECE-8EEC-A15216D97692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {267D99B6-4882-4ECE-8EEC-A15216D97692}.Debug|Any CPU.Build.0 = Debug|Any CPU + {267D99B6-4882-4ECE-8EEC-A15216D97692}.Release|Any CPU.ActiveCfg = Release|Any CPU + {267D99B6-4882-4ECE-8EEC-A15216D97692}.Release|Any CPU.Build.0 = Release|Any CPU + {74003456-8C80-402A-AD68-24B02350ADDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74003456-8C80-402A-AD68-24B02350ADDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74003456-8C80-402A-AD68-24B02350ADDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74003456-8C80-402A-AD68-24B02350ADDC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -127,6 +151,8 @@ Global {68DC9F11-567F-4A51-85E6-4C87994F9FFF} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {4539721A-947F-4AD1-B007-EE695761B8F9} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {1C4B4036-9C17-49AD-B087-A4D044296D1A} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {93FBF3ED-A6F3-4EBF-8779-A398D6654C03} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {74003456-8C80-402A-AD68-24B02350ADDC} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 277a47c0..904cef3a 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -3,7 +3,7 @@ using System.IO; using System.Text; using SqlDatabase.Adapter; -using SqlDatabase.Export; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Scripts; using SqlDatabase.Sequence; diff --git a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs index 95cdc030..1f4c45e7 100644 --- a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs +++ b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs @@ -4,6 +4,7 @@ using SqlDatabase.Adapter; using SqlDatabase.Adapter.AssemblyScripts; using SqlDatabase.Adapter.PowerShellScripts; +using SqlDatabase.Adapter.Sql; using SqlDatabase.FileSystem; using SqlDatabase.Scripts; using SqlDatabase.Sequence; @@ -166,7 +167,7 @@ private ScriptResolver CreateScriptResolver() { var factories = new List(3); - factories.Add(new SqlScriptFactory(BuildDatabase().Adapter.CreateSqlTextReader())); + factories.Add(new TextScriptFactory(BuildDatabase().Adapter.CreateSqlTextReader())); if (_powerShellScript != null) { @@ -200,24 +201,4 @@ private ILogger GetLogger() return _logger; } - - private sealed class SqlScriptFactory : IScriptFactory - { - private readonly ISqlTextReader _textReader; - - public SqlScriptFactory(ISqlTextReader textReader) - { - _textReader = textReader; - } - - public bool IsSupported(IFile file) - { - return ".sql".Equals(file.Extension, StringComparison.OrdinalIgnoreCase); - } - - public IScript FromFile(IFile file) - { - return new TextScript(file.Name, file.OpenRead, _textReader); - } - } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs index f66363c3..e968de25 100644 --- a/Sources/SqlDatabase/Configuration/ExportCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExportCommandLine.cs @@ -1,8 +1,8 @@ using System; using System.IO; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Commands; -using SqlDatabase.Export; namespace SqlDatabase.Configuration; diff --git a/Sources/SqlDatabase/Scripts/Database.cs b/Sources/SqlDatabase/Scripts/Database.cs index a47e8e53..32866d4e 100644 --- a/Sources/SqlDatabase/Scripts/Database.cs +++ b/Sources/SqlDatabase/Scripts/Database.cs @@ -3,6 +3,7 @@ using System.Data; using System.Data.Common; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.Sql; using SqlDatabase.Configuration; namespace SqlDatabase.Scripts; diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index 00b5b71e..f3985fbf 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -2,12 +2,11 @@ using System.Collections.Generic; using System.Configuration; using System.Data.Common; -using System.Data.SqlClient; using MySqlConnector; using Npgsql; using SqlDatabase.Adapter; +using SqlDatabase.Adapter.MsSql; using SqlDatabase.Configuration; -using SqlDatabase.Scripts.MsSql; using SqlDatabase.Scripts.MySql; using SqlDatabase.Scripts.PgSql; @@ -20,7 +19,7 @@ public static IDatabaseAdapter CreateAdapter(string connectionString, AppConfigu // connection strings are compatible var factories = new List>(3); - if (CanBe(connectionString, "Data Source", "Initial Catalog")) + if (MsSqlDatabaseAdapterFactory.CanBe(connectionString)) { factories.Add(CreateMsSql); } @@ -45,7 +44,19 @@ public static IDatabaseAdapter CreateAdapter(string connectionString, AppConfigu private static IDatabaseAdapter CreateMsSql(string connectionString, AppConfiguration configuration, ILogger log) { - return new MsSqlDatabaseAdapter(connectionString, configuration, log); + var getCurrentVersionScript = configuration.MsSql.GetCurrentVersionScript; + if (string.IsNullOrWhiteSpace(getCurrentVersionScript)) + { + getCurrentVersionScript = configuration.GetCurrentVersionScript; + } + + var setCurrentVersionScript = configuration.MsSql.SetCurrentVersionScript; + if (string.IsNullOrWhiteSpace(setCurrentVersionScript)) + { + setCurrentVersionScript = configuration.SetCurrentVersionScript; + } + + return MsSqlDatabaseAdapterFactory.CreateAdapter(connectionString, getCurrentVersionScript, setCurrentVersionScript, log); } private static IDatabaseAdapter CreatePgSql(string connectionString, AppConfiguration configuration, ILogger log) diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs index 8bf25d78..b9773b86 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs @@ -3,7 +3,6 @@ using MySqlConnector; using SqlDatabase.Adapter; using SqlDatabase.Configuration; -using SqlDatabase.Export; namespace SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs index 68c714f8..796e3f4a 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs b/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs index 15b53fa7..3f8af255 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs +++ b/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs @@ -4,7 +4,7 @@ using System.IO; using System.Linq; using System.Text; -using SqlDatabase.Export; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.MySql; diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs index a96f0af3..d8367e40 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs @@ -3,7 +3,6 @@ using Npgsql; using SqlDatabase.Adapter; using SqlDatabase.Configuration; -using SqlDatabase.Export; namespace SqlDatabase.Scripts.PgSql; diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs index d549258f..06422b19 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PgSql; diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs b/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs index d45f78ac..fa675aa1 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs +++ b/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs @@ -9,7 +9,7 @@ using System.Reflection; using System.Text; using NpgsqlTypes; -using SqlDatabase.Export; +using SqlDatabase.Adapter; namespace SqlDatabase.Scripts.PgSql; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 23849d65..dbd0cf1d 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -18,8 +18,6 @@ - - @@ -29,7 +27,9 @@ + + From 1219fd477a20381c3360ca6d803a00bb800f83ea Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Tue, 7 Nov 2023 17:36:11 +0100 Subject: [PATCH 19/38] SqlDatabase.Adapter.PgSql --- .../SqlDatabase.Adapter.MsSql.Test.csproj | 6 - ...apter.MsSql.Test.dll.config => app.config} | 0 .../MsSqlDatabaseAdapterFactory.cs | 2 +- .../PgSqlDataExporterTest.cs | 9 +- .../PgSqlDatabaseAdapterTest.cs | 21 +- .../PgSqlQuery.cs | 12 +- .../PgSqlTextReaderTest.cs | 2 +- .../PgSqlWriterTest.cs | 5 +- .../SqlDatabase.Adapter.PgSql.Test.csproj | 20 ++ .../TextScriptOutputPgSqlTest.cs | 3 +- .../SqlDatabase.Adapter.PgSql.Test/app.config | 7 + .../PgSqlDatabaseAdapter.cs | 56 +--- .../PgSqlDatabaseAdapterFactory.cs | 51 ++++ .../PgSqlDefaults.cs | 7 + .../PgSqlTextReader.cs | 3 +- .../PgSqlWriter.cs | 7 +- .../Properties/AssemblyInfo.cs | 4 + .../SqlDatabase.Adapter.PgSql.csproj | 15 + .../IntegrationTests/PgSql/ProgramTest.cs | 275 ------------------ .../Scripts/DatabaseAdapterFactoryTest.cs | 10 +- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 4 + Sources/SqlDatabase.sln | 13 + .../Scripts/DatabaseAdapterFactory.cs | 7 +- Sources/SqlDatabase/SqlDatabase.csproj | 2 +- 24 files changed, 171 insertions(+), 370 deletions(-) rename Sources/SqlDatabase.Adapter.MsSql.Test/{SqlDatabase.Adapter.MsSql.Test.dll.config => app.config} (100%) rename Sources/{SqlDatabase.Test/Export => SqlDatabase.Adapter.PgSql.Test}/PgSqlDataExporterTest.cs (98%) rename Sources/{SqlDatabase.Test/Scripts/PgSql => SqlDatabase.Adapter.PgSql.Test}/PgSqlDatabaseAdapterTest.cs (89%) rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.Adapter.PgSql.Test}/PgSqlQuery.cs (58%) rename Sources/{SqlDatabase.Test/Scripts/PgSql => SqlDatabase.Adapter.PgSql.Test}/PgSqlTextReaderTest.cs (95%) rename Sources/{SqlDatabase.Test/Scripts/PgSql => SqlDatabase.Adapter.PgSql.Test}/PgSqlWriterTest.cs (96%) create mode 100644 Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj rename Sources/{SqlDatabase.Test/Scripts/PgSql => SqlDatabase.Adapter.PgSql.Test}/TextScriptOutputPgSqlTest.cs (98%) create mode 100644 Sources/SqlDatabase.Adapter.PgSql.Test/app.config rename Sources/{SqlDatabase/Scripts/PgSql => SqlDatabase.Adapter.PgSql}/PgSqlDatabaseAdapter.cs (53%) create mode 100644 Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapterFactory.cs create mode 100644 Sources/SqlDatabase.Adapter.PgSql/PgSqlDefaults.cs rename Sources/{SqlDatabase/Scripts/PgSql => SqlDatabase.Adapter.PgSql}/PgSqlTextReader.cs (95%) rename Sources/{SqlDatabase/Scripts/PgSql => SqlDatabase.Adapter.PgSql}/PgSqlWriter.cs (98%) create mode 100644 Sources/SqlDatabase.Adapter.PgSql/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Adapter.PgSql/SqlDatabase.Adapter.PgSql.csproj delete mode 100644 Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj index 6db2c8c8..72338b3a 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj @@ -18,12 +18,6 @@ - - - Always - - - diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config b/Sources/SqlDatabase.Adapter.MsSql.Test/app.config similarity index 100% rename from Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.dll.config rename to Sources/SqlDatabase.Adapter.MsSql.Test/app.config diff --git a/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs index f5107a2d..dc499f62 100644 --- a/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase.Adapter.MsSql/MsSqlDatabaseAdapterFactory.cs @@ -14,7 +14,7 @@ public static bool CanBe(string connectionString) } var builder = new DbConnectionStringBuilder(false) { ConnectionString = connectionString }; - return builder.ContainsKey("Data Source") || builder.ContainsKey("Initial Catalog"); + return builder.ContainsKey("Data Source") && builder.ContainsKey("Initial Catalog"); } public static IDatabaseAdapter CreateAdapter( diff --git a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs index ca9caa4c..19020754 100644 --- a/Sources/SqlDatabase.Test/Export/PgSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs @@ -9,12 +9,9 @@ using NpgsqlTypes; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; using SqlDatabase.Adapter.Sql.Export; -using SqlDatabase.Scripts.PgSql; -using SqlDatabase.TestApi; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.PgSql; [TestFixture] public class PgSqlDataExporterTest @@ -62,7 +59,7 @@ public void Export(string dataType, object minValue, object maxValue, bool allow script.Text("SELECT * FROM input_data;"); - using (var connection = new NpgsqlConnection(PgSqlQuery.ConnectionString)) + using (var connection = new NpgsqlConnection(PgSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = sql.ToString(); @@ -79,7 +76,7 @@ public void Export(string dataType, object minValue, object maxValue, bool allow exportSql.ShouldContain(" " + (expectedDataType ?? dataType) + " "); - using (var connection = new NpgsqlConnection(PgSqlQuery.ConnectionString)) + using (var connection = new NpgsqlConnection(PgSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) { cmd.CommandText = exportSql.Replace("CREATE TABLE", "CREATE TEMP TABLE") + "\r\n\r\nSELECT * FROM test_data;"; diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs similarity index 89% rename from Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs index c7621f15..5ec51996 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs @@ -4,11 +4,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; [TestFixture] public class PgSqlDatabaseAdapterTest @@ -18,7 +15,6 @@ public class PgSqlDatabaseAdapterTest private const string UpdateModuleVersion = "UPDATE public.version SET version='{{TargetVersion}}' WHERE module_name = '{{ModuleName}}'"; private PgSqlDatabaseAdapter _sut = null!; - private AppConfiguration _configuration = null!; private IList _logOutput = null!; [SetUp] @@ -34,9 +30,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _configuration = new AppConfiguration(); - - _sut = new PgSqlDatabaseAdapter(PgSqlQuery.ConnectionString, _configuration, log.Object); + _sut = new PgSqlDatabaseAdapter(PgSqlQuery.GetConnectionString(), null!, null!, log.Object); } [Test] @@ -131,8 +125,11 @@ public void SqlOutputIntoLog() [Test] public void GetSetVersionScriptDefault() { - _sut.GetVersionSelectScript().ShouldBe(PgSqlDatabaseAdapter.DefaultSelectVersion); - _sut.GetVersionUpdateScript().ShouldBe(PgSqlDatabaseAdapter.DefaultUpdateVersion); + _sut.GetCurrentVersionScript = PgSqlDefaults.DefaultSelectVersion; + _sut.SetCurrentVersionScript = PgSqlDefaults.DefaultUpdateVersion; + + _sut.GetVersionSelectScript().ShouldBe(PgSqlDefaults.DefaultSelectVersion); + _sut.GetVersionUpdateScript().ShouldBe(PgSqlDefaults.DefaultUpdateVersion); using (var connection = _sut.CreateConnection(false)) { @@ -160,8 +157,8 @@ public void GetSetVersionScriptDefault() [Test] public void GetSetVersionScriptModuleName() { - _configuration.GetCurrentVersionScript = SelectModuleVersion; - _configuration.SetCurrentVersionScript = UpdateModuleVersion; + _sut.GetCurrentVersionScript = SelectModuleVersion; + _sut.SetCurrentVersionScript = UpdateModuleVersion; _sut.GetVersionSelectScript().ShouldBe(SelectModuleVersion); _sut.GetVersionUpdateScript().ShouldBe(UpdateModuleVersion); diff --git a/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs similarity index 58% rename from Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs index 908db6d7..24acb787 100644 --- a/Sources/SqlDatabase.Test/TestApi/PgSqlQuery.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs @@ -1,17 +1,19 @@ using System.Configuration; using Npgsql; +using SqlDatabase.TestApi; -namespace SqlDatabase.TestApi; +namespace SqlDatabase.Adapter.PgSql; internal static class PgSqlQuery { - public static string ConnectionString => ConfigurationManager.ConnectionStrings["pgsql"].ConnectionString; - - public static string DatabaseName => new NpgsqlConnectionStringBuilder(ConnectionString).Database; + public static string GetConnectionString() + { + return ConfigurationExtensions.GetConnectionString("pgsql"); + } public static NpgsqlConnection Open() { - var con = new NpgsqlConnection(ConnectionString); + var con = new NpgsqlConnection(GetConnectionString()); con.Open(); return con; diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlTextReaderTest.cs similarity index 95% rename from Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlTextReaderTest.cs index 3a2b5f44..fa1e62cb 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlTextReaderTest.cs @@ -2,7 +2,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; [TestFixture] public class PgSqlTextReaderTest diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs similarity index 96% rename from Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs index 691948ef..fa49820e 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/PgSqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs @@ -7,9 +7,8 @@ using NpgsqlTypes; using NUnit.Framework; using Shouldly; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; [TestFixture] public class PgSqlWriterTest @@ -129,7 +128,7 @@ public void ValueTsVector(string value) [TestCase("fat & (rat | cat)")] public void ValueTsQuery(string value) { - var expected = PgSqlQuery.ExecuteScalar("SELECT '{0}'::tsquery".FormatWith(value)).ShouldBeAssignableTo(); + var expected = PgSqlQuery.ExecuteScalar($"SELECT '{value}'::tsquery").ShouldBeAssignableTo(); _sut .Text("SELECT ") diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj new file mode 100644 index 00000000..235cbb24 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj @@ -0,0 +1,20 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.PgSql + ..\..\bin\Tests + + + + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs rename to Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs index 7944d5ec..c38c45c7 100644 --- a/Sources/SqlDatabase.Test/Scripts/PgSql/TextScriptOutputPgSqlTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs @@ -4,11 +4,10 @@ using Npgsql; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; [TestFixture] public class TextScriptOutputPgSqlTest diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/app.config b/Sources/SqlDatabase.Adapter.PgSql.Test/app.config new file mode 100644 index 00000000..022d7611 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/app.config @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapter.cs similarity index 53% rename from Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs rename to Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapter.cs index d8367e40..a82d4ca8 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapter.cs @@ -1,28 +1,24 @@ using System.Data; using System.IO; using Npgsql; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; internal sealed class PgSqlDatabaseAdapter : IDatabaseAdapter { - public const string DefaultSelectVersion = "SELECT version FROM public.version WHERE module_name = 'database'"; - public const string DefaultUpdateVersion = "UPDATE public.version SET version='{{TargetVersion}}' WHERE module_name = 'database'"; - private readonly string _connectionString; private readonly string _connectionStringMaster; - private readonly AppConfiguration _configuration; private readonly ILogger _log; private readonly NoticeEventHandler _onConnectionNotice; public PgSqlDatabaseAdapter( string connectionString, - AppConfiguration configuration, + string getCurrentVersionScript, + string setCurrentVersionScript, ILogger log) { - _configuration = configuration; + GetCurrentVersionScript = getCurrentVersionScript; + SetCurrentVersionScript = setCurrentVersionScript; _log = log; var builder = new NpgsqlConnectionStringBuilder(connectionString) @@ -42,10 +38,14 @@ public PgSqlDatabaseAdapter( public string DatabaseName { get; } + public string GetCurrentVersionScript { get; internal set; } + + public string SetCurrentVersionScript { get; internal set; } + public string GetUserFriendlyConnectionString() { var cs = new NpgsqlConnectionStringBuilder(_connectionString); - return "database [{0}] on [{1}]".FormatWith(cs.Database, cs.Host); + return $"database [{cs.Database}] on [{cs.Host}]"; } public ISqlTextReader CreateSqlTextReader() => new PgSqlTextReader(); @@ -64,42 +64,14 @@ public IDbConnection CreateConnection(bool switchToMaster) public string GetServerVersionSelectScript() => "SELECT version();"; - public string GetDatabaseExistsScript(string databaseName) => "SELECT 1 FROM PG_DATABASE WHERE LOWER(DATNAME) = LOWER('{0}')".FormatWith(databaseName); - - public string GetVersionSelectScript() - { - var script = _configuration.PgSql.GetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.GetCurrentVersionScript; - } + public string GetDatabaseExistsScript(string databaseName) => $"SELECT 1 FROM PG_DATABASE WHERE LOWER(DATNAME) = LOWER('{databaseName}')"; - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultSelectVersion; - } + public string GetVersionSelectScript() => GetCurrentVersionScript; - return script!; - } - - public string GetVersionUpdateScript() - { - var script = _configuration.PgSql.SetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.SetCurrentVersionScript; - } - - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultUpdateVersion; - } - - return script!; - } + public string GetVersionUpdateScript() => SetCurrentVersionScript; private void OnConnectionNotice(object sender, NpgsqlNoticeEventArgs e) { - _log.Info("{0}: {1}".FormatWith(e.Notice.Severity, e.Notice.MessageText)); + _log.Info($"{e.Notice.Severity}: {e.Notice.MessageText}"); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapterFactory.cs b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapterFactory.cs new file mode 100644 index 00000000..15d85c2b --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDatabaseAdapterFactory.cs @@ -0,0 +1,51 @@ +using System; +using System.Data.Common; +using Npgsql; + +namespace SqlDatabase.Adapter.PgSql; + +public static class PgSqlDatabaseAdapterFactory +{ + public static bool CanBe(string connectionString) + { + if (!IsPgSql(connectionString)) + { + return false; + } + + var builder = new DbConnectionStringBuilder(false) { ConnectionString = connectionString }; + return builder.ContainsKey("Host") && builder.ContainsKey("Database"); + } + + public static IDatabaseAdapter CreateAdapter( + string connectionString, + string? getCurrentVersionScript, + string? setCurrentVersionScript, + ILogger log) + { + return new PgSqlDatabaseAdapter( + connectionString, + string.IsNullOrWhiteSpace(getCurrentVersionScript) ? PgSqlDefaults.DefaultSelectVersion : getCurrentVersionScript!, + string.IsNullOrWhiteSpace(setCurrentVersionScript) ? PgSqlDefaults.DefaultUpdateVersion : setCurrentVersionScript!, + log); + } + + private static bool IsPgSql(string connectionString) + { + var builder = new NpgsqlConnectionStringBuilder(); + + try + { + builder.ConnectionString = connectionString; + return true; + } + catch (ArgumentException) + { + return false; + } + catch (FormatException) + { + return false; + } + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.PgSql/PgSqlDefaults.cs b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDefaults.cs new file mode 100644 index 00000000..41f07f9f --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql/PgSqlDefaults.cs @@ -0,0 +1,7 @@ +namespace SqlDatabase.Adapter.PgSql; + +internal static class PgSqlDefaults +{ + public const string DefaultSelectVersion = "SELECT version FROM public.version WHERE module_name = 'database'"; + public const string DefaultUpdateVersion = "UPDATE public.version SET version='{{TargetVersion}}' WHERE module_name = 'database'"; +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs b/Sources/SqlDatabase.Adapter.PgSql/PgSqlTextReader.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs rename to Sources/SqlDatabase.Adapter.PgSql/PgSqlTextReader.cs index 06422b19..ffd84fee 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlTextReader.cs +++ b/Sources/SqlDatabase.Adapter.PgSql/PgSqlTextReader.cs @@ -3,9 +3,8 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; internal sealed class PgSqlTextReader : ISqlTextReader { diff --git a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs b/Sources/SqlDatabase.Adapter.PgSql/PgSqlWriter.cs similarity index 98% rename from Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs rename to Sources/SqlDatabase.Adapter.PgSql/PgSqlWriter.cs index fa675aa1..43c4e283 100644 --- a/Sources/SqlDatabase/Scripts/PgSql/PgSqlWriter.cs +++ b/Sources/SqlDatabase.Adapter.PgSql/PgSqlWriter.cs @@ -9,9 +9,8 @@ using System.Reflection; using System.Text; using NpgsqlTypes; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.PgSql; +namespace SqlDatabase.Adapter.PgSql; internal sealed class PgSqlWriter : SqlWriterBase { @@ -49,7 +48,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, case "TIME": if (scale != 0) { - sizeText = "{0},{1}".FormatWith(precision, scale); + sizeText = $"{precision},{scale}"; } else if (precision != 0) { @@ -223,7 +222,7 @@ protected override bool TryWriteValue(object value, string? typeNameHint) return true; } - throw new NotSupportedException("{0}d array is not supported.".FormatWith(array.Rank)); + throw new NotSupportedException($"{array.Rank}d array is not supported."); } if (value is ExpandoObject composite) diff --git a/Sources/SqlDatabase.Adapter.PgSql/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.PgSql/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..717827ba --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.PgSql.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.PgSql/SqlDatabase.Adapter.PgSql.csproj b/Sources/SqlDatabase.Adapter.PgSql/SqlDatabase.Adapter.PgSql.csproj new file mode 100644 index 00000000..75604752 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.PgSql/SqlDatabase.Adapter.PgSql.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0 + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs deleted file mode 100644 index bf8b4bbd..00000000 --- a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/ProgramTest.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using Dapper; -using Moq; -using Npgsql; -using NUnit.Framework; -using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.PgSql; -using SqlDatabase.TestApi; -using ConfigurationManager = System.Configuration.ConfigurationManager; - -namespace SqlDatabase.IntegrationTests.PgSql; - -[TestFixture] -public class ProgramTest -{ - private readonly string _connectionString = new NpgsqlConnectionStringBuilder(PgSqlQuery.ConnectionString) { Database = "sqldatabasetest_it" }.ToString(); - - private string _scriptsLocation = null!; - private AppConfiguration _configuration = null!; - private TempFile _logFile = null!; - - [SetUp] - public void BeforeEachTest() - { - _scriptsLocation = ConfigurationManager.AppSettings["PgSql.IntegrationTestsScriptsLocation"]!; - if (!Path.IsPathRooted(_scriptsLocation)) - { - _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); - } - - _configuration = new AppConfiguration(); - - _logFile = new TempFile(".log"); - } - - [TearDown] - public void AfterEachTest() - { - FileAssert.Exists(_logFile.Location); - var fileContent = File.ReadAllLines(_logFile.Location); - _logFile.Dispose(); - - fileContent.ShouldNotBeEmpty(); - } - - [Test] - [Order(1)] - - public void CreateDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandCreate) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "new")) - .SetVariable("JohnCity", "London") - .SetVariable("MariaCity", "Paris") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - - const string Sql = @" -SELECT person.id, person.name, person_address.city -FROM demo.person person - INNER JOIN demo.person_address person_address ON (person_address.person_id = person.id) -ORDER BY person.id"; - - CreateDatabaseObject().GetCurrentVersion(null).ShouldBe(new Version("1.2")); - - using (var c = new NpgsqlConnection(_connectionString)) - { - c.Open(); - - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].id); - Assert.AreEqual("John", rows[0].name); - Assert.AreEqual("London", rows[0].city); - - Assert.AreEqual(2, rows[1].id); - Assert.AreEqual("Maria", rows[1].name); - Assert.AreEqual("Paris", rows[1].city); - } - } - - [Test] - [Order(2)] - public void UpgradeDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "upgrade")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "Upgrade", "SqlDatabase.exe.config")) - .SetVariable("JohnSecondName", "Smitt") - .SetVariable("MariaSecondName", "X") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - - const string Sql = @" -SELECT person.id, person.second_name -FROM demo.person person -ORDER BY person.id"; - - CreateDatabaseObject().GetCurrentVersion(null).ShouldBe(new Version("2.1")); - - using (var c = new NpgsqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].id); - Assert.AreEqual("Smitt", rows[0].second_name); - - Assert.AreEqual(2, rows[1].id); - Assert.AreEqual("X", rows[1].second_name); - } - } - - [Test] - [Order(3)] - public void UpgradeDatabaseModularity() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "UpgradeModularity")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "UpgradeModularity", "SqlDatabase.exe.config")) - .SetLogFileName(_logFile.Location); - - Program.Main(args.BuildArray()).ShouldBe(0); - - const string Sql = @" -SELECT p.name, a.city -FROM module_a.person p - LEFT JOIN module_b.person_address a ON a.person_id = p.id -ORDER BY p.name"; - - var configuration = new SqlDatabase.Configuration.ConfigurationManager(); - configuration.LoadFrom(args.Line.ConfigurationFile); - - var db = CreateDatabaseObject(configuration.SqlDatabase); - db.GetCurrentVersion("ModuleA").ShouldBe(new Version("2.0")); - db.GetCurrentVersion("ModuleB").ShouldBe(new Version("1.1")); - db.GetCurrentVersion("ModuleC").ShouldBe(new Version("2.0")); - - using (var c = new NpgsqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - rows.Count.ShouldBe(2); - - Assert.AreEqual("John", rows[0].name); - Assert.AreEqual("London", rows[0].city); - - Assert.AreEqual("Maria", rows[1].name); - Assert.IsNull(rows[1].city); - } - } - - [Test] - [Order(4)] - public void ExportDataToConsole() - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("public.exported_data1") - .BuildArray(); - - int exitCode; - string output; - using (var console = new TempConsoleOut()) - { - exitCode = Program.Main(args); - output = console.GetOutput(); - } - - Console.WriteLine(output); - exitCode.ShouldBe(0); - - // exec - InvokeExecuteCommand(b => b.SetInLineScript(output)); - - // test - using (var c = new NpgsqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM public.exported_data1"); - test.ShouldBe(2); - } - } - - [Test] - [Order(5)] - public void ExportDataToFile() - { - using (var output = new TempFile(".sql")) - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("public.exported_data2") - .SetExportToFile(output.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - Console.WriteLine(File.ReadAllText(output.Location)); - - // exec - InvokeExecuteCommand(b => b.SetScripts(output.Location)); - } - - // test - using (var c = new NpgsqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM public.exported_data2"); - test.ShouldBe(2); - } - } - - [Test] - [Order(6)] - public void ExecuteScript() - { - InvokeExecuteCommand(b => - b.SetScripts(Path.Combine(_scriptsLocation, "execute", "drop.database.ps1"))); - - var sql = "SELECT 1 FROM PG_DATABASE WHERE LOWER(DATNAME) = LOWER('{0}')".FormatWith(new NpgsqlConnectionStringBuilder(_connectionString).Database); - - using (var c = new NpgsqlConnection(PgSqlQuery.ConnectionString)) - { - c.Open(); - - var test = c.ExecuteScalar(sql); - Assert.IsNull(test); - } - } - - private void InvokeExecuteCommand(Action builder) - { - var cmd = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExecute) - .SetConnection(_connectionString) - .SetLogFileName(_logFile.Location); - - builder(cmd); - var args = cmd.BuildArray(); - - Program.Main(args).ShouldBe(0); - } - - private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) - { - var log = new Mock(MockBehavior.Strict).Object; - var adapter = new PgSqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); - return new Database(adapter, log, TransactionMode.None, false); - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index 34e0827c..372a4e0e 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -1,12 +1,10 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Moq; using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; using SqlDatabase.Configuration; using SqlDatabase.Scripts.MySql; -using SqlDatabase.Scripts.PgSql; using SqlDatabase.TestApi; namespace SqlDatabase.Scripts; @@ -45,9 +43,9 @@ private static IEnumerable GetCreateAdapterCases() }; yield return new TestCaseData( - PgSqlQuery.ConnectionString, - PgSqlQuery.DatabaseName, - nameof(PgSqlDatabaseAdapter)) + "Host=localhost;Database=sqldatabasetest;", + "sqldatabasetest", + "PgSqlDatabaseAdapter") { TestName = "PgSql" }; diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 9baa63f3..48dbe99c 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -31,5 +31,9 @@ + + + + diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index bd2d15e1..e1588c5e 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -52,6 +52,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql.Test", "SqlDatabase.Adapter.Sql.Test\SqlDatabase.Adapter.Sql.Test.csproj", "{74003456-8C80-402A-AD68-24B02350ADDC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql", "SqlDatabase.Adapter.PgSql\SqlDatabase.Adapter.PgSql.csproj", "{B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql.Test", "SqlDatabase.Adapter.PgSql.Test\SqlDatabase.Adapter.PgSql.Test.csproj", "{33749EF7-49CE-4564-BF9D-5713806CC646}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -138,6 +142,14 @@ Global {74003456-8C80-402A-AD68-24B02350ADDC}.Debug|Any CPU.Build.0 = Debug|Any CPU {74003456-8C80-402A-AD68-24B02350ADDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {74003456-8C80-402A-AD68-24B02350ADDC}.Release|Any CPU.Build.0 = Release|Any CPU + {B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}.Release|Any CPU.Build.0 = Release|Any CPU + {33749EF7-49CE-4564-BF9D-5713806CC646}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33749EF7-49CE-4564-BF9D-5713806CC646}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33749EF7-49CE-4564-BF9D-5713806CC646}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33749EF7-49CE-4564-BF9D-5713806CC646}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -153,6 +165,7 @@ Global {1C4B4036-9C17-49AD-B087-A4D044296D1A} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {93FBF3ED-A6F3-4EBF-8779-A398D6654C03} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {74003456-8C80-402A-AD68-24B02350ADDC} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {33749EF7-49CE-4564-BF9D-5713806CC646} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index f3985fbf..4ed4cccb 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -3,12 +3,11 @@ using System.Configuration; using System.Data.Common; using MySqlConnector; -using Npgsql; using SqlDatabase.Adapter; using SqlDatabase.Adapter.MsSql; +using SqlDatabase.Adapter.PgSql; using SqlDatabase.Configuration; using SqlDatabase.Scripts.MySql; -using SqlDatabase.Scripts.PgSql; namespace SqlDatabase.Scripts; @@ -24,7 +23,7 @@ public static IDatabaseAdapter CreateAdapter(string connectionString, AppConfigu factories.Add(CreateMsSql); } - if (CanBe(connectionString, "Host", "Database")) + if (PgSqlDatabaseAdapterFactory.CanBe(connectionString)) { factories.Add(CreatePgSql); } @@ -61,7 +60,7 @@ private static IDatabaseAdapter CreateMsSql(string connectionString, AppConfigur private static IDatabaseAdapter CreatePgSql(string connectionString, AppConfiguration configuration, ILogger log) { - return new PgSqlDatabaseAdapter(connectionString, configuration, log); + return PgSqlDatabaseAdapterFactory.CreateAdapter(connectionString, configuration.PgSql.GetCurrentVersionScript, configuration.PgSql.SetCurrentVersionScript, log); } private static IDatabaseAdapter CreateMySql(string connectionString, AppConfiguration configuration, ILogger log) diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index dbd0cf1d..ae22130e 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -22,12 +22,12 @@ - + From fb4d359641099fed44303c39ac6bcc06206fa647 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Wed, 8 Nov 2023 04:36:46 +0100 Subject: [PATCH 20/38] SqlDatabase.Adapter.MySql --- .../MySqlDataExporterTest.cs | 5 +- .../MySqlDatabaseAdapterTest.cs | 21 +- .../MySqlQuery.cs | 15 +- .../MySqlTextReaderTest.cs | 2 +- .../MySqlWriterTest.cs | 3 +- .../SqlDatabase.Adapter.MySql.Test.csproj | 20 ++ .../TextScriptOutputMySqlTest.cs | 2 +- .../SqlDatabase.Adapter.MySql.Test/app.config | 7 + .../MySqlDatabaseAdapter.cs | 56 +--- .../MySqlDatabaseAdapterFactory.cs | 51 ++++ .../MySqlDefaults.cs | 7 + .../MySqlTextReader.cs | 3 +- .../MySqlWriter.cs | 7 +- .../Properties/AssemblyInfo.cs | 4 + .../SqlDatabase.Adapter.MySql.csproj | 15 + .../PgSqlQuery.cs | 3 +- Sources/SqlDatabase.Test/Export/notes.txt | 60 ---- .../IntegrationTests/MySql/ProgramTest.cs | 275 ------------------ .../Scripts/DatabaseAdapterFactoryTest.cs | 8 +- .../SqlDatabase.Test/SqlDatabase.Test.csproj | 14 +- Sources/SqlDatabase.Test/app.config | 19 -- Sources/SqlDatabase.sln | 13 + .../Scripts/DatabaseAdapterFactory.cs | 48 +-- Sources/SqlDatabase/SqlDatabase.csproj | 5 +- 24 files changed, 171 insertions(+), 492 deletions(-) rename Sources/{SqlDatabase.Test/Export => SqlDatabase.Adapter.MySql.Test}/MySqlDataExporterTest.cs (98%) rename Sources/{SqlDatabase.Test/Scripts/MySql => SqlDatabase.Adapter.MySql.Test}/MySqlDatabaseAdapterTest.cs (89%) rename Sources/{SqlDatabase.Test/TestApi => SqlDatabase.Adapter.MySql.Test}/MySqlQuery.cs (52%) rename Sources/{SqlDatabase.Test/Scripts/MySql => SqlDatabase.Adapter.MySql.Test}/MySqlTextReaderTest.cs (95%) rename Sources/{SqlDatabase.Test/Scripts/MySql => SqlDatabase.Adapter.MySql.Test}/MySqlWriterTest.cs (92%) create mode 100644 Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj rename Sources/{SqlDatabase.Test/Scripts/MySql => SqlDatabase.Adapter.MySql.Test}/TextScriptOutputMySqlTest.cs (99%) create mode 100644 Sources/SqlDatabase.Adapter.MySql.Test/app.config rename Sources/{SqlDatabase/Scripts/MySql => SqlDatabase.Adapter.MySql}/MySqlDatabaseAdapter.cs (55%) create mode 100644 Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapterFactory.cs create mode 100644 Sources/SqlDatabase.Adapter.MySql/MySqlDefaults.cs rename Sources/{SqlDatabase/Scripts/MySql => SqlDatabase.Adapter.MySql}/MySqlTextReader.cs (95%) rename Sources/{SqlDatabase/Scripts/MySql => SqlDatabase.Adapter.MySql}/MySqlWriter.cs (97%) create mode 100644 Sources/SqlDatabase.Adapter.MySql/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Adapter.MySql/SqlDatabase.Adapter.MySql.csproj delete mode 100644 Sources/SqlDatabase.Test/Export/notes.txt delete mode 100644 Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs diff --git a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs similarity index 98% rename from Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs index 37e1c58a..6ceaa19d 100644 --- a/Sources/SqlDatabase.Test/Export/MySqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs @@ -5,12 +5,9 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; using SqlDatabase.Adapter.Sql.Export; -using SqlDatabase.Scripts.MySql; -using SqlDatabase.TestApi; -namespace SqlDatabase.Export; +namespace SqlDatabase.Adapter.MySql; [TestFixture] public class MySqlDataExporterTest diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs similarity index 89% rename from Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs index 498ee3c7..57af97a9 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs @@ -4,11 +4,8 @@ using Moq; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; [TestFixture] public class MySqlDatabaseAdapterTest @@ -18,7 +15,6 @@ public class MySqlDatabaseAdapterTest private const string UpdateModuleVersion = "UPDATE version SET version='{{TargetVersion}}' WHERE module_name = '{{ModuleName}}'"; private MySqlDatabaseAdapter _sut = null!; - private AppConfiguration _configuration = null!; private IList _logOutput = null!; [SetUp] @@ -34,9 +30,7 @@ public void BeforeEachTest() _logOutput.Add(m); }); - _configuration = new AppConfiguration(); - - _sut = new MySqlDatabaseAdapter(MySqlQuery.ConnectionString, _configuration, log.Object); + _sut = new MySqlDatabaseAdapter(MySqlQuery.GetConnectionString(), null!, null!, log.Object); } [Test] @@ -126,8 +120,11 @@ public void SqlOutputIntoLog() [Test] public void GetSetVersionScriptDefault() { - _sut.GetVersionSelectScript().ShouldBe(MySqlDatabaseAdapter.DefaultSelectVersion); - _sut.GetVersionUpdateScript().ShouldBe(MySqlDatabaseAdapter.DefaultUpdateVersion); + _sut.GetCurrentVersionScript = MySqlDefaults.DefaultSelectVersion; + _sut.SetCurrentVersionScript = MySqlDefaults.DefaultUpdateVersion; + + _sut.GetVersionSelectScript().ShouldBe(MySqlDefaults.DefaultSelectVersion); + _sut.GetVersionUpdateScript().ShouldBe(MySqlDefaults.DefaultUpdateVersion); using (var connection = _sut.CreateConnection(false)) { @@ -155,8 +152,8 @@ public void GetSetVersionScriptDefault() [Test] public void GetSetVersionScriptModuleName() { - _configuration.GetCurrentVersionScript = SelectModuleVersion; - _configuration.SetCurrentVersionScript = UpdateModuleVersion; + _sut.GetCurrentVersionScript = SelectModuleVersion; + _sut.SetCurrentVersionScript = UpdateModuleVersion; _sut.GetVersionSelectScript().ShouldBe(SelectModuleVersion); _sut.GetVersionUpdateScript().ShouldBe(UpdateModuleVersion); diff --git a/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlQuery.cs similarity index 52% rename from Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/MySqlQuery.cs index bf1bdd4c..7b749568 100644 --- a/Sources/SqlDatabase.Test/TestApi/MySqlQuery.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlQuery.cs @@ -1,17 +1,18 @@ -using System.Configuration; -using MySqlConnector; +using MySqlConnector; +using SqlDatabase.TestApi; -namespace SqlDatabase.TestApi; +namespace SqlDatabase.Adapter.MySql; internal static class MySqlQuery { - public static string ConnectionString => ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; - - public static string DatabaseName => new MySqlConnectionStringBuilder(ConnectionString).Database; + public static string GetConnectionString() + { + return ConfigurationExtensions.GetConnectionString("mysql"); + } public static MySqlConnection Open() { - var con = new MySqlConnection(ConnectionString); + var con = new MySqlConnection(GetConnectionString()); con.Open(); return con; diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlTextReaderTest.cs similarity index 95% rename from Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/MySqlTextReaderTest.cs index 906cab30..58d71a68 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlTextReaderTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlTextReaderTest.cs @@ -2,7 +2,7 @@ using Shouldly; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; [TestFixture] public class MySqlTextReaderTest diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs similarity index 92% rename from Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs index 2cbbc8a4..daa00579 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/MySqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs @@ -3,9 +3,8 @@ using System.Text; using NUnit.Framework; using Shouldly; -using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; [TestFixture] public class MySqlWriterTest diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj new file mode 100644 index 00000000..e5e018bb --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj @@ -0,0 +1,20 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Adapter.MySql + ..\..\bin\Tests + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs similarity index 99% rename from Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs rename to Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs index 309ad1e9..9f67aba8 100644 --- a/Sources/SqlDatabase.Test/Scripts/MySql/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs @@ -8,7 +8,7 @@ using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; [TestFixture] public class TextScriptOutputMySqlTest diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/app.config b/Sources/SqlDatabase.Adapter.MySql.Test/app.config new file mode 100644 index 00000000..3b818a59 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql.Test/app.config @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs b/Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapter.cs similarity index 55% rename from Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs rename to Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapter.cs index b9773b86..08772aae 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlDatabaseAdapter.cs +++ b/Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapter.cs @@ -1,28 +1,24 @@ using System.Data; using System.IO; using MySqlConnector; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; internal sealed class MySqlDatabaseAdapter : IDatabaseAdapter { - public const string DefaultSelectVersion = "SELECT version FROM version WHERE module_name = 'database'"; - public const string DefaultUpdateVersion = "UPDATE version SET version='{{TargetVersion}}' WHERE module_name = 'database'"; - private readonly string _connectionString; private readonly string _connectionStringMaster; - private readonly AppConfiguration _configuration; private readonly ILogger _log; private readonly MySqlInfoMessageEventHandler _onConnectionInfoMessage; public MySqlDatabaseAdapter( string connectionString, - AppConfiguration configuration, + string getCurrentVersionScript, + string setCurrentVersionScript, ILogger log) { - _configuration = configuration; + GetCurrentVersionScript = getCurrentVersionScript; + SetCurrentVersionScript = setCurrentVersionScript; _log = log; var builder = new MySqlConnectionStringBuilder(connectionString); @@ -38,10 +34,14 @@ public MySqlDatabaseAdapter( public string DatabaseName { get; } + public string GetCurrentVersionScript { get; internal set; } + + public string SetCurrentVersionScript { get; internal set; } + public string GetUserFriendlyConnectionString() { var cs = new MySqlConnectionStringBuilder(_connectionString); - return "database [{0}] on [{1}]".FormatWith(cs.Database, cs.Server); + return $"database [{cs.Database}] on [{cs.Server}]"; } public ISqlTextReader CreateSqlTextReader() => new MySqlTextReader(); @@ -60,46 +60,18 @@ public IDbConnection CreateConnection(bool switchToMaster) public string GetServerVersionSelectScript() => "SELECT concat(@@version_comment, ', ', version(), ', ', @@version_compile_os)"; - public string GetDatabaseExistsScript(string databaseName) => "SELECT 1 FROM information_schema.schemata WHERE LOWER(schema_name) = LOWER('{0}')".FormatWith(databaseName); - - public string GetVersionSelectScript() - { - var script = _configuration.MySql.GetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.GetCurrentVersionScript; - } + public string GetDatabaseExistsScript(string databaseName) => $"SELECT 1 FROM information_schema.schemata WHERE LOWER(schema_name) = LOWER('{databaseName}')"; - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultSelectVersion; - } + public string GetVersionSelectScript() => GetCurrentVersionScript; - return script!; - } - - public string GetVersionUpdateScript() - { - var script = _configuration.MySql.SetCurrentVersionScript; - if (string.IsNullOrWhiteSpace(script)) - { - script = _configuration.SetCurrentVersionScript; - } - - if (string.IsNullOrWhiteSpace(script)) - { - script = DefaultUpdateVersion; - } - - return script!; - } + public string GetVersionUpdateScript() => SetCurrentVersionScript; private void OnConnectionInfoMessage(object sender, MySqlInfoMessageEventArgs args) { for (var i = 0; i < args.Errors.Count; i++) { var error = args.Errors[i]; - _log.Info("{0}: {1}".FormatWith(error.Level, error.Message)); + _log.Info($"{error.Level}: {error.Message}"); } } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapterFactory.cs b/Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapterFactory.cs new file mode 100644 index 00000000..9645b99c --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql/MySqlDatabaseAdapterFactory.cs @@ -0,0 +1,51 @@ +using System; +using System.Data.Common; +using MySqlConnector; + +namespace SqlDatabase.Adapter.MySql; + +public static class MySqlDatabaseAdapterFactory +{ + public static bool CanBe(string connectionString) + { + if (!IsMsSql(connectionString)) + { + return false; + } + + var builder = new DbConnectionStringBuilder(false) { ConnectionString = connectionString }; + return builder.ContainsKey("Server") && builder.ContainsKey("Database"); + } + + public static IDatabaseAdapter CreateAdapter( + string connectionString, + string? getCurrentVersionScript, + string? setCurrentVersionScript, + ILogger log) + { + return new MySqlDatabaseAdapter( + connectionString, + string.IsNullOrWhiteSpace(getCurrentVersionScript) ? MySqlDefaults.DefaultSelectVersion : getCurrentVersionScript!, + string.IsNullOrWhiteSpace(setCurrentVersionScript) ? MySqlDefaults.DefaultUpdateVersion : setCurrentVersionScript!, + log); + } + + private static bool IsMsSql(string connectionString) + { + var builder = new MySqlConnectionStringBuilder(); + + try + { + builder.ConnectionString = connectionString; + return true; + } + catch (ArgumentException) + { + return false; + } + catch (FormatException) + { + return false; + } + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MySql/MySqlDefaults.cs b/Sources/SqlDatabase.Adapter.MySql/MySqlDefaults.cs new file mode 100644 index 00000000..8e0ea9c4 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql/MySqlDefaults.cs @@ -0,0 +1,7 @@ +namespace SqlDatabase.Adapter.MySql; + +internal static class MySqlDefaults +{ + public const string DefaultSelectVersion = "SELECT version FROM version WHERE module_name = 'database'"; + public const string DefaultUpdateVersion = "UPDATE version SET version='{{TargetVersion}}' WHERE module_name = 'database'"; +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs b/Sources/SqlDatabase.Adapter.MySql/MySqlTextReader.cs similarity index 95% rename from Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs rename to Sources/SqlDatabase.Adapter.MySql/MySqlTextReader.cs index 796e3f4a..d8de984d 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlTextReader.cs +++ b/Sources/SqlDatabase.Adapter.MySql/MySqlTextReader.cs @@ -3,9 +3,8 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; internal sealed class MySqlTextReader : ISqlTextReader { diff --git a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs b/Sources/SqlDatabase.Adapter.MySql/MySqlWriter.cs similarity index 97% rename from Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs rename to Sources/SqlDatabase.Adapter.MySql/MySqlWriter.cs index 3f8af255..9ce1136b 100644 --- a/Sources/SqlDatabase/Scripts/MySql/MySqlWriter.cs +++ b/Sources/SqlDatabase.Adapter.MySql/MySqlWriter.cs @@ -4,9 +4,8 @@ using System.IO; using System.Linq; using System.Text; -using SqlDatabase.Adapter; -namespace SqlDatabase.Scripts.MySql; +namespace SqlDatabase.Adapter.MySql; internal sealed class MySqlWriter : SqlWriterBase { @@ -59,7 +58,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, case "BIGINT UNSIGNED": if (size != 0) { - name = name.Insert(name.IndexOf(' '), "({0})".FormatWith(size)); + name = name.Insert(name.IndexOf(' '), $"({size})"); } break; @@ -67,7 +66,7 @@ public override SqlWriterBase DataType(string typeName, int size, int precision, case "NUMERIC": if (scale != 0) { - sizeText = "{0},{1}".FormatWith(precision, scale); + sizeText = $"{precision},{scale}"; } else if (precision != 0) { diff --git a/Sources/SqlDatabase.Adapter.MySql/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Adapter.MySql/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..58386af8 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Adapter.MySql.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.MySql/SqlDatabase.Adapter.MySql.csproj b/Sources/SqlDatabase.Adapter.MySql/SqlDatabase.Adapter.MySql.csproj new file mode 100644 index 00000000..fffa0e70 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.MySql/SqlDatabase.Adapter.MySql.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0 + + + + + + + + + + + diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs index 24acb787..18213be7 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlQuery.cs @@ -1,5 +1,4 @@ -using System.Configuration; -using Npgsql; +using Npgsql; using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.PgSql; diff --git a/Sources/SqlDatabase.Test/Export/notes.txt b/Sources/SqlDatabase.Test/Export/notes.txt deleted file mode 100644 index 7ac9205a..00000000 --- a/Sources/SqlDatabase.Test/Export/notes.txt +++ /dev/null @@ -1,60 +0,0 @@ -ColumnName: Id -ColumnOrdinal: 0 -DataTypeName: int -DataType: int32 -AllowDBNull: false -ColumnSize: 4 - - Key "DataTypeName" string - - [0] "ColumnName" string - [1] "ColumnOrdinal" string - [2] "ColumnSize" string - [3] "NumericPrecision" string - [4] "NumericScale" string - [5] "IsUnique" string - [6] "IsKey" string - [7] "BaseServerName" string - [8] "BaseCatalogName" string - [9] "BaseColumnName" string - [10] "BaseSchemaName" string - [11] "BaseTableName" string - [12] "DataType" string - [13] "AllowDBNull" string - [14] "ProviderType" string - [15] "IsAliased" string - [16] "IsExpression" string - [17] "IsIdentity" string - [18] "IsAutoIncrement" string - [19] "IsRowVersion" string - [20] "IsHidden" string - [21] "IsLong" string - [22] "IsReadOnly" string - [23] "ProviderSpecificDataType" string - [24] "DataTypeName" string - [25] "XmlSchemaCollectionDatabase" string - [26] "XmlSchemaCollectionOwningSchema" string - [27] "XmlSchemaCollectionName" string - [28] "UdtAssemblyQualifiedName" string - [29] "NonVersionedProviderType" string - [30] "IsColumnSet" string - ------------------------------------ - -ScriptFactory - SqlStringFile : IFileSystemInfo - File : IFileSystemInfo - ZipFile : IFileSystemInfo - -CommandFactory - string => ISystemInfo - sql string => SqlStringFile - -Database.Execute - IScript.Execute(command) - -Create/Update/Execute - IScript.Execute(command) - -Export - IScript.Export(command, TextWriter output) \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs b/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs deleted file mode 100644 index 40735909..00000000 --- a/Sources/SqlDatabase.Test/IntegrationTests/MySql/ProgramTest.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using Dapper; -using Moq; -using MySqlConnector; -using NUnit.Framework; -using Shouldly; -using SqlDatabase.Adapter; -using SqlDatabase.Configuration; -using SqlDatabase.Scripts; -using SqlDatabase.Scripts.MySql; -using SqlDatabase.TestApi; -using ConfigurationManager = System.Configuration.ConfigurationManager; - -namespace SqlDatabase.IntegrationTests.MySql; - -[TestFixture] -public class ProgramTest -{ - private readonly string _connectionString = new MySqlConnectionStringBuilder(MySqlQuery.ConnectionString) { Database = "sqldatabasetest_it" }.ToString(); - - private string _scriptsLocation = null!; - private AppConfiguration _configuration = null!; - private TempFile _logFile = null!; - - [SetUp] - public void BeforeEachTest() - { - _scriptsLocation = ConfigurationManager.AppSettings["MySql.IntegrationTestsScriptsLocation"]!; - if (!Path.IsPathRooted(_scriptsLocation)) - { - _scriptsLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _scriptsLocation); - } - - _configuration = new AppConfiguration(); - - _logFile = new TempFile(".log"); - } - - [TearDown] - public void AfterEachTest() - { - FileAssert.Exists(_logFile.Location); - var fileContent = File.ReadAllLines(_logFile.Location); - _logFile.Dispose(); - - fileContent.ShouldNotBeEmpty(); - } - - [Test] - [Order(1)] - - public void CreateDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandCreate) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "new")) - .SetVariable("JohnCity", "London") - .SetVariable("MariaCity", "Paris") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - - const string Sql = @" -SELECT person.id, person.name, person_address.city -FROM person person - INNER JOIN person_address person_address ON (person_address.person_id = person.id) -ORDER BY person.id"; - - CreateDatabaseObject().GetCurrentVersion(null).ShouldBe(new Version("1.2")); - - using (var c = new MySqlConnection(_connectionString)) - { - c.Open(); - - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].id); - Assert.AreEqual("John", rows[0].name); - Assert.AreEqual("London", rows[0].city); - - Assert.AreEqual(2, rows[1].id); - Assert.AreEqual("Maria", rows[1].name); - Assert.AreEqual("Paris", rows[1].city); - } - } - - [Test] - [Order(2)] - public void UpgradeDatabase() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "upgrade")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "Upgrade", "SqlDatabase.exe.config")) - .SetVariable("JohnSecondName", "Smitt") - .SetVariable("MariaSecondName", "X") - .SetLogFileName(_logFile.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - - const string Sql = @" -SELECT person.id, person.second_name -FROM person person -ORDER BY person.id"; - - CreateDatabaseObject().GetCurrentVersion(null).ShouldBe(new Version("2.1")); - - using (var c = new MySqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - Assert.AreEqual(2, rows.Count); - - Assert.AreEqual(1, rows[0].id); - Assert.AreEqual("Smitt", rows[0].second_name); - - Assert.AreEqual(2, rows[1].id); - Assert.AreEqual("X", rows[1].second_name); - } - } - - [Test] - [Order(3)] - public void UpgradeDatabaseModularity() - { - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandUpgrade) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, "UpgradeModularity")) - .SetConfigurationFile(Path.Combine(_scriptsLocation, "UpgradeModularity", "SqlDatabase.exe.config")) - .SetLogFileName(_logFile.Location); - - Program.Main(args.BuildArray()).ShouldBe(0); - - const string Sql = @" -SELECT p.name, a.city -FROM module_a_person p - LEFT JOIN module_b_person_address a ON a.person_id = p.id -ORDER BY p.name"; - - var configuration = new SqlDatabase.Configuration.ConfigurationManager(); - configuration.LoadFrom(args.Line.ConfigurationFile); - - var db = CreateDatabaseObject(configuration.SqlDatabase); - db.GetCurrentVersion("ModuleA").ShouldBe(new Version("2.0")); - db.GetCurrentVersion("ModuleB").ShouldBe(new Version("1.1")); - db.GetCurrentVersion("ModuleC").ShouldBe(new Version("2.0")); - - using (var c = new MySqlConnection(_connectionString)) - { - c.Open(); - var rows = c.Query(Sql).ToList(); - rows.Count.ShouldBe(2); - - Assert.AreEqual("John", rows[0].name); - Assert.AreEqual("London", rows[0].city); - - Assert.AreEqual("Maria", rows[1].name); - Assert.IsNull(rows[1].city); - } - } - - [Test] - [Order(4)] - public void ExportDataToConsole() - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("exported_data1") - .BuildArray(); - - int exitCode; - string output; - using (var console = new TempConsoleOut()) - { - exitCode = Program.Main(args); - output = console.GetOutput(); - } - - Console.WriteLine(output); - exitCode.ShouldBe(0); - - // exec - InvokeExecuteCommand(b => b.SetInLineScript(output)); - - // test - using (var c = new MySqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM exported_data1"); - test.ShouldBe(2); - } - } - - [Test] - [Order(5)] - public void ExportDataToFile() - { - using (var output = new TempFile(".sql")) - { - // export - var args = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExport) - .SetConnection(_connectionString) - .SetScripts(Path.Combine(_scriptsLocation, @"Export\export.sql")) - .SetExportToTable("exported_data2") - .SetExportToFile(output.Location) - .BuildArray(); - - Program.Main(args).ShouldBe(0); - Console.WriteLine(File.ReadAllText(output.Location)); - - // exec - InvokeExecuteCommand(b => b.SetScripts(output.Location)); - } - - // test - using (var c = new MySqlConnection(_connectionString)) - { - c.Open(); - - var test = c.ExecuteScalar("SELECT COUNT(1) FROM exported_data2"); - test.ShouldBe(2); - } - } - - [Test] - [Order(6)] - public void ExecuteScript() - { - InvokeExecuteCommand(b => - b.SetScripts(Path.Combine(_scriptsLocation, "execute", "drop.database.ps1"))); - - var sql = "SELECT 1 FROM information_schema.schemata WHERE LOWER(schema_name) = LOWER('{0}')".FormatWith(new MySqlConnectionStringBuilder(_connectionString).Database); - - using (var c = new MySqlConnection(MySqlQuery.ConnectionString)) - { - c.Open(); - - var test = c.ExecuteScalar(sql); - Assert.IsNull(test); - } - } - - private void InvokeExecuteCommand(Action builder) - { - var cmd = new GenericCommandLineBuilder() - .SetCommand(CommandLineFactory.CommandExecute) - .SetConnection(_connectionString) - .SetLogFileName(_logFile.Location); - - builder(cmd); - var args = cmd.BuildArray(); - - Program.Main(args).ShouldBe(0); - } - - private IDatabase CreateDatabaseObject(AppConfiguration? configuration = null) - { - var log = new Mock(MockBehavior.Strict).Object; - var adapter = new MySqlDatabaseAdapter(_connectionString, configuration ?? _configuration, log); - return new Database(adapter, log, TransactionMode.None, false); - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index 372a4e0e..f93d3973 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -4,8 +4,6 @@ using Shouldly; using SqlDatabase.Adapter; using SqlDatabase.Configuration; -using SqlDatabase.Scripts.MySql; -using SqlDatabase.TestApi; namespace SqlDatabase.Scripts; @@ -51,9 +49,9 @@ private static IEnumerable GetCreateAdapterCases() }; yield return new TestCaseData( - MySqlQuery.ConnectionString, - MySqlQuery.DatabaseName, - nameof(MySqlDatabaseAdapter)) + "Server=localhost;Database=sqldatabasetest", + "sqldatabasetest", + "MySqlDatabaseAdapter") { TestName = "MySql" }; diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 48dbe99c..0585f899 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -6,6 +6,12 @@ ..\..\bin\Tests + + + + + + @@ -27,13 +33,7 @@ - - - - - - - + diff --git a/Sources/SqlDatabase.Test/app.config b/Sources/SqlDatabase.Test/app.config index 18394b17..26185856 100644 --- a/Sources/SqlDatabase.Test/app.config +++ b/Sources/SqlDatabase.Test/app.config @@ -5,29 +5,10 @@ type="SqlDatabase.Configuration.AppConfiguration, SqlDatabase"/> - - - - - - - - - - - - - \ No newline at end of file diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index e1588c5e..259e9ff3 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -56,6 +56,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql.Test", "SqlDatabase.Adapter.PgSql.Test\SqlDatabase.Adapter.PgSql.Test.csproj", "{33749EF7-49CE-4564-BF9D-5713806CC646}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MySql", "SqlDatabase.Adapter.MySql\SqlDatabase.Adapter.MySql.csproj", "{49B103C8-958D-41B2-AB22-EDF029947AB1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MySql.Test", "SqlDatabase.Adapter.MySql.Test\SqlDatabase.Adapter.MySql.Test.csproj", "{D017ECF1-F2E3-4EAF-970B-F46991AD86F6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -150,6 +154,14 @@ Global {33749EF7-49CE-4564-BF9D-5713806CC646}.Debug|Any CPU.Build.0 = Debug|Any CPU {33749EF7-49CE-4564-BF9D-5713806CC646}.Release|Any CPU.ActiveCfg = Release|Any CPU {33749EF7-49CE-4564-BF9D-5713806CC646}.Release|Any CPU.Build.0 = Release|Any CPU + {49B103C8-958D-41B2-AB22-EDF029947AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49B103C8-958D-41B2-AB22-EDF029947AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49B103C8-958D-41B2-AB22-EDF029947AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49B103C8-958D-41B2-AB22-EDF029947AB1}.Release|Any CPU.Build.0 = Release|Any CPU + {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -166,6 +178,7 @@ Global {93FBF3ED-A6F3-4EBF-8779-A398D6654C03} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {74003456-8C80-402A-AD68-24B02350ADDC} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {33749EF7-49CE-4564-BF9D-5713806CC646} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {D017ECF1-F2E3-4EAF-970B-F46991AD86F6} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index 4ed4cccb..daa6c29c 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; using System.Configuration; -using System.Data.Common; -using MySqlConnector; using SqlDatabase.Adapter; using SqlDatabase.Adapter.MsSql; +using SqlDatabase.Adapter.MySql; using SqlDatabase.Adapter.PgSql; using SqlDatabase.Configuration; -using SqlDatabase.Scripts.MySql; namespace SqlDatabase.Scripts; @@ -28,7 +26,7 @@ public static IDatabaseAdapter CreateAdapter(string connectionString, AppConfigu factories.Add(CreatePgSql); } - if (CanBe(connectionString, "Server", "Database")) + if (MySqlDatabaseAdapterFactory.CanBe(connectionString)) { factories.Add(CreateMySql); } @@ -65,46 +63,6 @@ private static IDatabaseAdapter CreatePgSql(string connectionString, AppConfigur private static IDatabaseAdapter CreateMySql(string connectionString, AppConfiguration configuration, ILogger log) { - return new MySqlDatabaseAdapter(connectionString, configuration, log); - } - - private static bool CanBe(string connectionString, params string[] keywords) - where TBuilder : DbConnectionStringBuilder, new() - { - if (!Is(connectionString)) - { - return false; - } - - var test = new HashSet(keywords, StringComparer.OrdinalIgnoreCase); - - var pairs = connectionString.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - for (var i = 0; i < pairs.Length; i++) - { - var pair = pairs[i].Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries); - test.Remove(pair[0]); - } - - return test.Count == 0; - } - - private static bool Is(string connectionString) - where TBuilder : DbConnectionStringBuilder, new() - { - var builder = new TBuilder(); - - try - { - builder.ConnectionString = connectionString; - return true; - } - catch (ArgumentException) - { - } - catch (FormatException) - { - } - - return false; + return MySqlDatabaseAdapterFactory.CreateAdapter(connectionString, configuration.MySql.GetCurrentVersionScript, configuration.MySql.SetCurrentVersionScript, log); } } \ No newline at end of file diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index ae22130e..64e5fcad 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -20,13 +20,10 @@ - - - - + From ce80c88c10ace648887e9d84329dd9cc4968113f Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Wed, 8 Nov 2023 05:04:56 +0100 Subject: [PATCH 21/38] remove StringExtensions --- ...tabase.Adapter.AssemblyScripts.Test.csproj.user | 9 +++++++++ .../TestApi/SqlDatabaseCmdLetTest.cs | 2 +- .../SqlDatabase/Commands/DatabaseCreateCommand.cs | 6 +++--- .../SqlDatabase/Commands/DatabaseExecuteCommand.cs | 6 +++--- .../SqlDatabase/Commands/DatabaseExportCommand.cs | 6 +++--- .../SqlDatabase/Commands/DatabaseUpgradeCommand.cs | 8 ++++---- Sources/SqlDatabase/Configuration/Arg.cs | 2 +- .../SqlDatabase/Configuration/CommandLineBase.cs | 14 +++++++------- .../Configuration/CommandLineFactory.cs | 2 +- .../SqlDatabase/Configuration/CommandLineParser.cs | 2 +- .../Configuration/ConfigurationManager.cs | 4 ++-- .../Configuration/EnvironmentBuilder.cs | 6 +++--- .../Configuration/ExecuteCommandLine.cs | 2 +- .../Configuration/GenericCommandLineBuilder.cs | 6 +++--- .../Configuration/UpgradeCommandLine.cs | 2 +- Sources/SqlDatabase/Program.cs | 2 +- Sources/SqlDatabase/Scripts/Database.cs | 13 +++++-------- Sources/SqlDatabase/Scripts/ScriptResolver.cs | 2 +- Sources/SqlDatabase/StringExtensions.cs | 11 ----------- 19 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj.user delete mode 100644 Sources/SqlDatabase/StringExtensions.cs diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj.user b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj.user new file mode 100644 index 00000000..5cb47e2f --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj.user @@ -0,0 +1,9 @@ + + + + + + Component + + + \ No newline at end of file diff --git a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs index a28e9df6..1c4a1e6b 100644 --- a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs +++ b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs @@ -90,7 +90,7 @@ private static IEnumerable ResolveAliases() var cmdlet = (CmdletAttribute)typeof(TSubject).GetCustomAttribute(typeof(CmdletAttribute)); cmdlet.ShouldNotBeNull(); - yield return "{0}-{1}".FormatWith(cmdlet.VerbName, cmdlet.NounName); + yield return $"{cmdlet.VerbName}-{cmdlet.NounName}"; var alias = (AliasAttribute)typeof(TSubject).GetCustomAttribute(typeof(AliasAttribute)); if (alias != null) diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index 70e47dd2..db0c2b9d 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -25,7 +25,7 @@ public DatabaseCreateCommand( protected override void Greet(string databaseLocation) { - Log.Info("Create {0}".FormatWith(databaseLocation)); + Log.Info($"Create {databaseLocation}"); } protected override void ExecuteCore() @@ -41,14 +41,14 @@ protected override void ExecuteCore() foreach (var script in sequences) { var timer = Stopwatch.StartNew(); - Log.Info("execute {0} ...".FormatWith(script.DisplayName)); + Log.Info($"execute {script.DisplayName} ..."); using (Log.Indent()) { Database.Execute(script); } - Log.Info("done in {0}".FormatWith(timer.Elapsed)); + Log.Info($"done in {timer.Elapsed}"); } } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs index 57c88054..fba1f2cf 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExecuteCommand.cs @@ -24,7 +24,7 @@ public DatabaseExecuteCommand( protected override void Greet(string databaseLocation) { - Log.Info("Execute script on {0}".FormatWith(databaseLocation)); + Log.Info($"Execute script on {databaseLocation}"); } protected override void ExecuteCore() @@ -40,14 +40,14 @@ protected override void ExecuteCore() foreach (var script in sequences) { var timer = Stopwatch.StartNew(); - Log.Info("execute {0} ...".FormatWith(script.DisplayName)); + Log.Info($"execute {script.DisplayName} ..."); using (Log.Indent()) { Database.Execute(script); } - Log.Info("done in {0}".FormatWith(timer.Elapsed)); + Log.Info($"done in {timer.Elapsed}"); } } } \ No newline at end of file diff --git a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs index 904cef3a..82769fc0 100644 --- a/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseExportCommand.cs @@ -36,7 +36,7 @@ public DatabaseExportCommand( protected override void Greet(string databaseLocation) { - Log.Info("Export data from {0}".FormatWith(databaseLocation)); + Log.Info($"Export data from {databaseLocation}"); } protected override void ExecuteCore() @@ -65,14 +65,14 @@ protected override void ExecuteCore() foreach (var script in sequences) { var timer = Stopwatch.StartNew(); - Log.Info("export {0} ...".FormatWith(script.DisplayName)); + Log.Info($"export {script.DisplayName} ..."); using (Log.Indent()) { ExportScript(exporter, script, ref readerIndex); } - Log.Info("done in {0}".FormatWith(timer.Elapsed)); + Log.Info($"done in {timer.Elapsed}"); } } } diff --git a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs index 972129b5..fa0d8d6f 100644 --- a/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseUpgradeCommand.cs @@ -27,7 +27,7 @@ public DatabaseUpgradeCommand( protected override void Greet(string databaseLocation) { - Log.Info("Upgrade {0}".FormatWith(databaseLocation)); + Log.Info($"Upgrade {databaseLocation}"); } protected override void ExecuteCore() @@ -55,11 +55,11 @@ protected override void ExecuteCore() var timer = Stopwatch.StartNew(); if (string.IsNullOrEmpty(step.ModuleName)) { - Log.Info("execute {0} ...".FormatWith(step.Script.DisplayName)); + Log.Info($"execute {step.Script.DisplayName} ..."); } else { - Log.Info("execute {0} {1} ...".FormatWith(step.ModuleName, step.Script.DisplayName)); + Log.Info($"execute {step.ModuleName} {step.Script.DisplayName} ..."); } using (Log.Indent()) @@ -67,7 +67,7 @@ protected override void ExecuteCore() Database.Execute(step.Script, step.ModuleName, step.From, step.To); } - Log.Info("done in {0}".FormatWith(timer.Elapsed)); + Log.Info($"done in {timer.Elapsed}"); } } diff --git a/Sources/SqlDatabase/Configuration/Arg.cs b/Sources/SqlDatabase/Configuration/Arg.cs index 5145ed6b..8be89428 100644 --- a/Sources/SqlDatabase/Configuration/Arg.cs +++ b/Sources/SqlDatabase/Configuration/Arg.cs @@ -46,7 +46,7 @@ public Arg(string value) { if (IsPair) { - return "{0}={1}".FormatWith(Key, Value); + return $"{Key}={Value}"; } return Value; diff --git a/Sources/SqlDatabase/Configuration/CommandLineBase.cs b/Sources/SqlDatabase/Configuration/CommandLineBase.cs index 82fcc182..ad5d9ff2 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineBase.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineBase.cs @@ -27,12 +27,12 @@ public void Parse(CommandLine args) if (string.IsNullOrWhiteSpace(ConnectionString)) { - throw new InvalidCommandLineException("Options {0} is not specified.".FormatWith(Arg.Database)); + throw new InvalidCommandLineException($"Options {Arg.Database} is not specified."); } if (Scripts.Count == 0) { - throw new InvalidCommandLineException("Options {0} is not specified.".FormatWith(Arg.Scripts)); + throw new InvalidCommandLineException($"Options {Arg.Scripts} is not specified."); } Validate(); @@ -77,7 +77,7 @@ protected void SetInLineScript(string? value) } var index = Scripts.Count + 1; - var script = FileSystemFactory.FromContent("from{0}.sql".FormatWith(index), value!); + var script = FileSystemFactory.FromContent($"from{index}.sql", value!); Scripts.Add(script); } @@ -95,12 +95,12 @@ private void ApplyArg(Arg arg) } catch (Exception ex) { - throw new InvalidCommandLineException("Fail to parse option [{0}].".FormatWith(arg), ex); + throw new InvalidCommandLineException($"Fail to parse option [{arg}].", ex); } if (!isParsed) { - throw new InvalidCommandLineException("Unknown option [{0}].".FormatWith(arg)); + throw new InvalidCommandLineException($"Unknown option [{arg}]."); } } @@ -143,12 +143,12 @@ private void SetVariable(string? name, string? value) name = name?.Trim(); if (string.IsNullOrEmpty(name)) { - throw new InvalidCommandLineException(Arg.Variable, "Invalid variable name [{0}].".FormatWith(name)); + throw new InvalidCommandLineException(Arg.Variable, $"Invalid variable name [{name}]."); } if (Variables.ContainsKey(name!)) { - throw new InvalidCommandLineException(Arg.Variable, "Variable with name [{0}] is duplicated.".FormatWith(name)); + throw new InvalidCommandLineException(Arg.Variable, $"Variable with name [{name}] is duplicated."); } Variables.Add(name!, value ?? string.Empty); diff --git a/Sources/SqlDatabase/Configuration/CommandLineFactory.cs b/Sources/SqlDatabase/Configuration/CommandLineFactory.cs index 01c7ca31..1aa4aa41 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineFactory.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineFactory.cs @@ -35,7 +35,7 @@ public bool Bind() if (command == null) { - throw new InvalidCommandLineException("Unknown command [{0}].".FormatWith(ActiveCommandName)); + throw new InvalidCommandLineException($"Unknown command [{ActiveCommandName}]."); } commandArgs.RemoveAt(0); diff --git a/Sources/SqlDatabase/Configuration/CommandLineParser.cs b/Sources/SqlDatabase/Configuration/CommandLineParser.cs index b5bb4273..aec19af6 100644 --- a/Sources/SqlDatabase/Configuration/CommandLineParser.cs +++ b/Sources/SqlDatabase/Configuration/CommandLineParser.cs @@ -27,7 +27,7 @@ public CommandLine Parse(params string[] args) { if (!ParseArg(arg, out var value)) { - throw new InvalidCommandLineException("Invalid option [{0}].".FormatWith(arg)); + throw new InvalidCommandLineException($"Invalid option [{arg}]."); } if (!IsLog(value)) diff --git a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs index d2484d09..11e603a8 100644 --- a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs +++ b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs @@ -28,7 +28,7 @@ public void LoadFrom(string? configurationFile) } catch (Exception ex) when ((ex as IOException) == null) { - throw new ConfigurationErrorsException("Fail to load configuration from [{0}].".FormatWith(configurationFile), ex); + throw new ConfigurationErrorsException($"Fail to load configuration from [{configurationFile}].", ex); } } @@ -94,7 +94,7 @@ private static IFile ResolveFile(IFileSystemInfo info) if (file == null) { - throw new FileNotFoundException("Configuration file {0} not found in {1}.".FormatWith(fileName, info.Name)); + throw new FileNotFoundException($"Configuration file {fileName} not found in {info.Name}."); } } else diff --git a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs index 1f4c45e7..a7448e2b 100644 --- a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs +++ b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs @@ -147,17 +147,17 @@ private Database CreateDatabase() .GetNames() .OrderBy(i => i) .Where(i => !SqlScriptVariableParser.IsValidVariableName(i)) - .Select(i => "[{0}]".FormatWith(i)) + .Select(i => $"[{i}]") .ToList(); if (invalidNames.Count == 1) { - throw new InvalidOperationException("The variable name {0} is invalid.".FormatWith(invalidNames[0])); + throw new InvalidOperationException($"The variable name {invalidNames[0]} is invalid."); } if (invalidNames.Count > 1) { - throw new InvalidOperationException("The following variable names are invalid: {0}.".FormatWith(string.Join(", ", invalidNames))); + throw new InvalidOperationException($"The following variable names are invalid: {string.Join(", ", invalidNames)}."); } return database; diff --git a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs index d06f660e..b8158def 100644 --- a/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/ExecuteCommandLine.cs @@ -65,7 +65,7 @@ private void SetTransaction(string? modeName) { if (!Enum.TryParse(modeName, true, out var mode)) { - throw new InvalidCommandLineException(Arg.Transaction, "Unknown transaction mode [{0}].".FormatWith(modeName)); + throw new InvalidCommandLineException(Arg.Transaction, $"Unknown transaction mode [{modeName}]."); } Transaction = mode; diff --git a/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs b/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs index 5062030b..c49d3814 100644 --- a/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs +++ b/Sources/SqlDatabase/Configuration/GenericCommandLineBuilder.cs @@ -54,12 +54,12 @@ public GenericCommandLineBuilder SetVariable(string? name, string? value) name = name?.Trim(); if (string.IsNullOrEmpty(name)) { - throw new InvalidCommandLineException(Arg.Variable, "Invalid variable name [{0}].".FormatWith(name)); + throw new InvalidCommandLineException(Arg.Variable, $"Invalid variable name [{name}]."); } if (Line.Variables.ContainsKey(name!)) { - throw new InvalidCommandLineException(Arg.Variable, "Variable with name [{0}] is duplicated.".FormatWith(name)); + throw new InvalidCommandLineException(Arg.Variable, $"Variable with name [{name}] is duplicated."); } Line.Variables.Add(name!, value ?? string.Empty); @@ -72,7 +72,7 @@ public GenericCommandLineBuilder SetVariable(string nameValue) if (!CommandLineParser.ParseArg(Arg.Sign + nameValue, out var arg) || !arg.IsPair) { - throw new InvalidCommandLineException(Arg.Variable, "Invalid variable value definition [{0}].".FormatWith(nameValue)); + throw new InvalidCommandLineException(Arg.Variable, $"Invalid variable value definition [{nameValue}]."); } return SetVariable(arg.Key, arg.Value); diff --git a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs index 6319afaf..3d33bff7 100644 --- a/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs +++ b/Sources/SqlDatabase/Configuration/UpgradeCommandLine.cs @@ -68,7 +68,7 @@ private void SetTransaction(string? modeName) { if (!Enum.TryParse(modeName, true, out var mode)) { - throw new InvalidCommandLineException(Arg.Transaction, "Unknown transaction mode [{0}].".FormatWith(modeName)); + throw new InvalidCommandLineException(Arg.Transaction, $"Unknown transaction mode [{modeName}]."); } Transaction = mode; diff --git a/Sources/SqlDatabase/Program.cs b/Sources/SqlDatabase/Program.cs index 00f6539a..5d4d4539 100644 --- a/Sources/SqlDatabase/Program.cs +++ b/Sources/SqlDatabase/Program.cs @@ -153,7 +153,7 @@ private static string LoadHelpContent(string fileName) if (resourceName == null) { - throw new InvalidOperationException("Help file [{0}] not found.".FormatWith(fullName)); + throw new InvalidOperationException($"Help file [{fullName}] not found."); } using (var stream = scope.Assembly.GetManifestResourceStream(resourceName)) diff --git a/Sources/SqlDatabase/Scripts/Database.cs b/Sources/SqlDatabase/Scripts/Database.cs index 32866d4e..ceadcbac 100644 --- a/Sources/SqlDatabase/Scripts/Database.cs +++ b/Sources/SqlDatabase/Scripts/Database.cs @@ -117,16 +117,13 @@ private void WriteCurrentVersion(IDbCommand command, Version targetVersion) } catch (DbException ex) { - throw new InvalidOperationException("Fail to update the version, script: {0}".FormatWith(script), ex); + throw new InvalidOperationException($"Fail to update the version, script: {script}", ex); } var checkVersion = ReadCurrentVersion(command); if (checkVersion != targetVersion) { - throw new InvalidOperationException("Set version script works incorrectly: expected version is {0}, but actual is {1}. Script: {2}".FormatWith( - targetVersion, - checkVersion, - script)); + throw new InvalidOperationException($"Set version script works incorrectly: expected version is {targetVersion}, but actual is {checkVersion}. Script: {script}"); } } @@ -142,17 +139,17 @@ private Version ReadCurrentVersion(IDbCommand command) } catch (DbException ex) { - throw new InvalidOperationException("Fail to read the version, script: {0}".FormatWith(script), ex); + throw new InvalidOperationException($"Fail to read the version, script: {script}", ex); } if (!Version.TryParse(version, out var result)) { if (string.IsNullOrEmpty(Variables.ModuleName)) { - throw new InvalidOperationException("The version [{0}] of database is invalid.".FormatWith(version)); + throw new InvalidOperationException($"The version [{version}] of database is invalid."); } - throw new InvalidOperationException("The version [{0}] of module [{1}] is invalid.".FormatWith(version, Variables.ModuleName)); + throw new InvalidOperationException($"The version [{version}] of module [{Variables.ModuleName}] is invalid."); } return result; diff --git a/Sources/SqlDatabase/Scripts/ScriptResolver.cs b/Sources/SqlDatabase/Scripts/ScriptResolver.cs index 9ca747fb..eb690796 100644 --- a/Sources/SqlDatabase/Scripts/ScriptResolver.cs +++ b/Sources/SqlDatabase/Scripts/ScriptResolver.cs @@ -21,7 +21,7 @@ public IScript FromFile(IFile file) var factory = FindSupported(file); if (factory == null) { - throw new NotSupportedException("File [{0}] cannot be used as script.".FormatWith(file.Name)); + throw new NotSupportedException($"File [{file.Name}] cannot be used as script."); } return factory.FromFile(file); diff --git a/Sources/SqlDatabase/StringExtensions.cs b/Sources/SqlDatabase/StringExtensions.cs deleted file mode 100644 index 486aaebb..00000000 --- a/Sources/SqlDatabase/StringExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Globalization; - -namespace SqlDatabase; - -internal static class StringExtensions -{ - public static string FormatWith(this string format, params object?[] args) - { - return string.Format(CultureInfo.InvariantCulture, format, args); - } -} \ No newline at end of file From c4b426cd026246f7209ed96f5d87d7bd8ab09691 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Wed, 8 Nov 2023 05:05:17 +0100 Subject: [PATCH 22/38] DatabaseAdapterFactory more tests --- .../Scripts/DatabaseAdapterFactoryTest.cs | 69 +++++++++++++++++-- .../Scripts/DatabaseAdapterFactory.cs | 17 +++-- 2 files changed, 73 insertions(+), 13 deletions(-) diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index f93d3973..c15b998e 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Configuration; using Moq; using NUnit.Framework; using Shouldly; @@ -17,17 +18,67 @@ public class DatabaseAdapterFactoryTest public void BeforeEachTest() { _log = new Mock(MockBehavior.Strict).Object; - _configuration = new AppConfiguration(); + _configuration = new AppConfiguration + { + GetCurrentVersionScript = "get mssql obsolete", + SetCurrentVersionScript = "set mssql obsolete", + MsSql = + { + GetCurrentVersionScript = "get mssql", + SetCurrentVersionScript = "set mssql" + }, + MySql = + { + GetCurrentVersionScript = "get mysql", + SetCurrentVersionScript = "set mysql" + }, + PgSql = + { + GetCurrentVersionScript = "get pgsql", + SetCurrentVersionScript = "set pgsql" + } + }; } [Test] [TestCaseSource(nameof(GetCreateAdapterCases))] - public void CreateAdapter(string connectionString, string databaseName, string expected) + public void CreateAdapter( + string connectionString, + string databaseName, + string adapterName, + string versionSelectScript, + string versionUpdateScript) { var actual = DatabaseAdapterFactory.CreateAdapter(connectionString, _configuration, _log); - actual.GetType().Name.ShouldBe(expected); + actual.GetType().Name.ShouldBe(adapterName); actual.DatabaseName.ShouldBe(databaseName); + actual.GetVersionSelectScript().ShouldBe(versionSelectScript); + actual.GetVersionUpdateScript().ShouldBe(versionUpdateScript); + } + + [Test] + public void CompatibleConnectionStrings() + { + Should.Throw(() => DatabaseAdapterFactory.CreateAdapter("Server=localhost;Host=localhost;Database=sqldatabasetest", _configuration, _log)); + } + + [Test] + public void UnknownConnectionStrings() + { + Should.Throw(() => DatabaseAdapterFactory.CreateAdapter("Server=localhost", _configuration, _log)); + } + + [Test] + public void MsSqlObsoleteConfiguration() + { + _configuration.MsSql.GetCurrentVersionScript = string.Empty; + _configuration.MsSql.SetCurrentVersionScript = string.Empty; + + var actual = DatabaseAdapterFactory.CreateAdapter("Data Source=.;Initial Catalog=SqlDatabaseTest", _configuration, _log); + actual.GetType().Name.ShouldBe("MsSqlDatabaseAdapter"); + actual.GetVersionSelectScript().ShouldBe("get mssql obsolete"); + actual.GetVersionUpdateScript().ShouldBe("set mssql obsolete"); } private static IEnumerable GetCreateAdapterCases() @@ -35,7 +86,9 @@ private static IEnumerable GetCreateAdapterCases() yield return new TestCaseData( "Data Source=.;Initial Catalog=SqlDatabaseTest", "SqlDatabaseTest", - "MsSqlDatabaseAdapter") + "MsSqlDatabaseAdapter", + "get mssql", + "set mssql") { TestName = "MsSql" }; @@ -43,7 +96,9 @@ private static IEnumerable GetCreateAdapterCases() yield return new TestCaseData( "Host=localhost;Database=sqldatabasetest;", "sqldatabasetest", - "PgSqlDatabaseAdapter") + "PgSqlDatabaseAdapter", + "get pgsql", + "set pgsql") { TestName = "PgSql" }; @@ -51,7 +106,9 @@ private static IEnumerable GetCreateAdapterCases() yield return new TestCaseData( "Server=localhost;Database=sqldatabasetest", "sqldatabasetest", - "MySqlDatabaseAdapter") + "MySqlDatabaseAdapter", + "get mysql", + "set mysql") { TestName = "MySql" }; diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index daa6c29c..eb465a89 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Configuration; using SqlDatabase.Adapter; using SqlDatabase.Adapter.MsSql; @@ -14,29 +13,33 @@ internal static class DatabaseAdapterFactory public static IDatabaseAdapter CreateAdapter(string connectionString, AppConfiguration configuration, ILogger log) { // connection strings are compatible - var factories = new List>(3); + Func? factory = null; + var factoriesCounter = 0; if (MsSqlDatabaseAdapterFactory.CanBe(connectionString)) { - factories.Add(CreateMsSql); + factoriesCounter++; + factory = CreateMsSql; } if (PgSqlDatabaseAdapterFactory.CanBe(connectionString)) { - factories.Add(CreatePgSql); + factoriesCounter++; + factory = CreatePgSql; } if (MySqlDatabaseAdapterFactory.CanBe(connectionString)) { - factories.Add(CreateMySql); + factoriesCounter++; + factory = CreateMySql; } - if (factories.Count != 1) + if (factory == null || factoriesCounter != 1) { throw new ConfigurationErrorsException("Could not determine the database type from the provided connection string."); } - return factories[0](connectionString, configuration, log); + return factory(connectionString, configuration, log); } private static IDatabaseAdapter CreateMsSql(string connectionString, AppConfiguration configuration, ILogger log) From da6d99dd7fd4f7225bbc035cc1f4ed37ecf2dbc3 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Wed, 8 Nov 2023 05:57:08 +0100 Subject: [PATCH 23/38] use private output path for tests --- .../SqlDatabase.Adapter.AssemblyScripts.Test.csproj | 1 - .../SqlDatabase.Adapter.MsSql.Test.csproj | 1 - .../SqlDatabase.Adapter.MySql.Test.csproj | 1 - .../SqlDatabase.Adapter.PgSql.Test.csproj | 1 - .../SqlDatabase.Adapter.PowerShellScripts.Test.csproj | 1 - .../SqlDatabase.Adapter.Sql.Test.csproj | 1 - .../SqlDatabase.FileSystem.Test.csproj | 1 - .../SqlDatabase.PowerShell.Test.csproj | 1 - .../SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj | 1 - Sources/SqlDatabase.Test/SqlDatabase.Test.csproj | 3 --- 10 files changed, 12 deletions(-) diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj index 9966cc45..ea51a6a4 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.AssemblyScripts - ..\..\bin\Tests NU1702 diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj index 72338b3a..3e29faab 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.MsSql - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj index e5e018bb..a4a11e6a 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.MySql - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj index 235cbb24..eef24fc4 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.PgSql - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj index a058583b..ba34a726 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.PowerShellScripts - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj index cdcbe103..9e0ab78a 100644 --- a/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Adapter.Sql - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj index 12212618..f0fef585 100644 --- a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj +++ b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.FileSystem - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj index 9b771d4d..a598bdeb 100644 --- a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj +++ b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj @@ -3,7 +3,6 @@ net472 SqlDatabase.PowerShell - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj index 0512478e..23c7f020 100644 --- a/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj +++ b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase.Sequence - ..\..\bin\Tests diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index 0585f899..ccc3d302 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -3,7 +3,6 @@ net472;net6.0;net7.0 SqlDatabase - ..\..\bin\Tests @@ -25,8 +24,6 @@ - From 8e8ec487730b9aacdec77588da5fecf8491df515 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Wed, 8 Nov 2023 06:58:10 +0100 Subject: [PATCH 24/38] suppress Console.Out in release unit tests --- .../DefaultEntryPointTest.cs | 5 +++-- .../EntryPointResolverTest.cs | 5 +++-- .../Net472/Net472SubDomainTest.cs | 4 ++-- .../MsSqlDataExporterTest.cs | 9 +++++---- .../MsSqlDatabaseAdapterTest.cs | 5 +++-- .../MsSqlWriterTest.cs | 3 ++- .../TextScriptOutputMsSqlTest.cs | 2 +- .../MySqlDataExporterTest.cs | 5 +++-- .../MySqlDatabaseAdapterTest.cs | 5 +++-- .../MySqlWriterTest.cs | 3 ++- .../TextScriptOutputMySqlTest.cs | 2 +- .../PgSqlDataExporterTest.cs | 5 +++-- .../PgSqlDatabaseAdapterTest.cs | 5 +++-- .../PgSqlWriterTest.cs | 3 ++- .../TextScriptOutputPgSqlTest.cs | 2 +- .../InstallationSeekerTest.cs | 4 ++-- .../PowerShellTest.cs | 5 +++-- .../TextScriptTest.cs | 3 ++- .../InfoCmdLetTest.cs | 3 ++- .../SqlDatabase.PowerShell.Test.csproj | 3 +-- .../TestApi/SqlDatabaseCmdLetTest.cs | 3 ++- .../ModuleVersionResolverTest.cs | 3 ++- .../UpgradeScriptSequenceTest.cs | 2 +- .../Commands/DatabaseCreateCommandTest.cs | 5 +++-- .../Commands/DatabaseExecuteCommandTest.cs | 3 ++- .../Commands/DatabaseExportCommandTest.cs | 3 ++- .../Commands/DatabaseUpgradeCommandTest.cs | 5 +++-- .../GenericCommandLineBuilderTest.cs | 3 ++- .../SqlDatabase.Test/Log/FileLoggerTest.cs | 10 +++++----- .../SqlDatabase.Test/Scripts/DatabaseTest.cs | 5 +++-- Sources/SqlDatabase.TestApi/TestOutput.cs | 19 +++++++++++++++++++ 31 files changed, 91 insertions(+), 51 deletions(-) create mode 100644 Sources/SqlDatabase.TestApi/TestOutput.cs diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs index c90ca947..2b9e41b4 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/DefaultEntryPointTest.cs @@ -3,6 +3,7 @@ using System.Data; using Moq; using NUnit.Framework; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.AssemblyScripts; @@ -27,14 +28,14 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); log .Setup(l => l.Error(It.IsAny())) .Callback(m => { - Console.WriteLine("Error: {0}", m); + TestOutput.WriteLine("Error: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs index f75f56b6..50da8af2 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs @@ -3,6 +3,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.AssemblyScripts; @@ -22,13 +23,13 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); }); log .Setup(l => l.Error(It.IsAny())) .Callback(m => { - Console.WriteLine("Error: {0}", m); + TestOutput.WriteLine("Error: {0}", m); _logErrorOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs index 6a113fcf..e532554c 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs @@ -27,10 +27,10 @@ public void BeforeEachTest() var log = new Mock(MockBehavior.Strict); log .Setup(l => l.Info(It.IsAny())) - .Callback(m => Console.WriteLine("Info: {0}", m)); + .Callback(m => TestOutput.WriteLine("Info: {0}", m)); log .Setup(l => l.Error(It.IsAny())) - .Callback(m => Console.WriteLine("Error: {0}", m)); + .Callback(m => TestOutput.WriteLine("Error: {0}", m)); _executedScripts = new List(); _command = new Mock(MockBehavior.Strict); diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs index f82621c5..ce522bdf 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDataExporterTest.cs @@ -7,6 +7,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter.Sql.Export; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MsSql; @@ -24,7 +25,7 @@ public void BeforeEachTest() var log = new Mock(MockBehavior.Strict); log .Setup(l => l.Info(It.IsAny())) - .Callback(m => Console.WriteLine("Info: {0}", m)); + .Callback(m => TestOutput.WriteLine("Info: {0}", m)); _sut = new DataExporter { @@ -62,7 +63,7 @@ public void Export(string dataType, object minValue, object maxValue) } var exportSql = _output.ToString(); - Console.WriteLine(exportSql); + TestOutput.WriteLine(exportSql); exportSql.ShouldContain(" " + dataType + " "); @@ -109,7 +110,7 @@ insert into @x(Id) values(1) } var exportSql = _output.ToString(); - Console.WriteLine(exportSql); + TestOutput.WriteLine(exportSql); using (var connection = new SqlConnection(MsSqlQuery.GetConnectionString())) using (var cmd = connection.CreateCommand()) @@ -203,7 +204,7 @@ public void InsertBatchSize() } } - Console.WriteLine(slq2); + TestOutput.WriteLine(slq2); slq2.Length.ShouldBeGreaterThan(slq500.Length); } diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs index 28a1394d..d667f841 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MsSql; @@ -26,7 +27,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); @@ -67,7 +68,7 @@ public void GetServerVersionSelectScript() connection.Open(); var actual = cmd.ExecuteScalar(); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldBeOfType().ShouldNotBeNullOrWhiteSpace(); } diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs index 04558431..ba1579e6 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlWriterTest.cs @@ -3,6 +3,7 @@ using System.Text; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MsSql; @@ -22,7 +23,7 @@ public void BeforeEachTest() [TearDown] public void AfterEachTest() { - Console.WriteLine(_output); + TestOutput.WriteLine(_output); } [Test] diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs index 8f68be1b..4fd8f8dd 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/TextScriptOutputMsSqlTest.cs @@ -33,7 +33,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs index 6ceaa19d..4e1d9781 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDataExporterTest.cs @@ -6,6 +6,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter.Sql.Export; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MySql; @@ -23,7 +24,7 @@ public void BeforeEachTest() var log = new Mock(MockBehavior.Strict); log .Setup(l => l.Info(It.IsAny())) - .Callback(m => Console.WriteLine("Info: {0}", m)); + .Callback(m => TestOutput.WriteLine("Info: {0}", m)); _sut = new DataExporter { @@ -66,7 +67,7 @@ public void Export(string dataType, object minValue, object maxValue, bool allow } var exportSql = _output.ToString(); - Console.WriteLine(exportSql); + TestOutput.WriteLine(exportSql); exportSql.ShouldContain(" " + (expectedDataType ?? dataType) + " "); diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs index 57af97a9..aea93400 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MySql; @@ -26,7 +27,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); @@ -67,7 +68,7 @@ public void GetServerVersionSelectScript() connection.Open(); var actual = cmd.ExecuteScalar(); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldBeOfType().ShouldNotBeNullOrWhiteSpace(); } diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs index daa00579..c5bddbd1 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlWriterTest.cs @@ -3,6 +3,7 @@ using System.Text; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.MySql; @@ -22,7 +23,7 @@ public void BeforeEachTest() [TearDown] public void AfterEachTest() { - Console.WriteLine(_output); + TestOutput.WriteLine(_output); } [Test] diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs index 9f67aba8..7d002af6 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs @@ -34,7 +34,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs index 19020754..45e2909b 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDataExporterTest.cs @@ -10,6 +10,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter.Sql.Export; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.PgSql; @@ -27,7 +28,7 @@ public void BeforeEachTest() var log = new Mock(MockBehavior.Strict); log .Setup(l => l.Info(It.IsAny())) - .Callback(m => Console.WriteLine("Info: {0}", m)); + .Callback(m => TestOutput.WriteLine("Info: {0}", m)); _sut = new DataExporter { @@ -72,7 +73,7 @@ public void Export(string dataType, object minValue, object maxValue, bool allow } var exportSql = _output.ToString(); - Console.WriteLine(exportSql); + TestOutput.WriteLine(exportSql); exportSql.ShouldContain(" " + (expectedDataType ?? dataType) + " "); diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs index 5ec51996..2bacf671 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs @@ -4,6 +4,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.PgSql; @@ -26,7 +27,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); @@ -67,7 +68,7 @@ public void GetServerVersionSelectScript() connection.Open(); var actual = cmd.ExecuteScalar(); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldBeOfType().ShouldNotBeNullOrWhiteSpace(); } diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs index fa49820e..7e4bacfa 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlWriterTest.cs @@ -7,6 +7,7 @@ using NpgsqlTypes; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.PgSql; @@ -26,7 +27,7 @@ public void BeforeEachTest() [TearDown] public void AfterEachTest() { - Console.WriteLine(_output); + TestOutput.WriteLine(_output); } [Test] diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs index c38c45c7..051bb098 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/TextScriptOutputPgSqlTest.cs @@ -33,7 +33,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs index 52ccd81f..99329240 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/InstallationSeekerTest.cs @@ -18,7 +18,7 @@ public void TryFindByParentProcess() var actual = InstallationSeeker.TryFindByParentProcess(out var path); if (actual) { - Console.WriteLine(path); + TestOutput.WriteLine(path); } } @@ -31,7 +31,7 @@ public void TryFindOnDisk() InstallationSeeker.TryFindOnDisk(out var path).ShouldBeTrue(); - Console.WriteLine(path); + TestOutput.WriteLine(path); } [Test] diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs index 93cc118b..f81d5e89 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/PowerShellTest.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.PowerShellScripts; @@ -54,7 +55,7 @@ public void AfterEachTest() { foreach (var line in _logOutput) { - Console.WriteLine(line); + TestOutput.WriteLine(line); } } @@ -103,7 +104,7 @@ public void HandleThrow() catch (Exception ex) { failed = true; - Console.WriteLine(ex); + TestOutput.WriteLine(ex); } failed.ShouldBeTrue(); diff --git a/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs index 9148f6b3..0837ad90 100644 --- a/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs +++ b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs @@ -6,6 +6,7 @@ using Moq; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Adapter.Sql; @@ -38,7 +39,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.PowerShell.Test/InfoCmdLetTest.cs b/Sources/SqlDatabase.PowerShell.Test/InfoCmdLetTest.cs index 1c5d3f2c..a1dac9d4 100644 --- a/Sources/SqlDatabase.PowerShell.Test/InfoCmdLetTest.cs +++ b/Sources/SqlDatabase.PowerShell.Test/InfoCmdLetTest.cs @@ -3,6 +3,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.PowerShell.TestApi; +using SqlDatabase.TestApi; namespace SqlDatabase.PowerShell; @@ -15,7 +16,7 @@ public void ProcessRecord() var actual = InvokeCommand("Show-SqlDatabaseInfo"); actual.Count.ShouldBe(1); - Console.WriteLine(actual[0]); + TestOutput.WriteLine(actual[0]); actual[0].Properties["PSEdition"].Value.ShouldBeOfType().ShouldNotBeNullOrWhiteSpace(); actual[0].Properties["PSVersion"].Value.ShouldBeOfType().ShouldNotBeNullOrWhiteSpace(); diff --git a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj index a598bdeb..eaf7fcb4 100644 --- a/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj +++ b/Sources/SqlDatabase.PowerShell.Test/SqlDatabase.PowerShell.Test.csproj @@ -6,16 +6,15 @@ - - + diff --git a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs index 1c4a1e6b..a66d3177 100644 --- a/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs +++ b/Sources/SqlDatabase.PowerShell.Test/TestApi/SqlDatabaseCmdLetTest.cs @@ -10,6 +10,7 @@ using Shouldly; using SqlDatabase.Configuration; using SqlDatabase.PowerShell.Internal; +using SqlDatabase.TestApi; using Command = System.Management.Automation.Runspaces.Command; namespace SqlDatabase.PowerShell.TestApi; @@ -52,7 +53,7 @@ public void AfterEachTest() foreach (var row in _powerShell.Streams.Information) { - Console.WriteLine(row); + TestOutput.WriteLine(row); } _powerShell?.Dispose(); diff --git a/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs b/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs index f53d0a35..90ae5268 100644 --- a/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/ModuleVersionResolverTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using Shouldly; using SqlDatabase.Adapter; +using SqlDatabase.TestApi; namespace SqlDatabase.Sequence; @@ -22,7 +23,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs index 8f233ed6..f88189d9 100644 --- a/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs +++ b/Sources/SqlDatabase.Sequence.Test/UpgradeScriptSequenceTest.cs @@ -87,7 +87,7 @@ public void BuildSequence(BuildSequenceCase testCase) else { var ex = Assert.Throws(() => _sut.BuildSequence()); - Console.WriteLine(ex!.Message); + TestOutput.WriteLine(ex!.Message); foreach (var tag in testCase.Exception) { ex.Message.ShouldContain(tag); diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index 64378483..2dda99b1 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -5,6 +5,7 @@ using SqlDatabase.Adapter; using SqlDatabase.Scripts; using SqlDatabase.Sequence; +using SqlDatabase.TestApi; namespace SqlDatabase.Commands; @@ -39,13 +40,13 @@ public void BeforeEachTest() .Setup(l => l.Error(It.IsAny())) .Callback(m => { - Console.WriteLine("Error: {0}", m); + TestOutput.WriteLine("Error: {0}", m); }); _log .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); }); _sut = new DatabaseCreateCommand( diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs index 95e9c5a6..f337b178 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExecuteCommandTest.cs @@ -4,6 +4,7 @@ using SqlDatabase.Adapter; using SqlDatabase.Scripts; using SqlDatabase.Sequence; +using SqlDatabase.TestApi; namespace SqlDatabase.Commands; @@ -38,7 +39,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); }); _sut = new DatabaseExecuteCommand( diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs index f4007a08..d0885ccc 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseExportCommandTest.cs @@ -7,6 +7,7 @@ using SqlDatabase.Adapter.Sql.Export; using SqlDatabase.Scripts; using SqlDatabase.Sequence; +using SqlDatabase.TestApi; namespace SqlDatabase.Commands; @@ -45,7 +46,7 @@ public void BeforeEachTest() .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); }); _exporter = new Mock(MockBehavior.Strict); diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs index 60f94654..c93c5380 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseUpgradeCommandTest.cs @@ -4,6 +4,7 @@ using SqlDatabase.Adapter; using SqlDatabase.Scripts; using SqlDatabase.Sequence; +using SqlDatabase.TestApi; namespace SqlDatabase.Commands; @@ -38,13 +39,13 @@ public void BeforeEachTest() .Setup(l => l.Error(It.IsAny())) .Callback(m => { - Console.WriteLine("Error: {0}", m); + TestOutput.WriteLine("Error: {0}", m); }); _log .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); }); _sut = new DatabaseUpgradeCommand( diff --git a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs index 44d24951..bb9a39b0 100644 --- a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs @@ -1,6 +1,7 @@ using System; using NUnit.Framework; using Shouldly; +using SqlDatabase.TestApi; namespace SqlDatabase.Configuration; @@ -33,7 +34,7 @@ public void BuildArray() foreach (var arg in args) { - Console.WriteLine(arg); + TestOutput.WriteLine(arg); } CommandLineParser.GetLogFileName(args).ShouldBe("log file"); diff --git a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs index e0b05f2a..64f67700 100644 --- a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs @@ -33,7 +33,7 @@ public void Info() var actual = File.ReadAllText(_file.Location); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldContain(" INFO "); actual.ShouldContain(" some message"); } @@ -48,7 +48,7 @@ public void Error() var actual = File.ReadAllText(_file.Location); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldContain(" ERROR "); actual.ShouldContain(" some message"); } @@ -66,7 +66,7 @@ public void Append() var actual = File.ReadAllText(_file.Location); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldContain("do not remove"); actual.ShouldContain(" INFO "); actual.ShouldContain(" some message"); @@ -90,7 +90,7 @@ public void FileIsAvailableForRead() } } - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldContain(" INFO "); actual.ShouldContain(" some message"); } @@ -105,7 +105,7 @@ public void WriteNull() var actual = File.ReadAllText(_file.Location); - Console.WriteLine(actual); + TestOutput.WriteLine(actual); actual.ShouldContain(" INFO "); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs index 74cf7b95..a0712b80 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseTest.cs @@ -8,6 +8,7 @@ using Shouldly; using SqlDatabase.Adapter; using SqlDatabase.Configuration; +using SqlDatabase.TestApi; namespace SqlDatabase.Scripts; @@ -30,14 +31,14 @@ public void BeforeEachTest() .Setup(l => l.Error(It.IsAny())) .Callback(m => { - Console.WriteLine("Error: {0}", m); + TestOutput.WriteLine("Error: {0}", m); _logOutput.Add(m); }); log .Setup(l => l.Info(It.IsAny())) .Callback(m => { - Console.WriteLine("Info: {0}", m); + TestOutput.WriteLine("Info: {0}", m); _logOutput.Add(m); }); diff --git a/Sources/SqlDatabase.TestApi/TestOutput.cs b/Sources/SqlDatabase.TestApi/TestOutput.cs new file mode 100644 index 00000000..21d173a8 --- /dev/null +++ b/Sources/SqlDatabase.TestApi/TestOutput.cs @@ -0,0 +1,19 @@ +using System; +using System.Diagnostics; + +namespace SqlDatabase.TestApi; + +public static class TestOutput +{ + [Conditional("DEBUG")] + public static void WriteLine() => Console.WriteLine(); + + [Conditional("DEBUG")] + public static void WriteLine(string? value) => Console.WriteLine(value); + + [Conditional("DEBUG")] + public static void WriteLine(object? value) => Console.WriteLine(value); + + [Conditional("DEBUG")] + public static void WriteLine(string format, object? arg0) => Console.WriteLine(format, arg0); +} \ No newline at end of file From 73c06882920c2518d6df35e46963934e83be07c5 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 08:01:29 +0100 Subject: [PATCH 25/38] AssemblyScripts: remove net472 --- .../ExecuteMethodResolverSqlConnectionTest.cs | 18 +- .../Net472/Net472SubDomainTest.cs | 13 +- .../NetCoreSubDomainTest.StepWithSubDomain.cs | 21 +++ .../NetCore/NetCoreSubDomainTest.cs | 76 ++++++++ ...tabase.Adapter.AssemblyScripts.Test.csproj | 4 + .../AssemblyScript.cs | 11 +- .../AssemblyScriptFactory.cs | 6 +- .../ExecuteMethodResolverSqlConnection.cs | 16 +- .../Net472/AppDomainAdapter.cs | 163 ++++++++++++++++++ .../Net472/Net472SubDomain.cs | 17 +- .../NetCore/NetCoreSubDomain.cs | 10 +- ...SqlDatabase.Adapter.AssemblyScripts.csproj | 3 +- .../SubDomainFactory.cs | 61 +++++++ 13 files changed, 370 insertions(+), 49 deletions(-) create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.StepWithSubDomain.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/AppDomainAdapter.cs create mode 100644 Sources/SqlDatabase.Adapter.AssemblyScripts/SubDomainFactory.cs diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs index 946e1ec6..b7995697 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/ExecuteMethodResolverSqlConnectionTest.cs @@ -3,6 +3,7 @@ using System.Reflection; using Moq; using NUnit.Framework; +using Shouldly; namespace SqlDatabase.Adapter.AssemblyScripts; @@ -11,26 +12,29 @@ public class ExecuteMethodResolverSqlConnectionTest { private ExecuteMethodResolverSqlConnection _sut = null!; private SqlConnection? _executeConnection; + private MethodInfo _execute = null!; [SetUp] public void BeforeEachTest() { + _execute = GetType() + .GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic) + .ShouldNotBeNull(); + _sut = new ExecuteMethodResolverSqlConnection(); } [Test] public void IsMatch() { - var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsTrue(_sut.IsMatch(method!)); + _sut.IsMatch(_execute).ShouldBeTrue(); } [Test] public void CreateDelegate() { - var method = GetType().GetMethod(nameof(Execute), BindingFlags.Instance | BindingFlags.NonPublic); - var actual = _sut.CreateDelegate(this, method!); - Assert.IsNotNull(actual); + var actual = _sut.CreateDelegate(this, _execute); + actual.ShouldNotBeNull(); var connection = new SqlConnection(); @@ -40,12 +44,12 @@ public void CreateDelegate() .Returns(connection); actual(command.Object, null!); - Assert.AreEqual(_executeConnection, connection); + _executeConnection.ShouldBe(connection); } private void Execute(SqlConnection connection) { - Assert.IsNull(_executeConnection); + _executeConnection.ShouldBeNull(); _executeConnection = connection; } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs index e532554c..93f7e122 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/Net472/Net472SubDomainTest.cs @@ -40,10 +40,11 @@ public void BeforeEachTest() .Callback(() => _executedScripts.Add(_command.Object.CommandText)) .Returns(0); - _sut = new Net472SubDomain( + _sut = SubDomainFactory.Create( log.Object, GetType().Assembly.Location, - () => File.ReadAllBytes(GetType().Assembly.Location)); + () => File.ReadAllBytes(GetType().Assembly.Location)) + .ShouldBeOfType(); _sut.Initialize(); } @@ -58,7 +59,7 @@ public void AfterEachTest() [Test] public void ValidateScriptDomainAppBase() { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowAppBase)); + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowAppBase)).ShouldBeTrue(); _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _sut.Unload(); _sut.Dispose(); @@ -77,12 +78,12 @@ public void ValidateScriptDomainAppBase() [Test] public void ValidateScriptDomainConfiguration() { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowConfiguration)); + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.ShowConfiguration)).ShouldBeTrue(); _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _sut.Unload(); _sut.Dispose(); - Assert.AreEqual(2, _executedScripts.Count); + _executedScripts.Count.ShouldBe(2); var configurationFile = _executedScripts[0]; configurationFile.ShouldBe(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); @@ -94,7 +95,7 @@ public void ValidateScriptDomainConfiguration() [Test] public void ValidateScriptDomainCreateSubDomain() { - _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.Execute)); + _sut.ResolveScriptExecutor(nameof(StepWithSubDomain), nameof(StepWithSubDomain.Execute)).ShouldBeTrue(); _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); _executedScripts.Count.ShouldBe(1); diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.StepWithSubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.StepWithSubDomain.cs new file mode 100644 index 00000000..6d3c7d8c --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.StepWithSubDomain.cs @@ -0,0 +1,21 @@ +using System; +using System.Data; + +namespace SqlDatabase.Adapter.AssemblyScripts.NetCore; + +public partial class NetCoreSubDomainTest +{ + public sealed class StepWithCoreSubDomain + { + public void ShowAppBase(IDbCommand command) + { + var assembly = GetType().Assembly; + + command.CommandText = assembly.Location; + command.ExecuteNonQuery(); + + command.CommandText = AppDomain.CurrentDomain.BaseDirectory; + command.ExecuteNonQuery(); + } + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.cs new file mode 100644 index 00000000..52550ee0 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/NetCore/NetCoreSubDomainTest.cs @@ -0,0 +1,76 @@ +#if !NET472 +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using Moq; +using NUnit.Framework; +using Shouldly; +using SqlDatabase.TestApi; + +namespace SqlDatabase.Adapter.AssemblyScripts.NetCore; + +[TestFixture] +public partial class NetCoreSubDomainTest +{ + private NetCoreSubDomain _sut = null!; + private Mock _variables = null!; + private Mock _command = null!; + + private IList _executedScripts = null!; + + [SetUp] + public void BeforeEachTest() + { + _variables = new Mock(MockBehavior.Strict); + + var log = new Mock(MockBehavior.Strict); + log + .Setup(l => l.Info(It.IsAny())) + .Callback(m => TestOutput.WriteLine("Info: {0}", m)); + log + .Setup(l => l.Error(It.IsAny())) + .Callback(m => TestOutput.WriteLine("Error: {0}", m)); + + _executedScripts = new List(); + _command = new Mock(MockBehavior.Strict); + _command.SetupProperty(c => c.CommandText); + _command + .Setup(c => c.ExecuteNonQuery()) + .Callback(() => _executedScripts.Add(_command.Object.CommandText)) + .Returns(0); + + _sut = SubDomainFactory.Create( + log.Object, + GetType().Assembly.Location, + () => File.ReadAllBytes(GetType().Assembly.Location)) + .ShouldBeOfType(); + + _sut.Initialize(); + } + + [TearDown] + public void AfterEachTest() + { + _sut?.Unload(); + _sut?.Dispose(); + } + + [Test] + public void ValidateScriptDomainAppBase() + { + _sut.ResolveScriptExecutor(nameof(StepWithCoreSubDomain), nameof(StepWithCoreSubDomain.ShowAppBase)).ShouldBeTrue(); + _sut.Execute(new DbCommandStub(_command.Object), _variables.Object); + _sut.Unload(); + _sut.Dispose(); + + _executedScripts.Count.ShouldBe(2); + + var assemblyFileName = _executedScripts[0]; + assemblyFileName.ShouldBeEmpty(); + + var appBase = _executedScripts[1]; + appBase.ShouldBe(AppDomain.CurrentDomain.BaseDirectory); + } +} +#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj index ea51a6a4..cf359b4f 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj @@ -6,6 +6,10 @@ NU1702 + + + + diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs index d4a4244c..ab3360f4 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScript.cs @@ -36,7 +36,7 @@ public AssemblyScript( public void Execute(IDbCommand? command, IVariables variables, ILogger logger) { - var domain = CreateSubDomain(logger); + var domain = SubDomainFactory.Create(logger, DisplayName, ReadAssemblyContent); using (domain) { @@ -84,13 +84,4 @@ internal void Execute(ISubDomain domain, IDbCommand? command, IVariables variabl throw new InvalidOperationException("Errors during script execution."); } } - - private ISubDomain CreateSubDomain(ILogger logger) - { -#if NET472 - return new Net472.Net472SubDomain(logger, DisplayName, ReadAssemblyContent); -#else - return new NetCore.NetCoreSubDomain(logger, DisplayName, ReadAssemblyContent); -#endif - } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs index 6f3fdd38..2b67dd46 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/AssemblyScriptFactory.cs @@ -5,7 +5,7 @@ namespace SqlDatabase.Adapter.AssemblyScripts; -public sealed class AssemblyScriptFactory : IScriptFactory +public sealed class AssemblyScriptFactory : IScriptFactory, IScriptEnvironment { private readonly string? _configurationClassName; private readonly string? _configurationMethodName; @@ -32,6 +32,10 @@ public IScript FromFile(IFile file) CreateScriptDescriptionReader(file)); } + public bool IsSupported(IScript script) => script is AssemblyScript; + + public void Initialize(ILogger logger) => SubDomainFactory.Test(); + private static Func CreateBinaryReader(IFile file) { return () => BinaryRead(file); diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs index d0dacf35..a4ed5e68 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/ExecuteMethodResolverSqlConnection.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Data; -using System.Data.SqlClient; +using System.Linq.Expressions; using System.Reflection; namespace SqlDatabase.Adapter.AssemblyScripts; @@ -13,16 +13,18 @@ public override bool IsMatch(MethodInfo method) { var parameters = method.GetParameters(); return parameters.Length == 1 - && typeof(SqlConnection) == parameters[0].ParameterType; + && "System.Data.SqlClient.SqlConnection".Equals(parameters[0].ParameterType.FullName, StringComparison.Ordinal); } public override Action> CreateDelegate(object instance, MethodInfo method) { - var execute = (Action)Delegate.CreateDelegate( - typeof(Action), - instance, - method); + var command = Expression.Parameter(typeof(IDbCommand), "command"); + var variables = Expression.Parameter(typeof(IReadOnlyDictionary), "variables"); - return (command, _) => execute((SqlConnection)command.Connection!); + var connection = Expression.Property(command, nameof(IDbCommand.Connection)); + var sqlConnection = Expression.Convert(connection, method.GetParameters()[0].ParameterType); + var call = Expression.Call(Expression.Constant(instance), method, sqlConnection); + + return Expression.Lambda>>(call, command, variables).Compile(); } } \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/AppDomainAdapter.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/AppDomainAdapter.cs new file mode 100644 index 00000000..47aa6411 --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/AppDomainAdapter.cs @@ -0,0 +1,163 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace SqlDatabase.Adapter.AssemblyScripts.Net472; + +internal static class AppDomainAdapter +{ + private static Func? _createDomain; + private static Func? _createInstanceFromAndUnwrap; + + public static void Initialize() + { + try + { + GetOrBuildCreateDomain(); + GetOrBuildCreateInstanceFromAndUnwrap(); + } + catch (Exception ex) + { + throw new InvalidOperationException($"AppDomain host initialization failed, framework {RuntimeInformation.FrameworkDescription}", ex); + } + } + + public static AppDomain CreateDomain(string domainFriendlyName, string applicationBase) + { + var createDomain = GetOrBuildCreateDomain(); + return createDomain(domainFriendlyName, applicationBase); + } + + public static DomainAgent CreateInstanceFromAndUnwrap(AppDomain domain) + { + var createInstanceFromAndUnwrap = GetOrBuildCreateInstanceFromAndUnwrap(); + return createInstanceFromAndUnwrap(domain); + } + + private static Func GetOrBuildCreateDomain() + { + if (_createDomain == null) + { + _createDomain = BuildCreateDomain(); + } + + return _createDomain; + } + + private static Func GetOrBuildCreateInstanceFromAndUnwrap() + { + if (_createInstanceFromAndUnwrap == null) + { + _createInstanceFromAndUnwrap = BuildCreateInstanceFromAndUnwrap(); + } + + return _createInstanceFromAndUnwrap; + } + + private static Func BuildCreateInstanceFromAndUnwrap() + { + // CreateInstanceFromAndUnwrap(GetType().Assembly.Location, typeof(DomainAgent).FullName) + var domain = Expression.Parameter(typeof(AppDomain), "domain"); + + var proxy = Expression.Call( + domain, + ResolveAppDomainCreateInstanceFromAndUnwrap(), + Expression.Constant(typeof(AppDomainAdapter).Assembly.Location), + Expression.Constant(typeof(DomainAgent).FullName)); + + var body = Expression.Convert(proxy, typeof(DomainAgent)); + + var result = Expression.Lambda>(body, domain); + return result.Compile(); + } + + private static Func BuildCreateDomain() + { + var applicationBase = Expression.Parameter(typeof(string), "applicationBase"); + var domainFriendlyName = Expression.Parameter(typeof(string), "domainFriendlyName"); + + ////var setup = new AppDomainSetup + ////{ + //// ApplicationBase = _appBase.Location, + //// ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, + //// LoaderOptimization = LoaderOptimization.MultiDomainHost + ////}; + ////AppDomain.CreateDomain(appBaseName, null, setup) + var createDomain = ResolveAppDomainCreateDomain(); + var createDomainParameters = createDomain.GetParameters(); + + var configurationFile = Expression.Property(Expression.Constant(AppDomain.CurrentDomain), "SetupInformation"); + + var setup = Expression.Variable(createDomainParameters[2].ParameterType, "setup"); + var body = Expression.Block( + typeof(AppDomain), + new ParameterExpression[] { setup }, + Expression.Assign(setup, Expression.New(createDomainParameters[2].ParameterType)), + Expression.Assign( + Expression.Property(setup, "ApplicationBase"), + applicationBase), + Expression.Assign( + Expression.Property(setup, "ConfigurationFile"), + Expression.Property(configurationFile, "ConfigurationFile")), + Expression.Assign( + Expression.Property(setup, "LoaderOptimization"), + Expression.Constant(LoaderOptimization.MultiDomainHost)), + Expression.Call( + createDomain, + domainFriendlyName, + Expression.Constant(null, createDomainParameters[1].ParameterType), + setup)); + + var result = Expression.Lambda>(body, domainFriendlyName, applicationBase); + return result.Compile(); + } + + private static MethodInfo ResolveAppDomainCreateInstanceFromAndUnwrap() + { + // CreateInstanceFromAndUnwrap(string assemblyName, string typeName) + var result = typeof(AppDomain) + .GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Where(i => "CreateInstanceFromAndUnwrap".Equals(i.Name, StringComparison.Ordinal)) + .Where(i => + { + var parameters = i.GetParameters(); + return parameters.Length == 2 + && parameters[0].ParameterType == typeof(string) + && parameters[1].ParameterType == typeof(string); + }) + .FirstOrDefault(); + + if (result == null) + { + throw new NotSupportedException("The method AppDomain.CreateInstanceFromAndUnwrap not found."); + } + + return result; + } + + private static MethodInfo ResolveAppDomainCreateDomain() + { + // CreateDomain(string friendlyName, System.Security.Policy.Evidence securityInfo, AppDomainSetup info) + var result = typeof(AppDomain) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(i => nameof(AppDomain.CreateDomain).Equals(i.Name, StringComparison.Ordinal)) + .Where(i => + { + var parameters = i.GetParameters(); + return parameters.Length == 3 + && parameters[0].ParameterType == typeof(string) + && parameters[1].ParameterType.FullName!.Equals("System.Security.Policy.Evidence", StringComparison.Ordinal) + && parameters[2].ParameterType.FullName!.Equals("System.AppDomainSetup"); + }) + .FirstOrDefault(); + + if (result == null) + { + throw new NotSupportedException("The method AppDomain.CreateDomain not found."); + } + + return result; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs index 622c916b..81909fff 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/Net472/Net472SubDomain.cs @@ -1,5 +1,4 @@ -#if NET472 -using System; +using System; using System.Data; using System.IO; @@ -24,6 +23,8 @@ public Net472SubDomain(ILogger logger, string assemblyFileName, Func rea public Func ReadAssemblyContent { get; } + public static void Test() => AppDomainAdapter.Initialize(); + public void Initialize() { Logger.Info($"create domain for {AssemblyFileName}"); @@ -33,15 +34,8 @@ public void Initialize() var entryAssembly = _appBase.SaveFile(ReadAssemblyContent(), appBaseName); - var setup = new AppDomainSetup - { - ApplicationBase = _appBase.Location, - ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, - LoaderOptimization = LoaderOptimization.MultiDomainHost - }; - - _app = AppDomain.CreateDomain(appBaseName, null, setup); - _appAgent = (DomainAgent)_app.CreateInstanceFromAndUnwrap(GetType().Assembly.Location, typeof(DomainAgent).FullName); + _app = AppDomainAdapter.CreateDomain(appBaseName, _appBase.Location); + _appAgent = AppDomainAdapter.CreateInstanceFromAndUnwrap(_app); _appAgent.RedirectConsoleOut(new LoggerProxy(Logger)); _appAgent.LoadAssembly(entryAssembly); @@ -75,4 +69,3 @@ public void Dispose() _appBase?.Dispose(); } } -#endif \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs index 1f9b7589..b1731894 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/NetCore/NetCoreSubDomain.cs @@ -1,5 +1,4 @@ -#if !NET472 -using System; +using System; using System.Data; namespace SqlDatabase.Adapter.AssemblyScripts.NetCore; @@ -25,6 +24,10 @@ public NetCoreSubDomain(ILogger logger, string assemblyFileName, Func re private IEntryPoint? EntryPoint { get; set; } + public static void Test() + { + } + public void Initialize() { _assemblyContext.LoadScriptAssembly(ReadAssemblyContent()); @@ -61,5 +64,4 @@ public bool Execute(IDbCommand command, IVariables variables) public void Dispose() { } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj index 3d17b002..d9582000 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/SqlDatabase.Adapter.AssemblyScripts.csproj @@ -1,11 +1,10 @@  - net472;netstandard2.0 + netstandard2.0 - diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts/SubDomainFactory.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts/SubDomainFactory.cs new file mode 100644 index 00000000..eac53a2f --- /dev/null +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts/SubDomainFactory.cs @@ -0,0 +1,61 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace SqlDatabase.Adapter.AssemblyScripts; + +internal static class SubDomainFactory +{ + public static void Test() + { + if (IsNetFrameworkRuntime()) + { + Test472SubDomain(); + } + else + { + Test472CoreSubDomain(); + } + } + + public static ISubDomain Create(ILogger logger, string assemblyFileName, Func readAssemblyContent) + { + if (IsNetFrameworkRuntime()) + { + return Create472SubDomain(logger, assemblyFileName, readAssemblyContent); + } + + return CreateCoreSubDomain(logger, assemblyFileName, readAssemblyContent); + } + + // https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed + private static bool IsNetFrameworkRuntime() + { + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + && RuntimeInformation.FrameworkDescription.IndexOf("Framework", StringComparison.OrdinalIgnoreCase) > 0; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static ISubDomain Create472SubDomain(ILogger logger, string assemblyFileName, Func readAssemblyContent) + { + return new Net472.Net472SubDomain(logger, assemblyFileName, readAssemblyContent); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void Test472SubDomain() + { + Net472.Net472SubDomain.Test(); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static ISubDomain CreateCoreSubDomain(ILogger logger, string assemblyFileName, Func readAssemblyContent) + { + return new NetCore.NetCoreSubDomain(logger, assemblyFileName, readAssemblyContent); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void Test472CoreSubDomain() + { + NetCore.NetCoreSubDomain.Test(); + } +} \ No newline at end of file From 0dade05654d299e89f89341c43aa3e1f680792fe Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:08:32 +0100 Subject: [PATCH 26/38] SqlDatabase.Configuration --- .../EntryPointResolverTest.cs | 3 +- .../MsSqlDatabaseAdapterTest.cs | 3 +- .../MySqlDatabaseAdapterTest.cs | 3 +- .../TextScriptOutputMySqlTest.cs | 1 - .../PgSqlDatabaseAdapterTest.cs | 3 +- .../TextScriptTest.cs | 3 +- .../AppConfiguration.default.xml | 4 + .../AppConfiguration.empty.xml | 0 .../AppConfiguration.full.xml | 5 - .../AppConfigurationTest.cs | 27 ++--- .../ConfigurationManagerTest.cs | 101 +++++++++++++++++ .../SqlDatabase.Configuration.Test.csproj | 28 +++++ .../SqlDatabase.dll.config} | 5 - .../AppConfiguration.cs | 31 +++++ .../AssemblyScriptConfiguration.cs | 11 ++ .../ConfigurationErrorsException.cs | 20 ++++ .../ConfigurationManager.cs | 75 ++++++++++++ .../ConfigurationReader.cs | 98 ++++++++++++++++ .../DatabaseConfiguration.cs | 17 +++ .../IConfigurationManager.cs | 0 .../Properties/AssemblyInfo.cs | 4 + .../SqlDatabase.Configuration.csproj | 10 ++ .../Commands/DatabaseCreateCommandTest.cs | 2 +- .../AppConfiguration.default.xml | 9 -- .../Configuration/CommandLineBaseTest.cs | 4 +- .../Configuration/ConfigurationManagerTest.cs | 102 ----------------- .../Configuration/EnvironmentBuilderTest.cs | 7 +- .../GenericCommandLineBuilderTest.cs | 3 +- .../SqlDatabase.Test/Log/FileLoggerTest.cs | 3 +- .../Scripts/DatabaseAdapterFactoryTest.cs | 1 - .../SqlDatabase.Test/SqlDatabase.Test.csproj | 17 --- Sources/SqlDatabase.TestApi/ResourceReader.cs | 14 +++ Sources/SqlDatabase.sln | 35 ++++-- .../Commands/DatabaseCreateCommand.cs | 4 +- .../Configuration/AppConfiguration.cs | 45 -------- .../AssemblyScriptConfiguration.cs | 33 ------ .../Configuration/ConfigurationManager.cs | 107 ------------------ .../Configuration/DatabaseConfiguration.cs | 27 ----- .../Configuration/EnvironmentBuilder.cs | 6 +- .../Scripts/DatabaseAdapterFactory.cs | 1 - Sources/SqlDatabase/SqlDatabase.csproj | 9 +- 41 files changed, 466 insertions(+), 415 deletions(-) create mode 100644 Sources/SqlDatabase.Configuration.Test/AppConfiguration.default.xml rename Sources/{SqlDatabase.Test/Configuration => SqlDatabase.Configuration.Test}/AppConfiguration.empty.xml (100%) rename Sources/{SqlDatabase.Test/Configuration => SqlDatabase.Configuration.Test}/AppConfiguration.full.xml (87%) rename Sources/{SqlDatabase.Test/Configuration => SqlDatabase.Configuration.Test}/AppConfigurationTest.cs (69%) create mode 100644 Sources/SqlDatabase.Configuration.Test/ConfigurationManagerTest.cs create mode 100644 Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj rename Sources/{SqlDatabase.Test/app.config => SqlDatabase.Configuration.Test/SqlDatabase.dll.config} (60%) create mode 100644 Sources/SqlDatabase.Configuration/AppConfiguration.cs create mode 100644 Sources/SqlDatabase.Configuration/AssemblyScriptConfiguration.cs create mode 100644 Sources/SqlDatabase.Configuration/ConfigurationErrorsException.cs create mode 100644 Sources/SqlDatabase.Configuration/ConfigurationManager.cs create mode 100644 Sources/SqlDatabase.Configuration/ConfigurationReader.cs create mode 100644 Sources/SqlDatabase.Configuration/DatabaseConfiguration.cs rename Sources/{SqlDatabase/Configuration => SqlDatabase.Configuration}/IConfigurationManager.cs (100%) create mode 100644 Sources/SqlDatabase.Configuration/Properties/AssemblyInfo.cs create mode 100644 Sources/SqlDatabase.Configuration/SqlDatabase.Configuration.csproj delete mode 100644 Sources/SqlDatabase.Test/Configuration/AppConfiguration.default.xml delete mode 100644 Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs delete mode 100644 Sources/SqlDatabase/Configuration/AppConfiguration.cs delete mode 100644 Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs delete mode 100644 Sources/SqlDatabase/Configuration/ConfigurationManager.cs delete mode 100644 Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs index 50da8af2..50f5c53b 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/EntryPointResolverTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Moq; using NUnit.Framework; using Shouldly; diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs index d667f841..d3b86445 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/MsSqlDatabaseAdapterTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using Moq; using NUnit.Framework; diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs index aea93400..0a0528c7 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/MySqlDatabaseAdapterTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using Moq; using NUnit.Framework; diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs index 7d002af6..7c2bbf2b 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs +++ b/Sources/SqlDatabase.Adapter.MySql.Test/TextScriptOutputMySqlTest.cs @@ -4,7 +4,6 @@ using MySqlConnector; using NUnit.Framework; using Shouldly; -using SqlDatabase.Adapter; using SqlDatabase.Adapter.Sql; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs index 2bacf671..7f9e5895 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/PgSqlDatabaseAdapterTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using Moq; using NUnit.Framework; diff --git a/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs index 0837ad90..60c0e49e 100644 --- a/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs +++ b/Sources/SqlDatabase.Adapter.Sql.Test/TextScriptTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; diff --git a/Sources/SqlDatabase.Configuration.Test/AppConfiguration.default.xml b/Sources/SqlDatabase.Configuration.Test/AppConfiguration.default.xml new file mode 100644 index 00000000..ed085568 --- /dev/null +++ b/Sources/SqlDatabase.Configuration.Test/AppConfiguration.default.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Sources/SqlDatabase.Test/Configuration/AppConfiguration.empty.xml b/Sources/SqlDatabase.Configuration.Test/AppConfiguration.empty.xml similarity index 100% rename from Sources/SqlDatabase.Test/Configuration/AppConfiguration.empty.xml rename to Sources/SqlDatabase.Configuration.Test/AppConfiguration.empty.xml diff --git a/Sources/SqlDatabase.Test/Configuration/AppConfiguration.full.xml b/Sources/SqlDatabase.Configuration.Test/AppConfiguration.full.xml similarity index 87% rename from Sources/SqlDatabase.Test/Configuration/AppConfiguration.full.xml rename to Sources/SqlDatabase.Configuration.Test/AppConfiguration.full.xml index 205a728e..171431e9 100644 --- a/Sources/SqlDatabase.Test/Configuration/AppConfiguration.full.xml +++ b/Sources/SqlDatabase.Configuration.Test/AppConfiguration.full.xml @@ -1,10 +1,5 @@  - -
- - + + +"; + + private TempDirectory _temp = null!; + private ConfigurationManager _sut = null!; + + [SetUp] + public void BeforeEachTest() + { + _temp = new TempDirectory(); + _sut = new ConfigurationManager(); + } + + [TearDown] + public void AfterEachTest() + { + _temp.Dispose(); + } + + [Test] + public void LoadFromCurrentConfiguration() + { + _sut.LoadFrom((string?)null); + + _sut.SqlDatabase.ShouldNotBeNull(); + _sut.SqlDatabase.Variables.Keys.ShouldBe(new[] { nameof(ConfigurationManagerTest) }); + _sut.SqlDatabase.Variables[nameof(ConfigurationManagerTest)].ShouldBe(nameof(LoadFromCurrentConfiguration)); + } + + [Test] + public void LoadFromEmptyFile() + { + var fileName = Path.Combine(_temp.Location, "app.config"); + File.WriteAllText(fileName, ""); + + _sut.LoadFrom(fileName); + + _sut.SqlDatabase.ShouldNotBeNull(); + } + + [Test] + public void LoadFromFile() + { + var fileName = Path.Combine(_temp.Location, "app.config"); + File.WriteAllText(fileName, SomeConfiguration); + + _sut.LoadFrom(fileName); + + _sut.SqlDatabase.ShouldNotBeNull(); + _sut.SqlDatabase.GetCurrentVersionScript.ShouldBe("expected"); + } + + [Test] + [TestCase(ConfigurationManager.Name1)] + [TestCase(ConfigurationManager.Name2)] + public void LoadFromDirectory(string fileName) + { + File.WriteAllText(Path.Combine(_temp.Location, fileName), SomeConfiguration); + + _sut.LoadFrom(_temp.Location); + + _sut.SqlDatabase.ShouldNotBeNull(); + _sut.SqlDatabase.GetCurrentVersionScript.ShouldBe("expected"); + } + + [Test] + public void NotFoundInDirectory() + { + Assert.Throws(() => _sut.LoadFrom(_temp.Location)); + } + + [Test] + public void FileNotFound() + { + var fileName = Path.Combine(_temp.Location, "app.config"); + + Assert.Throws(() => _sut.LoadFrom(fileName)); + } + + [Test] + public void LoadInvalidConfiguration() + { + var fileName = Path.Combine(_temp.Location, "app.config"); + File.WriteAllText(fileName, ""); + + Assert.Throws(() => _sut.LoadFrom(fileName)); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj new file mode 100644 index 00000000..e7ee05b5 --- /dev/null +++ b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj @@ -0,0 +1,28 @@ + + + + net472;net6.0;net7.0 + SqlDatabase.Configuration + + + + + + + + + + + + + + + + + + + + Always + + + diff --git a/Sources/SqlDatabase.Test/app.config b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.dll.config similarity index 60% rename from Sources/SqlDatabase.Test/app.config rename to Sources/SqlDatabase.Configuration.Test/SqlDatabase.dll.config index 26185856..9fb7053c 100644 --- a/Sources/SqlDatabase.Test/app.config +++ b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.dll.config @@ -1,10 +1,5 @@  - -
- - Variables { get; } = new(StringComparer.OrdinalIgnoreCase); + + public DatabaseConfiguration MsSql { get; } = new(); + + public DatabaseConfiguration PgSql { get; } = new(); + + public DatabaseConfiguration MySql { get; } = new(); +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/AssemblyScriptConfiguration.cs b/Sources/SqlDatabase.Configuration/AssemblyScriptConfiguration.cs new file mode 100644 index 00000000..1a14ad6e --- /dev/null +++ b/Sources/SqlDatabase.Configuration/AssemblyScriptConfiguration.cs @@ -0,0 +1,11 @@ +namespace SqlDatabase.Configuration; + +public sealed class AssemblyScriptConfiguration +{ + internal const string PropertyClassName = "className"; + internal const string PropertyMethodName = "methodName"; + + public string? ClassName { get; set; } + + public string? MethodName { get; set; } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/ConfigurationErrorsException.cs b/Sources/SqlDatabase.Configuration/ConfigurationErrorsException.cs new file mode 100644 index 00000000..bdc00ae7 --- /dev/null +++ b/Sources/SqlDatabase.Configuration/ConfigurationErrorsException.cs @@ -0,0 +1,20 @@ +using System; + +namespace SqlDatabase.Configuration; + +public sealed class ConfigurationErrorsException : ApplicationException +{ + public ConfigurationErrorsException() + { + } + + public ConfigurationErrorsException(string message) + : base(message) + { + } + + public ConfigurationErrorsException(string message, Exception inner) + : base(message, inner) + { + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/ConfigurationManager.cs b/Sources/SqlDatabase.Configuration/ConfigurationManager.cs new file mode 100644 index 00000000..f687c454 --- /dev/null +++ b/Sources/SqlDatabase.Configuration/ConfigurationManager.cs @@ -0,0 +1,75 @@ +using System; +using System.IO; +using System.Linq; +using SqlDatabase.FileSystem; + +namespace SqlDatabase.Configuration; + +public sealed class ConfigurationManager : IConfigurationManager +{ + internal const string Name1 = "SqlDatabase.exe.config"; + internal const string Name2 = "SqlDatabase.dll.config"; + + public AppConfiguration SqlDatabase { get; private set; } = null!; + + public static string ResolveDefaultConfigurationFile(string probingPath) + { + var fileName = ResolveConfigurationFile(probingPath).Name; + return Path.Combine(probingPath, fileName); + } + + public void LoadFrom(string? configurationFile) + { + IFile source; + if (string.IsNullOrWhiteSpace(configurationFile)) + { + source = ResolveConfigurationFile(Path.GetDirectoryName(GetType().Assembly.Location)); + } + else + { + source = ResolveConfigurationFile(configurationFile!); + } + + try + { + using (var stream = source.OpenRead()) + { + SqlDatabase = ConfigurationReader.Read(stream); + } + } + catch (Exception ex) when ((ex as IOException) == null) + { + throw new ConfigurationErrorsException($"Fail to load configuration from [{configurationFile}].", ex); + } + } + + private static IFile ResolveConfigurationFile(string probingPath) + { + var info = FileSystemFactory.FileSystemInfoFromPath(probingPath); + return ResolveFile(info); + } + + private static IFile ResolveFile(IFileSystemInfo info) + { + IFile? file; + if (info is IFolder folder) + { + file = folder + .GetFiles() + .Where(i => Name1.Equals(i.Name, StringComparison.OrdinalIgnoreCase) || Name2.Equals(i.Name, StringComparison.OrdinalIgnoreCase)) + .OrderByDescending(i => i.Name, StringComparer.OrdinalIgnoreCase) + .FirstOrDefault(); + + if (file == null) + { + throw new FileNotFoundException($"Configuration file {Name2} not found in {info.Name}."); + } + } + else + { + file = (IFile)info; + } + + return file; + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/ConfigurationReader.cs b/Sources/SqlDatabase.Configuration/ConfigurationReader.cs new file mode 100644 index 00000000..b728ee18 --- /dev/null +++ b/Sources/SqlDatabase.Configuration/ConfigurationReader.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; + +namespace SqlDatabase.Configuration; + +internal static class ConfigurationReader +{ + public static AppConfiguration Read(Stream source) + { + var doc = new XmlDocument(); + doc.Load(source); + + var root = doc.SelectSingleNode($"configuration/{AppConfiguration.SectionName}"); + + var result = new AppConfiguration(); + if (root == null) + { + return result; + } + + result.GetCurrentVersionScript = root.GetAttribute(AppConfiguration.PropertyGetCurrentVersionScript); + result.SetCurrentVersionScript = root.GetAttribute(AppConfiguration.PropertySetCurrentVersionScript); + + ReadAssemblyScript(root.SelectSingleNode(AppConfiguration.PropertyAssemblyScript), result.AssemblyScript); + ReadVariables(root.SelectSingleNode(AppConfiguration.PropertyVariables), result.Variables); + ReadDatabase(root.SelectSingleNode(AppConfiguration.PropertyMsSql), result.MsSql); + ReadDatabase(root.SelectSingleNode(AppConfiguration.PropertyMySql), result.MySql); + ReadDatabase(root.SelectSingleNode(AppConfiguration.PropertyPgSql), result.PgSql); + + return result; + } + + private static void ReadVariables(XmlNode? source, Dictionary destination) + { + var entries = source?.SelectNodes("add"); + if (entries == null) + { + return; + } + + foreach (XmlNode entry in entries) + { + var name = entry.GetAttribute("name"); + var value = entry.GetAttribute("value"); + + if (string.IsNullOrWhiteSpace(name)) + { + throw new ConfigurationErrorsException($"The element {GetPath(entry)} does not contain expected attribute [name]."); + } + + if (destination.ContainsKey(name!)) + { + throw new ConfigurationErrorsException($"The element {GetPath(entry)} is duplicated, [name = {name}]."); + } + + destination.Add(name!, value ?? string.Empty); + } + } + + private static void ReadAssemblyScript(XmlNode? source, AssemblyScriptConfiguration destination) + { + destination.ClassName = source.GetAttribute(AssemblyScriptConfiguration.PropertyClassName); + destination.MethodName = source.GetAttribute(AssemblyScriptConfiguration.PropertyMethodName); + } + + private static void ReadDatabase(XmlNode? source, DatabaseConfiguration destination) + { + destination.GetCurrentVersionScript = source.GetAttribute(DatabaseConfiguration.PropertyGetCurrentVersionScript); + destination.SetCurrentVersionScript = source.GetAttribute(DatabaseConfiguration.PropertySetCurrentVersionScript); + ReadVariables(source?.SelectSingleNode(DatabaseConfiguration.PropertyVariables), destination.Variables); + } + + private static string? GetAttribute(this XmlNode? node, string name) + { + return node?.Attributes?[name]?.Value; + } + + private static string GetPath(XmlNode node) + { + var result = new StringBuilder(); + + XmlNode? current = node; + while (current != null) + { + if (result.Length > 0) + { + result.Insert(0, '/'); + } + + result.Insert(0, current.Name); + current = node.ParentNode; + } + + return result.ToString(); + } +} \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/DatabaseConfiguration.cs b/Sources/SqlDatabase.Configuration/DatabaseConfiguration.cs new file mode 100644 index 00000000..33891f8b --- /dev/null +++ b/Sources/SqlDatabase.Configuration/DatabaseConfiguration.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace SqlDatabase.Configuration; + +public sealed class DatabaseConfiguration +{ + internal const string PropertyGetCurrentVersionScript = "getCurrentVersion"; + internal const string PropertySetCurrentVersionScript = "setCurrentVersion"; + internal const string PropertyVariables = "variables"; + + public string? GetCurrentVersionScript { get; set; } + + public string? SetCurrentVersionScript { get; set; } + + public Dictionary Variables { get; } = new(StringComparer.OrdinalIgnoreCase); +} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/IConfigurationManager.cs b/Sources/SqlDatabase.Configuration/IConfigurationManager.cs similarity index 100% rename from Sources/SqlDatabase/Configuration/IConfigurationManager.cs rename to Sources/SqlDatabase.Configuration/IConfigurationManager.cs diff --git a/Sources/SqlDatabase.Configuration/Properties/AssemblyInfo.cs b/Sources/SqlDatabase.Configuration/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a33b37ec --- /dev/null +++ b/Sources/SqlDatabase.Configuration/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SqlDatabase.Configuration.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010055AB0DC1F8A24FB41E7358B65A606EC92141F1ABAFBFF062635AB5FAEB22308CFFBC8B54F3436694F14F6FD6C145D4F16C13A3E739FFCA837902BB78E2D51B890D964CC7384C2CC6B844AE37323F501F29E3EDC2DFADA82C99F5FBB5197ED757D795C2E5408DCB3FBAF9DDDF39E60B137ED0A23603A361EA811E6ADB605DFECC")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/Sources/SqlDatabase.Configuration/SqlDatabase.Configuration.csproj b/Sources/SqlDatabase.Configuration/SqlDatabase.Configuration.csproj new file mode 100644 index 00000000..c674cb4e --- /dev/null +++ b/Sources/SqlDatabase.Configuration/SqlDatabase.Configuration.csproj @@ -0,0 +1,10 @@ + + + + netstandard2.0 + + + + + + diff --git a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs index 2dda99b1..33bff8ac 100644 --- a/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs +++ b/Sources/SqlDatabase.Test/Commands/DatabaseCreateCommandTest.cs @@ -1,8 +1,8 @@ using System; -using System.Configuration; using Moq; using NUnit.Framework; using SqlDatabase.Adapter; +using SqlDatabase.Configuration; using SqlDatabase.Scripts; using SqlDatabase.Sequence; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Configuration/AppConfiguration.default.xml b/Sources/SqlDatabase.Test/Configuration/AppConfiguration.default.xml deleted file mode 100644 index 879ae67c..00000000 --- a/Sources/SqlDatabase.Test/Configuration/AppConfiguration.default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - -
- - - - diff --git a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs index 582b7e28..a2635078 100644 --- a/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/CommandLineBaseTest.cs @@ -1,6 +1,4 @@ -using System; -using System.Configuration; -using Moq; +using Moq; using NUnit.Framework; using Shouldly; using SqlDatabase.FileSystem; diff --git a/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs b/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs deleted file mode 100644 index f923e30f..00000000 --- a/Sources/SqlDatabase.Test/Configuration/ConfigurationManagerTest.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Configuration; -using System.IO; -using NUnit.Framework; -using Shouldly; -using SqlDatabase.TestApi; - -namespace SqlDatabase.Configuration; - -[TestFixture] -public class ConfigurationManagerTest -{ - public const string SomeConfiguration = @" - - -
- - - - - -"; - - private ConfigurationManager _sut = null!; - - [SetUp] - public void BeforeEachTest() - { - _sut = new ConfigurationManager(); - } - - [Test] - public void LoadFromCurrentConfiguration() - { - _sut.LoadFrom((string?)null); - - _sut.SqlDatabase.ShouldNotBeNull(); - _sut.SqlDatabase.Variables.AllKeys.ShouldBe(new[] { nameof(ConfigurationManagerTest) }); - _sut.SqlDatabase.Variables[nameof(ConfigurationManagerTest)].Value.ShouldBe(nameof(LoadFromCurrentConfiguration)); - } - - [Test] - public void LoadFromEmptyFile() - { - var file = FileFactory.File("app.config", ""); - - _sut.LoadFrom(file); - - Assert.IsNotNull(_sut.SqlDatabase); - Assert.AreEqual(new AppConfiguration().GetCurrentVersionScript, _sut.SqlDatabase.GetCurrentVersionScript); - } - - [Test] - public void LoadFromFile() - { - var file = FileFactory.File("app.config", SomeConfiguration); - - _sut.LoadFrom(file); - - Assert.IsNotNull(_sut.SqlDatabase); - Assert.AreEqual("expected", _sut.SqlDatabase.GetCurrentVersionScript); - } - - [Test] - public void LoadFromDirectory() - { - // SqlDatabase.exe.config or SqlDatabase.dll.config - var fileName = Path.GetFileName(_sut.GetType().Assembly.Location) + ".config"; - var file = FileFactory.File(fileName, SomeConfiguration); - var folder = FileFactory.Folder("some folder", file); - - _sut.LoadFrom(folder); - - Assert.IsNotNull(_sut.SqlDatabase); - Assert.AreEqual("expected", _sut.SqlDatabase.GetCurrentVersionScript); - } - - [Test] - public void NotFoundInDirectory() - { - var folder = FileFactory.Folder("some folder"); - - Assert.Throws(() => _sut.LoadFrom(folder)); - } - - [Test] - public void FileNotFound() - { - var file = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - - Assert.Throws(() => _sut.LoadFrom(file)); - } - - [Test] - public void LoadInvalidConfiguration() - { - var file = FileFactory.File("app.config", ""); - - Assert.Throws(() => _sut.LoadFrom(file)); - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs index 1e4d5491..fc8e4477 100644 --- a/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/EnvironmentBuilderTest.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Configuration; using Moq; using NUnit.Framework; using Shouldly; @@ -57,8 +56,8 @@ public void CreateDatabaseApplyVariables() .WithDataBase("Data Source=.;Initial Catalog=SqlDatabaseTest", TransactionMode.None, false) .WithVariables(variables); - _configuration.Variables.Add(new NameValueConfigurationElement("b", "2.2")); - _configuration.Variables.Add(new NameValueConfigurationElement("c", "3")); + _configuration.Variables.Add("b", "2.2"); + _configuration.Variables.Add("c", "3"); var actual = _sut.BuildDatabase().ShouldBeOfType(); @@ -79,7 +78,7 @@ public void CreateDatabaseValidateVariables() .WithDataBase("Data Source=.;Initial Catalog=SqlDatabaseTest", TransactionMode.None, false) .WithVariables(variables); - _configuration.Variables.Add(new NameValueConfigurationElement("c d", "1")); + _configuration.Variables.Add("c d", "1"); var ex = Assert.Throws(() => _sut.BuildDatabase()); diff --git a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs index bb9a39b0..016a2772 100644 --- a/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs +++ b/Sources/SqlDatabase.Test/Configuration/GenericCommandLineBuilderTest.cs @@ -1,5 +1,4 @@ -using System; -using NUnit.Framework; +using NUnit.Framework; using Shouldly; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs index 64f67700..27b373cb 100644 --- a/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs +++ b/Sources/SqlDatabase.Test/Log/FileLoggerTest.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; using NUnit.Framework; using Shouldly; using SqlDatabase.TestApi; diff --git a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs index c15b998e..5834b92c 100644 --- a/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs +++ b/Sources/SqlDatabase.Test/Scripts/DatabaseAdapterFactoryTest.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Configuration; using Moq; using NUnit.Framework; using Shouldly; diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index ccc3d302..b189f178 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -5,12 +5,6 @@ SqlDatabase - - - - - - @@ -22,15 +16,4 @@ - - - - - - - - - - - diff --git a/Sources/SqlDatabase.TestApi/ResourceReader.cs b/Sources/SqlDatabase.TestApi/ResourceReader.cs index c83ddf8b..5e751431 100644 --- a/Sources/SqlDatabase.TestApi/ResourceReader.cs +++ b/Sources/SqlDatabase.TestApi/ResourceReader.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -10,6 +11,19 @@ namespace SqlDatabase.TestApi; public static class ResourceReader { + public static Stream GetManifestResourceStream(string resourceName, Type? resourceAnchor = null) + { + if (resourceAnchor == null) + { + resourceAnchor = new StackTrace().GetFrame(1)!.GetMethod()!.DeclaringType; + } + + var result = resourceAnchor!.Assembly.GetManifestResourceStream(resourceAnchor.Namespace + "." + resourceName); + result.ShouldNotBeNull(resourceName); + + return result; + } + public static IEnumerable<(string Name, string Input, string[] Expected)> Read(Assembly assembly, string filter) { var sources = assembly diff --git a/Sources/SqlDatabase.sln b/Sources/SqlDatabase.sln index 259e9ff3..c0bc870f 100644 --- a/Sources/SqlDatabase.sln +++ b/Sources/SqlDatabase.sln @@ -38,27 +38,31 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.Assembl EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PowerShellScripts", "SqlDatabase.Adapter.PowerShellScripts\SqlDatabase.Adapter.PowerShellScripts.csproj", "{F8FEE835-4DFB-4143-BC93-EB7C50C951CB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PowerShellScripts.Test", "SqlDatabase.Adapter.PowerShellScripts.Test\SqlDatabase.Adapter.PowerShellScripts.Test.csproj", "{4539721A-947F-4AD1-B007-EE695761B8F9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PowerShellScripts.Test", "SqlDatabase.Adapter.PowerShellScripts.Test\SqlDatabase.Adapter.PowerShellScripts.Test.csproj", "{4539721A-947F-4AD1-B007-EE695761B8F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence", "SqlDatabase.Sequence\SqlDatabase.Sequence.csproj", "{AB3E3C7B-1475-4967-84DA-970D663D6FA3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Sequence", "SqlDatabase.Sequence\SqlDatabase.Sequence.csproj", "{AB3E3C7B-1475-4967-84DA-970D663D6FA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Sequence.Test", "SqlDatabase.Sequence.Test\SqlDatabase.Sequence.Test.csproj", "{1C4B4036-9C17-49AD-B087-A4D044296D1A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Sequence.Test", "SqlDatabase.Sequence.Test\SqlDatabase.Sequence.Test.csproj", "{1C4B4036-9C17-49AD-B087-A4D044296D1A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MsSql", "SqlDatabase.Adapter.MsSql\SqlDatabase.Adapter.MsSql.csproj", "{D45B3C71-75DF-4613-B0CD-356C7998BE27}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.MsSql", "SqlDatabase.Adapter.MsSql\SqlDatabase.Adapter.MsSql.csproj", "{D45B3C71-75DF-4613-B0CD-356C7998BE27}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MsSql.Test", "SqlDatabase.Adapter.MsSql.Test\SqlDatabase.Adapter.MsSql.Test.csproj", "{93FBF3ED-A6F3-4EBF-8779-A398D6654C03}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.MsSql.Test", "SqlDatabase.Adapter.MsSql.Test\SqlDatabase.Adapter.MsSql.Test.csproj", "{93FBF3ED-A6F3-4EBF-8779-A398D6654C03}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql", "SqlDatabase.Adapter.Sql\SqlDatabase.Adapter.Sql.csproj", "{267D99B6-4882-4ECE-8EEC-A15216D97692}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.Sql", "SqlDatabase.Adapter.Sql\SqlDatabase.Adapter.Sql.csproj", "{267D99B6-4882-4ECE-8EEC-A15216D97692}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.Sql.Test", "SqlDatabase.Adapter.Sql.Test\SqlDatabase.Adapter.Sql.Test.csproj", "{74003456-8C80-402A-AD68-24B02350ADDC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.Sql.Test", "SqlDatabase.Adapter.Sql.Test\SqlDatabase.Adapter.Sql.Test.csproj", "{74003456-8C80-402A-AD68-24B02350ADDC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql", "SqlDatabase.Adapter.PgSql\SqlDatabase.Adapter.PgSql.csproj", "{B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PgSql", "SqlDatabase.Adapter.PgSql\SqlDatabase.Adapter.PgSql.csproj", "{B6CB9CE4-ECA7-40AC-8926-AE2CBCCDB172}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.PgSql.Test", "SqlDatabase.Adapter.PgSql.Test\SqlDatabase.Adapter.PgSql.Test.csproj", "{33749EF7-49CE-4564-BF9D-5713806CC646}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.PgSql.Test", "SqlDatabase.Adapter.PgSql.Test\SqlDatabase.Adapter.PgSql.Test.csproj", "{33749EF7-49CE-4564-BF9D-5713806CC646}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MySql", "SqlDatabase.Adapter.MySql\SqlDatabase.Adapter.MySql.csproj", "{49B103C8-958D-41B2-AB22-EDF029947AB1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.MySql", "SqlDatabase.Adapter.MySql\SqlDatabase.Adapter.MySql.csproj", "{49B103C8-958D-41B2-AB22-EDF029947AB1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Adapter.MySql.Test", "SqlDatabase.Adapter.MySql.Test\SqlDatabase.Adapter.MySql.Test.csproj", "{D017ECF1-F2E3-4EAF-970B-F46991AD86F6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlDatabase.Adapter.MySql.Test", "SqlDatabase.Adapter.MySql.Test\SqlDatabase.Adapter.MySql.Test.csproj", "{D017ECF1-F2E3-4EAF-970B-F46991AD86F6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Configuration", "SqlDatabase.Configuration\SqlDatabase.Configuration.csproj", "{A351BD5C-F646-42BB-A1E0-EA63E88934D9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDatabase.Configuration.Test", "SqlDatabase.Configuration.Test\SqlDatabase.Configuration.Test.csproj", "{1D6B0790-DE5A-4057-AC65-76FA2E7EF198}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -162,6 +166,14 @@ Global {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {D017ECF1-F2E3-4EAF-970B-F46991AD86F6}.Release|Any CPU.Build.0 = Release|Any CPU + {A351BD5C-F646-42BB-A1E0-EA63E88934D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A351BD5C-F646-42BB-A1E0-EA63E88934D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A351BD5C-F646-42BB-A1E0-EA63E88934D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A351BD5C-F646-42BB-A1E0-EA63E88934D9}.Release|Any CPU.Build.0 = Release|Any CPU + {1D6B0790-DE5A-4057-AC65-76FA2E7EF198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D6B0790-DE5A-4057-AC65-76FA2E7EF198}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D6B0790-DE5A-4057-AC65-76FA2E7EF198}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D6B0790-DE5A-4057-AC65-76FA2E7EF198}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -179,6 +191,7 @@ Global {74003456-8C80-402A-AD68-24B02350ADDC} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {33749EF7-49CE-4564-BF9D-5713806CC646} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} {D017ECF1-F2E3-4EAF-970B-F46991AD86F6} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} + {1D6B0790-DE5A-4057-AC65-76FA2E7EF198} = {6E9C8ACC-7A1B-47F4-B7C0-78DE8C931A08} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CFDC1B98-55BE-40C3-BF95-A2BA8182DC40} diff --git a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs index db0c2b9d..cfd63119 100644 --- a/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs +++ b/Sources/SqlDatabase/Commands/DatabaseCreateCommand.cs @@ -1,6 +1,6 @@ -using System.Configuration; -using System.Diagnostics; +using System.Diagnostics; using SqlDatabase.Adapter; +using SqlDatabase.Configuration; using SqlDatabase.Scripts; using SqlDatabase.Sequence; diff --git a/Sources/SqlDatabase/Configuration/AppConfiguration.cs b/Sources/SqlDatabase/Configuration/AppConfiguration.cs deleted file mode 100644 index e40b43d0..00000000 --- a/Sources/SqlDatabase/Configuration/AppConfiguration.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Configuration; - -namespace SqlDatabase.Configuration; - -public sealed class AppConfiguration : ConfigurationSection -{ - public const string SectionName = "sqlDatabase"; - - private const string PropertyGetCurrentVersionScript = "getCurrentVersion"; - private const string PropertySetCurrentVersionScript = "setCurrentVersion"; - private const string PropertyAssemblyScript = "assemblyScript"; - private const string PropertyVariables = "variables"; - private const string PropertyMsSql = "mssql"; - private const string PropertyPgSql = "pgsql"; - private const string PropertyMySql = "mysql"; - - [ConfigurationProperty(PropertyGetCurrentVersionScript)] - public string GetCurrentVersionScript - { - get => (string)this[PropertyGetCurrentVersionScript]; - set => this[PropertyGetCurrentVersionScript] = value; - } - - [ConfigurationProperty(PropertySetCurrentVersionScript)] - public string SetCurrentVersionScript - { - get => (string)this[PropertySetCurrentVersionScript]; - set => this[PropertySetCurrentVersionScript] = value; - } - - [ConfigurationProperty(PropertyAssemblyScript)] - public AssemblyScriptConfiguration AssemblyScript => (AssemblyScriptConfiguration)this[PropertyAssemblyScript]; - - [ConfigurationProperty(PropertyVariables)] - public NameValueConfigurationCollection Variables => (NameValueConfigurationCollection)this[PropertyVariables]; - - [ConfigurationProperty(PropertyMsSql)] - public DatabaseConfiguration MsSql => (DatabaseConfiguration)this[PropertyMsSql]; - - [ConfigurationProperty(PropertyPgSql)] - public DatabaseConfiguration PgSql => (DatabaseConfiguration)this[PropertyPgSql]; - - [ConfigurationProperty(PropertyMySql)] - public DatabaseConfiguration MySql => (DatabaseConfiguration)this[PropertyMySql]; -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs b/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs deleted file mode 100644 index 54f9dabd..00000000 --- a/Sources/SqlDatabase/Configuration/AssemblyScriptConfiguration.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Configuration; - -namespace SqlDatabase.Configuration; - -public sealed class AssemblyScriptConfiguration : ConfigurationElement -{ - private const string PropertyClassName = "className"; - private const string PropertyMethodName = "methodName"; - - public AssemblyScriptConfiguration() - { - } - - public AssemblyScriptConfiguration(string className, string methodName) - { - ClassName = className; - MethodName = methodName; - } - - [ConfigurationProperty(PropertyClassName)] - public string? ClassName - { - get => (string?)this[PropertyClassName]; - set => this[PropertyClassName] = value; - } - - [ConfigurationProperty(PropertyMethodName)] - public string? MethodName - { - get => (string?)this[PropertyMethodName]; - set => this[PropertyMethodName] = value; - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs b/Sources/SqlDatabase/Configuration/ConfigurationManager.cs deleted file mode 100644 index 11e603a8..00000000 --- a/Sources/SqlDatabase/Configuration/ConfigurationManager.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Configuration; -using System.IO; -using System.Linq; -using SqlDatabase.FileSystem; -using Manager = System.Configuration.ConfigurationManager; - -namespace SqlDatabase.Configuration; - -internal sealed class ConfigurationManager : IConfigurationManager -{ - public AppConfiguration SqlDatabase { get; private set; } = null!; - - public static string ResolveDefaultConfigurationFile(string probingPath) - { - var info = FileSystemFactory.FileSystemInfoFromPath(probingPath); - var fileName = ResolveFile(info).Name; - - return Path.Combine(probingPath, fileName); - } - - public void LoadFrom(string? configurationFile) - { - try - { - var info = string.IsNullOrEmpty(configurationFile) ? null : FileSystemFactory.FileSystemInfoFromPath(configurationFile); - LoadFrom(info); - } - catch (Exception ex) when ((ex as IOException) == null) - { - throw new ConfigurationErrorsException($"Fail to load configuration from [{configurationFile}].", ex); - } - } - - internal void LoadFrom(IFileSystemInfo? info) - { - AppConfiguration? section; - if (info == null) - { - section = LoadCurrent(); - } - else - { - section = Load(info); - } - - SqlDatabase = section ?? new AppConfiguration(); - } - - private static AppConfiguration? LoadCurrent() - { - return (AppConfiguration)Manager.GetSection(AppConfiguration.SectionName); - } - - private static AppConfiguration Load(IFileSystemInfo info) - { - var file = ResolveFile(info); - - var tempFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - try - { - using (var destination = new FileStream(tempFile, FileMode.Create, FileAccess.ReadWrite)) - using (var source = file.OpenRead()) - { - source.CopyTo(destination); - } - - var configuration = Manager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = tempFile }, ConfigurationUserLevel.None); - return (AppConfiguration)configuration.GetSection(AppConfiguration.SectionName); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - private static IFile ResolveFile(IFileSystemInfo info) - { - IFile? file; - if (info is IFolder folder) - { - const string Name1 = "SqlDatabase.exe.config"; - const string Name2 = "SqlDatabase.dll.config"; - - var fileName = Path.GetFileName(typeof(ConfigurationManager).Assembly.Location) + ".config"; - file = folder - .GetFiles() - .Where(i => Name1.Equals(i.Name, StringComparison.OrdinalIgnoreCase) || Name2.Equals(i.Name, StringComparison.OrdinalIgnoreCase)) - .OrderByDescending(i => i.Name, StringComparer.OrdinalIgnoreCase) - .FirstOrDefault(); - - if (file == null) - { - throw new FileNotFoundException($"Configuration file {fileName} not found in {info.Name}."); - } - } - else - { - file = (IFile)info; - } - - return file; - } -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs b/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs deleted file mode 100644 index 760aab58..00000000 --- a/Sources/SqlDatabase/Configuration/DatabaseConfiguration.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Configuration; - -namespace SqlDatabase.Configuration; - -public sealed class DatabaseConfiguration : ConfigurationElement -{ - private const string PropertyGetCurrentVersionScript = "getCurrentVersion"; - private const string PropertySetCurrentVersionScript = "setCurrentVersion"; - private const string PropertyVariables = "variables"; - - [ConfigurationProperty(PropertyGetCurrentVersionScript)] - public string? GetCurrentVersionScript - { - get => (string?)this[PropertyGetCurrentVersionScript]; - set => this[PropertyGetCurrentVersionScript] = value; - } - - [ConfigurationProperty(PropertySetCurrentVersionScript)] - public string? SetCurrentVersionScript - { - get => (string?)this[PropertySetCurrentVersionScript]; - set => this[PropertySetCurrentVersionScript] = value; - } - - [ConfigurationProperty(PropertyVariables)] - public NameValueConfigurationCollection Variables => (NameValueConfigurationCollection)this[PropertyVariables]; -} \ No newline at end of file diff --git a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs index a7448e2b..8061a7d3 100644 --- a/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs +++ b/Sources/SqlDatabase/Configuration/EnvironmentBuilder.cs @@ -48,7 +48,7 @@ public IEnvironmentBuilder WithPowerShellScripts(string? installationPath) public IEnvironmentBuilder WithAssemblyScripts() { var configuration = GetConfiguration().AssemblyScript; - _assemblyScript = new AssemblyScriptFactory(configuration.ClassName, configuration.ClassName); + _assemblyScript = new AssemblyScriptFactory(configuration.ClassName, configuration.MethodName); return this; } @@ -132,9 +132,9 @@ private Database CreateDatabase() var database = new Database(adapter, GetLogger(), _transactionMode, _whatIf); var configurationVariables = GetConfiguration().Variables; - foreach (var name in configurationVariables.AllKeys) + foreach (var name in configurationVariables.Keys) { - database.Variables.SetValue(VariableSource.ConfigurationFile, name, configurationVariables[name].Value); + database.Variables.SetValue(VariableSource.ConfigurationFile, name, configurationVariables[name]); } foreach (var entry in _variables) diff --git a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs index eb465a89..9eaf2874 100644 --- a/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs +++ b/Sources/SqlDatabase/Scripts/DatabaseAdapterFactory.cs @@ -1,5 +1,4 @@ using System; -using System.Configuration; using SqlDatabase.Adapter; using SqlDatabase.Adapter.MsSql; using SqlDatabase.Adapter.MySql; diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index 64e5fcad..ec37d066 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -11,14 +11,6 @@ SqlDatabase SqlDatabase.GlobalTool - - - - - - - - @@ -27,6 +19,7 @@ + From 42a4bbc309d087af831a69c2c8ee09b66e1f9421 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:30:47 +0100 Subject: [PATCH 27/38] (c) 2023 --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 2aefa8f2..f6d2bfe7 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018-2021 max-ieremenko +Copyright (c) 2018-2023 max-ieremenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From e9247461f9bcc4c5a3d49183a17d44d406897402 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:32:59 +0100 Subject: [PATCH 28/38] PowerShell copy dependencies --- .../System.Management.Automation.dll | Bin 3010560 -> 0 bytes .../SqlDatabase.Adapter.MsSql.csproj | 5 +++++ ...lDatabase.Adapter.PowerShellScripts.csproj | 8 +------- .../SqlDatabase.PowerShell.csproj | 17 ++++++++--------- .../SqlDatabase.PowerShell/SqlDatabase.psd1 | Bin 2992 -> 2968 bytes 5 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 Sources/Dependencies/System.Management.Automation.dll diff --git a/Sources/Dependencies/System.Management.Automation.dll b/Sources/Dependencies/System.Management.Automation.dll deleted file mode 100644 index 3ca6528d8bac05d7239b6982862094600ae5323a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010560 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

LI>FU`UP79-@;+^yt1S!7Y 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%0A@9tXT+#fGI&qZ7@vxPp>?rb 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

pq_2*(P3HA(;8%M00j@Mo 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 z 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 z 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Ð!bm&G#s_)r}DN09e@?-o$H23p@Jc5=D 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%0A2BZ*L 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≈Qp4z=B^*2ES$2lil8B|!ItIZUi+?8m;e?a+-AwE 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�jWO=np} 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

RmF@9)e(guun@Y`KTWJ3y(Xqj4 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 L7c21pV+H;f%J`Lx diff --git a/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj b/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj index e96110aa..80a96461 100644 --- a/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj +++ b/Sources/SqlDatabase.Adapter.MsSql/SqlDatabase.Adapter.MsSql.csproj @@ -2,8 +2,13 @@ net472;netstandard2.0 + bin\ + diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj index 41129bef..2b82949b 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj @@ -4,13 +4,7 @@ net472;net6.0;net7.0;netstandard2.0 - - - ..\Dependencies\System.Management.Automation.dll - - - - + diff --git a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj index b22c5e11..a7bdf37c 100644 --- a/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj +++ b/Sources/SqlDatabase.PowerShell/SqlDatabase.PowerShell.csproj @@ -25,16 +25,15 @@ - - - - + + - - - - - + + + + + + diff --git a/Sources/SqlDatabase.PowerShell/SqlDatabase.psd1 b/Sources/SqlDatabase.PowerShell/SqlDatabase.psd1 index 85df07c38f99518bebb2829bf4d9f5d3f114720d..8bf15a68727790677f5377e4d1132a4bc25f5791 100644 GIT binary patch delta 20 acmdlWK0|y$4yPf59)l4O8*l7Y<^}*b$OPH| delta 21 ccmbOszCnCK4s$g_^+Zo;=30i@jit)m08VlSvH$=8 From 3f7d4452564c28c29d47d5c47f691fe1faa853f7 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:34:29 +0100 Subject: [PATCH 29/38] split projects: adapt local build --- Build/build-tasks.it-linux.ps1 | 2 +- Build/build-tasks.it-ps-core.ps1 | 2 +- Build/build-tasks.it-ps-desktop.ps1 | 6 +- Build/build-tasks.it-tool-linux.ps1 | 2 +- Build/build-tasks.it-win.ps1 | 2 +- Build/build-tasks.ps1 | 100 ++++++++---------- Build/build-tasks.third-party.ps1 | 8 +- Build/build-tasks.unit-test.ps1 | 65 ++++++------ .../configuration/appsettings.json | 2 +- 9 files changed, 92 insertions(+), 97 deletions(-) diff --git a/Build/build-tasks.it-linux.ps1 b/Build/build-tasks.it-linux.ps1 index 50aee137..1e3efe34 100644 --- a/Build/build-tasks.it-linux.ps1 +++ b/Build/build-tasks.it-linux.ps1 @@ -5,7 +5,7 @@ param( , $image ) -task Test StartDatabase, UnZip, RunTest +task Default StartDatabase, UnZip, RunTest Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } diff --git a/Build/build-tasks.it-ps-core.ps1 b/Build/build-tasks.it-ps-core.ps1 index 1718ca79..f0eaf957 100644 --- a/Build/build-tasks.it-ps-core.ps1 +++ b/Build/build-tasks.it-ps-core.ps1 @@ -4,7 +4,7 @@ param( , $image ) -task Test StartDatabase, RunTest +task Default StartDatabase, RunTest Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } diff --git a/Build/build-tasks.it-ps-desktop.ps1 b/Build/build-tasks.it-ps-desktop.ps1 index aae0bec4..c86dec2c 100644 --- a/Build/build-tasks.it-ps-desktop.ps1 +++ b/Build/build-tasks.it-ps-desktop.ps1 @@ -3,7 +3,7 @@ param( , $database ) -task Test RunContainers, CopyModule, PublishModule, RunTest +task Default RunContainers, CopyModule, PublishModule, RunTest Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } @@ -47,5 +47,7 @@ Exit-Build { Remove-Item -Path $testDir -Force -Recurse } - exec { docker container rm -f $containerId } | Out-Null + if ($containerId) { + exec { docker container rm -f $containerId } | Out-Null + } } \ No newline at end of file diff --git a/Build/build-tasks.it-tool-linux.ps1 b/Build/build-tasks.it-tool-linux.ps1 index 6b0f3cd3..5e3cdd72 100644 --- a/Build/build-tasks.it-tool-linux.ps1 +++ b/Build/build-tasks.it-tool-linux.ps1 @@ -4,7 +4,7 @@ param( , $image ) -task Test StartDatabase, RunTest +task Default StartDatabase, RunTest Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } diff --git a/Build/build-tasks.it-win.ps1 b/Build/build-tasks.it-win.ps1 index fd83a9dd..ead3a4c5 100644 --- a/Build/build-tasks.it-win.ps1 +++ b/Build/build-tasks.it-win.ps1 @@ -4,7 +4,7 @@ param( , $database ) -task Test StartDatabase, UnZip, RunTest +task Default StartDatabase, UnZip, RunTest Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } diff --git a/Build/build-tasks.ps1 b/Build/build-tasks.ps1 index 93712fe9..57664923 100644 --- a/Build/build-tasks.ps1 +++ b/Build/build-tasks.ps1 @@ -10,26 +10,26 @@ task Initialize { $artifacts = Join-Path $bin "artifacts" $script:settings = @{ - nugetexe = Join-Path $PSScriptRoot "nuget.exe"; - sources = $sources; - bin = $bin; + nugetexe = Join-Path $PSScriptRoot "nuget.exe" + sources = $sources + bin = $bin artifacts = $artifacts artifactsPowerShell = Join-Path $artifacts "PowerShell" integrationTests = Join-Path $bin "IntegrationTests" - version = Get-Version -SourcePath $sources; - repositoryCommitId = git rev-parse HEAD; + version = Get-Version -SourcePath $sources + repositoryCommitId = git rev-parse HEAD } - $script:databases = $("MsSql", "PgSql", "MySql") + $script:frameworks = "net472", "net6.0", "net7.0" + $script:databases = "MsSql", "PgSql", "MySql" Write-Output "PackageVersion: $($settings.version)" Write-Output "CommitId: $($settings.repositoryCommitId)" } task Clean { - if (Test-Path $settings.bin) { - Remove-Item -Path $settings.bin -Recurse -Force - } + Remove-DirectoryRecurse -Path $settings.bin + Remove-DirectoryRecurse -Path $settings.sources -Filters "bin", "obj" New-Item -Path $settings.bin -ItemType Directory | Out-Null } @@ -67,7 +67,7 @@ task PackPoweShellModule { # .psd1 set module version $psdFile = Join-Path $dest "SqlDatabase.psd1" - ((Get-Content -Path $psdFile -Raw) -replace '{{ModuleVersion}}', $settings.version) | Set-Content -Path $psdFile + ((Get-Content -Path $psdFile -Raw) -replace '1.2.3', $settings.version) | Set-Content -Path $psdFile # copy license Copy-Item -Path (Join-Path $settings.sources "..\LICENSE.md") -Destination $dest @@ -85,7 +85,7 @@ task PackNuget472 PackPoweShellModule, { } $nuspec = Join-Path $settings.sources "SqlDatabase.Package\nuget\package.nuspec" - Exec { + exec { & $($settings.nugetexe) pack ` -NoPackageAnalysis ` -verbosity detailed ` @@ -98,6 +98,8 @@ task PackNuget472 PackPoweShellModule, { } task PackManualDownload PackGlobalTool, PackPoweShellModule, { + Get-ChildItem -Path $settings.bin -Recurse -Directory -Filter "publish" | Remove-Item -Force -Recurse + $out = $settings.artifacts $lic = Join-Path $settings.sources "..\LICENSE.md" $thirdParty = Join-Path $settings.bin "ThirdPartyNotices.txt" @@ -107,8 +109,7 @@ task PackManualDownload PackGlobalTool, PackPoweShellModule, { $source = Join-Path $settings.artifactsPowerShell "*" Compress-Archive -Path $source -DestinationPath $destination - $targets = "net472", "net6.0", "net7.0" - foreach ($target in $targets) { + foreach ($target in $frameworks) { $destination = Join-Path $out "SqlDatabase.$packageVersion-$target.zip" $source = Join-Path $settings.bin "SqlDatabase\$target\*" Compress-Archive -Path $source, $lic, $thirdParty -DestinationPath $destination @@ -116,13 +117,16 @@ task PackManualDownload PackGlobalTool, PackPoweShellModule, { } task UnitTest { - $builds = @( - @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net472" } - @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net6.0" } - @{ File = "build-tasks.unit-test.ps1"; Task = "Test"; settings = $settings; targetFramework = "net7.0" } - ) + $builds = @() + foreach ($case in $frameworks) { + $builds += @{ + File = "build-tasks.unit-test.ps1" + Sources = $settings.sources + Framework = $case + } + } - Build-Parallel $builds -ShowParameter targetFramework -MaximumBuilds 4 + Build-Parallel $builds -ShowParameter Framework -MaximumBuilds 4 } task InitializeIntegrationTest { @@ -132,8 +136,9 @@ task InitializeIntegrationTest { } Copy-Item -Path (Join-Path $settings.sources "SqlDatabase.Test\IntegrationTests") -Destination $dest -Force -Recurse + $assemblyScript = Join-Path $settings.bin "..\Examples\CSharpMirationStep\bin\Release\net472\2.1_2.2.*" foreach ($database in $databases) { - Copy-Item -Path (Join-Path $settings.bin "Tests\net472\2.1_2.2.*") -Destination (Join-Path $dest "$database\Upgrade") -Force + Copy-Item -Path $assemblyScript -Destination (Join-Path $dest "$database\Upgrade") -Force } $bashLine = "sed -i 's/\r//g'" @@ -146,7 +151,7 @@ task InitializeIntegrationTest { exec { docker run --rm ` -v $test ` - mcr.microsoft.com/dotnet/core/sdk:3.1 ` + mcr.microsoft.com/dotnet/sdk:7.0 ` bash -c $bashLine } } @@ -155,10 +160,9 @@ task PsDesktopTest { $builds = @() foreach ($database in $databases) { $builds += @{ - File = "build-tasks.it-ps-desktop.ps1"; - Task = "Test"; - settings = $settings; - database = $database; + File = "build-tasks.it-ps-desktop.ps1" + settings = $settings + database = $database } } @@ -195,11 +199,10 @@ task PsCoreTest { foreach ($image in $images) { foreach ($database in $databases) { $builds += @{ - File = "build-tasks.it-ps-core.ps1"; - Task = "Test"; - settings = $settings; - database = $database; - image = $image; + File = "build-tasks.it-ps-core.ps1" + settings = $settings + database = $database + image = $image } } } @@ -216,11 +219,10 @@ task SdkToolTest { foreach ($image in $images) { foreach ($database in $databases) { $builds += @{ - File = "build-tasks.it-tool-linux.ps1"; - Task = "Test"; - settings = $settings; - database = $database; - image = $image; + File = "build-tasks.it-tool-linux.ps1" + settings = $settings + database = $database + image = $image } } } @@ -238,12 +240,11 @@ task NetRuntimeLinuxTest { foreach ($case in $testCases) { foreach ($database in $databases) { $builds += @{ - File = "build-tasks.it-linux.ps1"; - Task = "Test"; - settings = $settings; - targetFramework = $case.targetFramework; - database = $database; - image = $case.image; + File = "build-tasks.it-linux.ps1" + settings = $settings + targetFramework = $case.targetFramework + database = $database + image = $case.image } } } @@ -252,21 +253,14 @@ task NetRuntimeLinuxTest { } task NetRuntimeWindowsTest { - $testCases = $( - "net472" - , "net6.0" - , "net7.0" - ) - $builds = @() - foreach ($case in $testCases) { + foreach ($case in $frameworks) { foreach ($database in $databases) { $builds += @{ - File = "build-tasks.it-win.ps1"; - Task = "Test"; - settings = $settings; - targetFramework = $case; - database = $database; + File = "build-tasks.it-win.ps1" + settings = $settings + targetFramework = $case + database = $database } } } diff --git a/Build/build-tasks.third-party.ps1 b/Build/build-tasks.third-party.ps1 index b0d83e82..4dfb9433 100644 --- a/Build/build-tasks.third-party.ps1 +++ b/Build/build-tasks.third-party.ps1 @@ -6,13 +6,7 @@ task Default Update, Test, Publish Enter-Build { $repository = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "third-party-libraries")) - - $sourceDir = $settings.sources - $sources = (Join-Path $sourceDir "SqlDatabase"), - (Join-Path $sourceDir "SqlDatabase.Test"), - (Join-Path $sourceDir "SqlDatabase.PowerShell"), - (Join-Path $sourceDir "SqlDatabase.PowerShell.Test"), - (Join-Path $sourceDir "SqlDatabase.Test") + $sources = $settings.sources } task Update { diff --git a/Build/build-tasks.unit-test.ps1 b/Build/build-tasks.unit-test.ps1 index acbfcd0a..3e0c432a 100644 --- a/Build/build-tasks.unit-test.ps1 +++ b/Build/build-tasks.unit-test.ps1 @@ -1,37 +1,57 @@ param( - $settings, - $targetFramework + [Parameter(Mandatory)] + [ValidateScript({ Test-Path $_ })] + [string] + $Sources, + + [Parameter(Mandatory)] + [ValidateSet("net472", "net6.0", "net7.0")] + [string] + $Framework ) -task Test RunContainers, UpdateConfig, RunTests +task Default RunContainers, UpdateConfig, RunTests Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } -$mssqlContainerId = "" -$mssqlConnectionString = "empty" -$pgsqlContainerId = "" -$pgsqlConnectionString = "empty" -$mysqlContainerId = "" -$mysqlConnectionString = "empty" -$testDir = Join-Path (Join-Path $settings.bin "Tests") $targetFramework +$containerIds = @() +$mssqlConnectionString = "" +$pgsqlConnectionString = "" +$mysqlConnectionString = "" Enter-Build { - Write-Output "$testDir" + $testList = Get-ChildItem -Path $Sources -Recurse -Filter *.Test.dll ` + | Where-Object FullName -Match \\$Framework\\ ` + | Where-Object FullName -Match \\bin\\Release\\ ` + | Where-Object FullName -NotMatch \\$Framework\\ref\\ ` + | ForEach-Object { $_.FullName } + + if (-not $testList) { + throw "Test list is empty." + } + + $testList +} + +Exit-Build { + if ($containerIds) { + exec { docker container rm -f $containerIds } | Out-Null + } } task RunContainers { $info = Start-Mssql - $script:mssqlContainerId = $info.containerId + $script:containerIds += $info.containerId $script:mssqlConnectionString = $info.connectionString Write-Output $mssqlConnectionString $info = Start-Pgsql - $script:pgsqlContainerId = $info.containerId + $script:containerIds += $info.containerId $script:pgsqlConnectionString = $info.connectionString Write-Output $pgsqlConnectionString $info = Start-Mysql - $script:mysqlContainerId = $info.containerId + $script:containerIds += $info.containerId $script:mysqlConnectionString = $info.connectionString Write-Output $mysqlConnectionString @@ -40,9 +60,8 @@ task RunContainers { Wait-Mysql $mysqlConnectionString } - task UpdateConfig { - $configFiles = Get-ChildItem -Path $testDir -Filter *.dll.config + $configFiles = $testList | ForEach-Object { Split-Path -Path $_ -Parent } | Sort-Object | Get-Unique | Get-ChildItem -Filter *.dll.config foreach ($configFile in $configFiles) { [xml]$config = Get-Content $configFile @@ -67,19 +86,5 @@ task UpdateConfig { } task RunTests { - $testList = Get-ChildItem -Path $testDir -Filter *.Test.dll ` - | Where-Object FullName -NotMatch \\ref\\ ` - | ForEach-Object {$_.FullName} - - if (-not $testList) { - throw "Test list is empty." - } - - $testList exec { dotnet vstest $testList } } - - -Exit-Build { - exec { docker container rm -f $mssqlContainerId $pgsqlContainerId $mysqlContainerId } | Out-Null -} \ No newline at end of file diff --git a/Build/third-party-libraries/configuration/appsettings.json b/Build/third-party-libraries/configuration/appsettings.json index d1a5c7b9..ce053525 100644 --- a/Build/third-party-libraries/configuration/appsettings.json +++ b/Build/third-party-libraries/configuration/appsettings.json @@ -8,7 +8,7 @@ }, "internalPackages": { "byName": [ "StyleCop\\.Analyzers" ], - "byProjectName": [ "\\.Test$" ] + "byProjectName": [ "\\.Test*" ] } }, "npmjs.com": { From 2b77fbbb3e6d78d25cc413d38d6fb51ef34f68ea Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:35:19 +0100 Subject: [PATCH 30/38] .sln update dependencies --- Sources/Directory.Packages.props | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Sources/Directory.Packages.props b/Sources/Directory.Packages.props index 3a598665..7f87a2a5 100644 --- a/Sources/Directory.Packages.props +++ b/Sources/Directory.Packages.props @@ -8,21 +8,20 @@ - - - - - - + + + + + - - + + - + \ No newline at end of file From 88638abefea22df3f71a8e2edb1cc862e1e9a1ef Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 18:36:47 +0100 Subject: [PATCH 31/38] tpl update dependencies --- .../castle.core/{5.1.0 => 5.1.1}/index.json | 15 +-- .../{5.1.0 => 5.1.1}/package-LICENSE | 0 .../{5.1.0 => 5.1.1}/package.nuspec | 2 +- .../castle.core/{5.1.0 => 5.1.1}/readme.md | 13 ++- .../castle.core/{5.1.0 => 5.1.1}/remarks.md | 0 .../{5.1.0 => 5.1.1}/repository-LICENSE | 0 .../{5.1.0 => 5.1.1}/third-party-notices.txt | 0 .../{2.0.123 => 2.1.15}/index.json | 4 +- .../{2.0.123 => 2.1.15}/package.nuspec | 5 +- .../{2.0.123 => 2.1.15}/project-License.txt | 0 .../{2.0.123 => 2.1.15}/readme.md | 6 +- .../{2.0.123 => 2.1.15}/remarks.md | 0 .../repository-License.txt | 0 .../third-party-notices.txt | 0 .../diffengine/{10.0.0 => 11.3.0}/index.json | 8 +- .../{10.0.0 => 11.3.0}/package.nuspec | 50 ++++----- .../{10.0.0 => 11.3.0}/project-license.txt | 0 .../diffengine/{10.0.0 => 11.3.0}/readme.md | 8 +- .../diffengine/{10.0.0 => 11.3.0}/remarks.md | 0 .../{10.0.0 => 11.3.0}/repository-license.txt | 0 .../third-party-notices.txt | 0 .../nuget.org/emptyfiles/2.8.0/package.nuspec | 20 ---- .../emptyfiles/{2.8.0 => 4.4.0}/index.json | 10 +- .../nuget.org/emptyfiles/4.4.0/package.nuspec | 30 +++++ .../{2.8.0 => 4.4.0}/project-license.txt | 0 .../emptyfiles/{2.8.0 => 4.4.0}/readme.md | 9 +- .../emptyfiles/{2.8.0 => 4.4.0}/remarks.md | 0 .../{2.8.0 => 4.4.0}/repository-license.txt | 0 .../{2.8.0 => 4.4.0}/third-party-notices.txt | 0 .../17.4.0/project-LICENSE | 19 ---- .../17.4.0/repository-LICENSE | 19 ---- .../{17.4.0 => 17.7.2}/index.json | 7 +- .../package-LICENSE_NET.txt | 0 .../{17.4.0 => 17.7.2}/package.nuspec | 10 +- .../17.7.2/project-LICENSE} | 2 +- .../{17.4.0 => 17.7.2}/readme.md | 6 +- .../{17.4.0 => 17.7.2}/remarks.md | 0 .../17.7.2/repository-LICENSE} | 2 +- .../third-party-notices.txt | 0 .../microsoft.csharp/4.7.0/index.json | 28 +++++ .../4.7.0/package-LICENSE.TXT} | 0 .../microsoft.csharp/4.7.0/package.nuspec | 67 +++++++++++ .../microsoft.csharp/4.7.0/readme.md | 35 ++++++ .../4.7.0}/remarks.md | 0 .../4.7.0}/third-party-notices.txt | 0 .../17.4.0/project-LICENSE | 19 ---- .../17.4.0/repository-LICENSE | 19 ---- .../{17.4.0 => 17.7.2}/index.json | 11 +- .../package-LICENSE_NET.txt | 0 .../{17.4.0 => 17.7.2}/package.nuspec | 16 ++- .../17.7.2/project-LICENSE} | 2 +- .../{17.4.0 => 17.7.2}/readme.md | 10 +- .../17.7.2}/remarks.md | 0 .../17.7.2/repository-LICENSE} | 2 +- .../17.7.2}/third-party-notices.txt | 0 .../17.4.0/project-LICENSE | 19 ---- .../17.4.0/repository-LICENSE | 19 ---- .../{17.4.0 => 17.7.2}/index.json | 9 +- .../package-LICENSE_NET.txt | 0 .../{17.4.0 => 17.7.2}/package.nuspec | 16 ++- .../17.7.2/project-LICENSE | 23 ++++ .../{17.4.0 => 17.7.2}/readme.md | 8 +- .../17.7.2}/remarks.md | 0 .../17.7.2/repository-LICENSE | 23 ++++ .../17.7.2}/third-party-notices.txt | 0 .../17.4.0/project-LICENSE | 19 ---- .../17.4.0/repository-LICENSE | 19 ---- .../{17.4.0 => 17.7.2}/index.json | 11 +- .../package-LICENSE_NET.txt | 0 .../{17.4.0 => 17.7.2}/package.nuspec | 12 +- .../17.7.2/project-LICENSE | 23 ++++ .../{17.4.0 => 17.7.2}/readme.md | 10 +- .../17.7.2}/remarks.md | 0 .../17.7.2/repository-LICENSE | 23 ++++ .../17.7.2}/third-party-notices.txt | 0 .../microsoft.win32.registry/4.7.0/index.json | 11 +- .../microsoft.win32.registry/4.7.0/readme.md | 6 +- .../microsoft.win32.registry/5.0.0/index.json | 45 -------- .../5.0.0/package.nuspec | 94 ---------------- .../microsoft.win32.registry/5.0.0/readme.md | 40 ------- .../packages/nuget.org/moq/4.18.2/index.json | 44 -------- .../nuget.org/moq/4.18.2/package-License.txt | 29 ----- .../nuget.org/moq/4.18.2/package.nuspec | 34 ------ .../packages/nuget.org/moq/4.18.2/readme.md | 32 ------ .../packages/nuget.org/moq/4.20.69/index.json | 45 ++++++++ .../nuget.org/moq/4.20.69/package.nuspec | 36 ++++++ .../{4.18.2 => 4.20.69}/project-License.txt | 0 .../packages/nuget.org/moq/4.20.69/readme.md | 31 ++++++ .../moq/{4.18.2 => 4.20.69}/remarks.md | 0 .../repository-License.txt | 0 .../third-party-notices.txt | 0 .../mysqlconnector/1.3.10/index.json | 20 +++- .../nuget.org/mysqlconnector/1.3.10/readme.md | 11 +- .../mysqlconnector/1.3.10/repository-LICENSE | 2 +- .../{13.0.2 => 13.0.1}/index.json | 3 +- .../{13.0.2 => 13.0.1}/package-LICENSE.md | 0 .../newtonsoft.json/13.0.1/package.nuspec | 39 +++++++ .../{13.0.2 => 13.0.1}/readme.md | 4 +- .../{13.0.2 => 13.0.1}/remarks.md | 0 .../{13.0.2 => 13.0.1}/repository-LICENSE.md | 0 .../third-party-notices.txt | 0 .../13.0.3}/index.json | 6 +- .../newtonsoft.json/13.0.3/package-LICENSE.md | 20 ++++ .../{13.0.2 => 13.0.3}/package.nuspec | 4 +- .../newtonsoft.json/13.0.3/readme.md | 27 +++++ .../13.0.3}/remarks.md | 0 .../13.0.3/repository-LICENSE.md | 20 ++++ .../13.0.3}/third-party-notices.txt | 0 .../nuget.org/npgsql/4.0.11/index.json | 14 ++- .../nuget.org/npgsql/4.0.11/readme.md | 8 +- .../npgsql/4.0.11/repository-LICENSE | 2 +- .../{5.11.0 => 6.5.0}/index.json | 5 +- .../{5.11.0 => 6.5.0}/package.nuspec | 6 +- .../{5.11.0 => 6.5.0}/readme.md | 6 +- .../6.5.0}/remarks.md | 0 .../{5.11.0 => 6.5.0}/repository-LICENSE.txt | 0 .../6.5.0}/third-party-notices.txt | 0 .../nunit/{3.13.3 => 3.14.0}/index.json | 8 +- .../{3.13.3 => 3.14.0}/package-LICENSE.txt | 2 +- .../nunit/{3.13.3 => 3.14.0}/package.nuspec | 5 +- .../nunit/{3.13.3 => 3.14.0}/readme.md | 6 +- .../4.3.1 => nunit/3.14.0}/remarks.md | 0 .../{3.13.3 => 3.14.0}/repository-LICENSE.txt | 2 +- .../3.14.0}/third-party-notices.txt | 0 .../{4.3.1 => 4.5.0}/index.json | 3 +- .../{4.3.1 => 4.5.0}/package.nuspec | 9 +- .../{4.3.1 => 4.5.0}/readme.md | 6 +- .../4.5.0}/remarks.md | 0 .../{4.3.1 => 4.5.0}/repository-LICENSE | 2 +- .../4.5.0}/third-party-notices.txt | 0 .../shouldly/4.1.0/project-LICENSE.txt | 24 ---- .../nuget.org/shouldly/4.1.0/readme.md | 31 ------ .../shouldly/{4.1.0 => 4.2.1}/index.json | 17 +-- .../shouldly/{4.1.0 => 4.2.1}/package.nuspec | 16 ++- .../nuget.org/shouldly/4.2.1/readme.md | 32 ++++++ .../1.2.0.435 => shouldly/4.2.1}/remarks.md | 0 .../{4.1.0 => 4.2.1}/repository-LICENSE.txt | 0 .../4.2.1}/third-party-notices.txt | 0 .../{1.2.0.435 => 1.2.0.507}/index.json | 0 .../{1.2.0.435 => 1.2.0.507}/package-LICENSE | 0 .../{1.2.0.435 => 1.2.0.507}/package.nuspec | 4 +- .../{1.2.0.435 => 1.2.0.507}/project-LICENSE | 0 .../{1.2.0.435 => 1.2.0.507}/readme.md | 2 +- .../1.2.0.507}/remarks.md | 0 .../1.2.0.507}/third-party-notices.txt | 0 .../nuget.org/system.buffers/4.4.0/index.json | 6 +- .../nuget.org/system.buffers/4.4.0/readme.md | 4 +- .../nuget.org/system.buffers/4.5.1/index.json | 5 +- .../nuget.org/system.buffers/4.5.1/readme.md | 4 +- .../5.0.0 => system.codedom/6.0.0}/index.json | 10 +- .../6.0.0/package-LICENSE.TXT} | 0 .../{5.0.0 => 6.0.0}/package.nuspec | 23 ++-- .../system.codedom/{5.0.0 => 6.0.0}/readme.md | 10 +- .../4.5.0 => system.codedom/6.0.0}/remarks.md | 0 .../6.0.0}/repository-LICENSE.TXT | 0 .../6.0.0}/third-party-notices.txt | 0 .../4.5.0/package.nuspec | 59 ---------- .../4.5.0/readme.md | 37 ------ .../system.data.sqlclient/4.8.5/index.json | 19 +++- .../system.data.sqlclient/4.8.5/readme.md | 8 +- .../4.7.0/index.json | 5 +- .../4.7.0/readme.md | 4 +- .../4.7.0}/index.json | 15 +-- .../4.7.0/package-LICENSE.TXT} | 0 .../4.7.0}/package.nuspec | 44 ++++---- .../4.7.0/readme.md | 34 ++++++ .../{6.0.0 => 4.7.0}/remarks.md | 0 .../{6.0.0 => 4.7.0}/third-party-notices.txt | 0 .../6.0.0/package.nuspec | 33 ------ .../6.0.0/readme.md | 30 ----- .../6.0.1}/index.json | 13 ++- .../6.0.1/package-LICENSE.TXT} | 0 .../{5.0.0 => 6.0.1}/package.nuspec | 31 +++--- .../{5.0.0 => 6.0.1}/readme.md | 15 +-- .../{5.0.0 => 6.0.1}/remarks.md | 0 .../6.0.1}/repository-LICENSE.TXT | 0 .../{5.0.0 => 6.0.1}/third-party-notices.txt | 0 .../4.5.0/index.json | 16 +-- .../4.5.0/package-LICENSE.TXT} | 0 .../system.memory/4.5.0/package.nuspec | 78 +++++++++++++ .../nuget.org/system.memory/4.5.0/readme.md | 44 ++++++++ .../4.3.0 => system.memory/4.5.0}/remarks.md | 0 .../4.5.0}/third-party-notices.txt | 0 .../nuget.org/system.memory/4.5.3/index.json | 6 +- .../nuget.org/system.memory/4.5.3/readme.md | 4 +- .../nuget.org/system.memory/4.5.4/index.json | 5 +- .../nuget.org/system.memory/4.5.4/readme.md | 4 +- .../5.0.0 => system.memory/4.5.5}/index.json | 27 ++--- .../4.5.5/package-LICENSE.TXT} | 0 .../system.memory/4.5.5/package.nuspec | 105 ++++++++++++++++++ .../nuget.org/system.memory/4.5.5/readme.md | 44 ++++++++ .../5.0.0 => system.memory/4.5.5}/remarks.md | 0 .../4.5.5}/third-party-notices.txt | 0 .../system.numerics.vectors/4.4.0/index.json | 5 +- .../system.numerics.vectors/4.4.0/readme.md | 4 +- .../4.7.0/index.json | 28 +++++ .../4.7.0/package-LICENSE.TXT} | 0 .../4.7.0/package.nuspec | 59 ++++++++++ .../4.7.0/readme.md | 36 ++++++ .../4.7.0}/remarks.md | 0 .../4.7.0}/third-party-notices.txt | 0 .../4.7.0}/index.json | 13 +-- .../4.7.0/package-LICENSE.TXT} | 0 .../4.7.0/package.nuspec | 77 +++++++++++++ .../system.reflection.emit/4.7.0/readme.md | 43 +++++++ .../4.7.0}/remarks.md | 0 .../4.7.0}/third-party-notices.txt | 0 .../4.5.0/index.json | 6 +- .../4.5.0/package-LICENSE.TXT} | 0 .../4.5.0/package.nuspec | 37 ++++++ .../4.5.0/readme.md | 11 +- .../4.5.0}/remarks.md | 0 .../4.5.0}/third-party-notices.txt | 0 .../4.5.2/index.json | 6 +- .../4.5.2/readme.md | 4 +- .../4.5.3/index.json | 7 +- .../4.5.3/readme.md | 4 +- .../4.7.0/index.json | 5 +- .../4.7.0/readme.md | 4 +- .../4.3.0/package.nuspec | 52 --------- .../4.3.0/readme.md | 32 ------ .../system.runtime.loader/4.3.0/index.json | 6 +- .../system.runtime.loader/4.3.0/readme.md | 4 +- .../4.7.0/index.json | 3 +- .../4.7.0/readme.md | 2 +- .../5.0.0/readme.md | 39 ------- .../4.5.0/package-LICENSE.txt | 23 ---- .../4.5.0/package.nuspec | 49 -------- .../4.5.0/package-LICENSE.txt | 23 ---- .../4.5.0/package.nuspec | 39 ------- .../4.5.0/readme.md | 31 ------ .../4.7.0/index.json | 3 +- .../4.7.0/readme.md | 2 +- .../5.0.0/package-LICENSE.txt | 23 ---- .../5.0.0/package.nuspec | 68 ------------ .../5.0.0/project-LICENSE.TXT | 23 ---- .../5.0.0/readme.md | 39 ------- .../5.0.0/repository-LICENSE.TXT | 23 ---- .../4.7.0/index.json | 5 +- .../4.7.0/readme.md | 4 +- .../4.3.0/index.json | 11 +- .../4.3.0/package-dotnet_library_license.txt | 0 .../4.3.0/package.nuspec | 38 +++++++ .../4.3.0/readme.md | 29 +++++ .../4.3.0}/remarks.md | 0 .../4.3.0}/third-party-notices.txt | 0 .../4.5.2/index.json | 6 +- .../4.5.2/readme.md | 4 +- .../4.5.4/index.json | 7 +- .../4.5.4/readme.md | 4 +- .../system.valuetuple/4.5.0/index.json | 31 ------ .../4.5.0/package-LICENSE.txt | 23 ---- .../system.valuetuple/4.5.0/package.nuspec | 58 ---------- .../system.valuetuple/4.5.0/readme.md | 40 ------- Build/third-party-libraries/readme.md | 52 ++++----- 255 files changed, 1594 insertions(+), 1794 deletions(-) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/index.json (69%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/package-LICENSE (100%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/package.nuspec (98%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/readme.md (59%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/repository-LICENSE (100%) rename Build/third-party-libraries/packages/nuget.org/castle.core/{5.1.0 => 5.1.1}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/index.json (79%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/package.nuspec (91%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/project-License.txt (100%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/readme.md (71%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/repository-License.txt (100%) rename Build/third-party-libraries/packages/nuget.org/dapper.strongname/{2.0.123 => 2.1.15}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/index.json (87%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/package.nuspec (54%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/project-license.txt (100%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/readme.md (75%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/repository-license.txt (100%) rename Build/third-party-libraries/packages/nuget.org/diffengine/{10.0.0 => 11.3.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/package.nuspec rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/index.json (81%) create mode 100644 Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/package.nuspec rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/project-license.txt (100%) rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/readme.md (66%) rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/repository-license.txt (100%) rename Build/third-party-libraries/packages/nuget.org/emptyfiles/{2.8.0 => 4.4.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/project-LICENSE delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/index.json (73%) rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/package-LICENSE_NET.txt (100%) rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/package.nuspec (75%) rename Build/third-party-libraries/packages/nuget.org/{system.management/5.0.0/repository-LICENSE.TXT => microsoft.codecoverage/17.7.2/project-LICENSE} (95%) rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/readme.md (64%) rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0/package-LICENSE.txt => microsoft.codecoverage/17.7.2/repository-LICENSE} (95%) rename Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/{17.4.0 => 17.7.2}/third-party-notices.txt (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/index.json rename Build/third-party-libraries/packages/nuget.org/{microsoft.win32.registry/5.0.0/package-LICENSE.txt => microsoft.csharp/4.7.0/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{microsoft.net.test.sdk/17.4.0 => microsoft.csharp/4.7.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.net.test.sdk/17.4.0 => microsoft.csharp/4.7.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/project-LICENSE delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/{17.4.0 => 17.7.2}/index.json (73%) rename Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/{17.4.0 => 17.7.2}/package-LICENSE_NET.txt (100%) rename Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/{17.4.0 => 17.7.2}/package.nuspec (68%) rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0/project-LICENSE.TXT => microsoft.net.test.sdk/17.7.2/project-LICENSE} (95%) rename Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/{17.4.0 => 17.7.2}/readme.md (62%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.testplatform.objectmodel/17.4.0 => microsoft.net.test.sdk/17.7.2}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0/repository-LICENSE.TXT => microsoft.net.test.sdk/17.7.2/repository-LICENSE} (95%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.testplatform.objectmodel/17.4.0 => microsoft.net.test.sdk/17.7.2}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/project-LICENSE delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/{17.4.0 => 17.7.2}/index.json (76%) rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/{17.4.0 => 17.7.2}/package-LICENSE_NET.txt (100%) rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/{17.4.0 => 17.7.2}/package.nuspec (79%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/project-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/{17.4.0 => 17.7.2}/readme.md (66%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.testplatform.testhost/17.4.0 => microsoft.testplatform.objectmodel/17.7.2}/remarks.md (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/{microsoft.testplatform.testhost/17.4.0 => microsoft.testplatform.objectmodel/17.7.2}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/project-LICENSE delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/{17.4.0 => 17.7.2}/index.json (73%) rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/{17.4.0 => 17.7.2}/package-LICENSE_NET.txt (100%) rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/{17.4.0 => 17.7.2}/package.nuspec (75%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/project-LICENSE rename Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/{17.4.0 => 17.7.2}/readme.md (61%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.win32.registry/5.0.0 => microsoft.testplatform.testhost/17.7.2}/remarks.md (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/repository-LICENSE rename Build/third-party-libraries/packages/nuget.org/{microsoft.win32.registry/5.0.0 => microsoft.testplatform.testhost/17.7.2}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package-License.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md create mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.20.69/index.json create mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.20.69/package.nuspec rename Build/third-party-libraries/packages/nuget.org/moq/{4.18.2 => 4.20.69}/project-License.txt (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/moq/4.20.69/readme.md rename Build/third-party-libraries/packages/nuget.org/moq/{4.18.2 => 4.20.69}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/moq/{4.18.2 => 4.20.69}/repository-License.txt (100%) rename Build/third-party-libraries/packages/nuget.org/moq/{4.18.2 => 4.20.69}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/index.json (82%) rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/package-LICENSE.md (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package.nuspec rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/readme.md (68%) rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/repository-LICENSE.md (100%) rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.1}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0 => newtonsoft.json/13.0.3}/index.json (81%) create mode 100644 Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package-LICENSE.md rename Build/third-party-libraries/packages/nuget.org/newtonsoft.json/{13.0.2 => 13.0.3}/package.nuspec (96%) create mode 100644 Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md rename Build/third-party-libraries/packages/nuget.org/{nuget.frameworks/5.11.0 => newtonsoft.json/13.0.3}/remarks.md (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/repository-LICENSE.md rename Build/third-party-libraries/packages/nuget.org/{nuget.frameworks/5.11.0 => newtonsoft.json/13.0.3}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/nuget.frameworks/{5.11.0 => 6.5.0}/index.json (75%) rename Build/third-party-libraries/packages/nuget.org/nuget.frameworks/{5.11.0 => 6.5.0}/package.nuspec (86%) rename Build/third-party-libraries/packages/nuget.org/nuget.frameworks/{5.11.0 => 6.5.0}/readme.md (62%) rename Build/third-party-libraries/packages/nuget.org/{nunit/3.13.3 => nuget.frameworks/6.5.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/nuget.frameworks/{5.11.0 => 6.5.0}/repository-LICENSE.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{nunit/3.13.3 => nuget.frameworks/6.5.0}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/nunit/{3.13.3 => 3.14.0}/index.json (76%) rename Build/third-party-libraries/packages/nuget.org/nunit/{3.13.3 => 3.14.0}/package-LICENSE.txt (95%) rename Build/third-party-libraries/packages/nuget.org/nunit/{3.13.3 => 3.14.0}/package.nuspec (94%) rename Build/third-party-libraries/packages/nuget.org/nunit/{3.13.3 => 3.14.0}/readme.md (79%) rename Build/third-party-libraries/packages/nuget.org/{nunit3testadapter/4.3.1 => nunit/3.14.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/nunit/{3.13.3 => 3.14.0}/repository-LICENSE.txt (95%) rename Build/third-party-libraries/packages/nuget.org/{nunit3testadapter/4.3.1 => nunit/3.14.0}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/nunit3testadapter/{4.3.1 => 4.5.0}/index.json (84%) rename Build/third-party-libraries/packages/nuget.org/nunit3testadapter/{4.3.1 => 4.5.0}/package.nuspec (82%) rename Build/third-party-libraries/packages/nuget.org/nunit3testadapter/{4.3.1 => 4.5.0}/readme.md (76%) rename Build/third-party-libraries/packages/nuget.org/{shouldly/4.1.0 => nunit3testadapter/4.5.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/nunit3testadapter/{4.3.1 => 4.5.0}/repository-LICENSE (94%) rename Build/third-party-libraries/packages/nuget.org/{shouldly/4.1.0 => nunit3testadapter/4.5.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/project-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md rename Build/third-party-libraries/packages/nuget.org/shouldly/{4.1.0 => 4.2.1}/index.json (67%) rename Build/third-party-libraries/packages/nuget.org/shouldly/{4.1.0 => 4.2.1}/package.nuspec (62%) create mode 100644 Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/readme.md rename Build/third-party-libraries/packages/nuget.org/{stylecop.analyzers.unstable/1.2.0.435 => shouldly/4.2.1}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/shouldly/{4.1.0 => 4.2.1}/repository-LICENSE.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{stylecop.analyzers.unstable/1.2.0.435 => shouldly/4.2.1}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/{1.2.0.435 => 1.2.0.507}/index.json (100%) rename Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/{1.2.0.435 => 1.2.0.507}/package-LICENSE (100%) rename Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/{1.2.0.435 => 1.2.0.507}/package.nuspec (92%) rename Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/{1.2.0.435 => 1.2.0.507}/project-LICENSE (100%) rename Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/{1.2.0.435 => 1.2.0.507}/readme.md (81%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0 => stylecop.analyzers.unstable/1.2.0.507}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0 => stylecop.analyzers.unstable/1.2.0.507}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.principal.windows/5.0.0 => system.codedom/6.0.0}/index.json (81%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.win32.registry/5.0.0/project-LICENSE.TXT => system.codedom/6.0.0/package-LICENSE.TXT} (100%) rename Build/third-party-libraries/packages/nuget.org/system.codedom/{5.0.0 => 6.0.0}/package.nuspec (50%) rename Build/third-party-libraries/packages/nuget.org/system.codedom/{5.0.0 => 6.0.0}/readme.md (65%) rename Build/third-party-libraries/packages/nuget.org/{system.configuration.configurationmanager/4.5.0 => system.codedom/6.0.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{microsoft.win32.registry/5.0.0 => system.codedom/6.0.0}/repository-LICENSE.TXT (100%) rename Build/third-party-libraries/packages/nuget.org/{system.configuration.configurationmanager/4.5.0 => system.codedom/6.0.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0 => system.diagnostics.eventlog/4.7.0}/index.json (66%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0/package-LICENSE.txt => system.diagnostics.eventlog/4.7.0/package-LICENSE.TXT} (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0 => system.diagnostics.eventlog/4.7.0}/package.nuspec (57%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md rename Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/{6.0.0 => 4.7.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/{6.0.0 => 4.7.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.diagnostics.eventlog/6.0.0 => system.management/6.0.1}/index.json (76%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0/project-LICENSE.TXT => system.management/6.0.1/package-LICENSE.TXT} (100%) rename Build/third-party-libraries/packages/nuget.org/system.management/{5.0.0 => 6.0.1}/package.nuspec (55%) rename Build/third-party-libraries/packages/nuget.org/system.management/{5.0.0 => 6.0.1}/readme.md (60%) rename Build/third-party-libraries/packages/nuget.org/system.management/{5.0.0 => 6.0.1}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.codedom/5.0.0 => system.management/6.0.1}/repository-LICENSE.TXT (100%) rename Build/third-party-libraries/packages/nuget.org/system.management/{5.0.0 => 6.0.1}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.configuration.configurationmanager => system.memory}/4.5.0/index.json (66%) rename Build/third-party-libraries/packages/nuget.org/{system.configuration.configurationmanager/4.5.0/package-LICENSE.txt => system.memory/4.5.0/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.runtime.interopservices.runtimeinformation/4.3.0 => system.memory/4.5.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.runtime.interopservices.runtimeinformation/4.3.0 => system.memory/4.5.0}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.management/5.0.0 => system.memory/4.5.5}/index.json (51%) rename Build/third-party-libraries/packages/nuget.org/{system.diagnostics.eventlog/6.0.0/package-LICENSE.txt => system.memory/4.5.5/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0 => system.memory/4.5.5}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.accesscontrol/5.0.0 => system.memory/4.5.5}/third-party-notices.txt (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/index.json rename Build/third-party-libraries/packages/nuget.org/{system.diagnostics.eventlog/6.0.0/repository-LICENSE.TXT => system.reflection.emit.ilgeneration/4.7.0/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.security.cryptography.protecteddata/4.5.0 => system.reflection.emit.ilgeneration/4.7.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.cryptography.protecteddata/4.5.0 => system.reflection.emit.ilgeneration/4.7.0}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.permissions/4.5.0 => system.reflection.emit/4.7.0}/index.json (57%) rename Build/third-party-libraries/packages/nuget.org/{system.management/5.0.0/package-LICENSE.txt => system.reflection.emit/4.7.0/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.security.permissions/4.5.0 => system.reflection.emit/4.7.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.permissions/4.5.0 => system.reflection.emit/4.7.0}/third-party-notices.txt (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.cryptography.protecteddata => system.runtime.compilerservices.unsafe}/4.5.0/index.json (75%) rename Build/third-party-libraries/packages/nuget.org/{system.management/5.0.0/project-LICENSE.TXT => system.runtime.compilerservices.unsafe/4.5.0/package-LICENSE.TXT} (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package.nuspec rename Build/third-party-libraries/packages/nuget.org/{system.security.cryptography.protecteddata => system.runtime.compilerservices.unsafe}/4.5.0/readme.md (50%) rename Build/third-party-libraries/packages/nuget.org/{system.security.principal.windows/5.0.0 => system.runtime.compilerservices.unsafe/4.5.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.security.principal.windows/5.0.0 => system.runtime.compilerservices.unsafe/4.5.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/project-LICENSE.TXT delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/repository-LICENSE.TXT rename Build/third-party-libraries/packages/nuget.org/{system.runtime.interopservices.runtimeinformation => system.threading.tasks.extensions}/4.3.0/index.json (61%) rename Build/third-party-libraries/packages/nuget.org/{system.runtime.interopservices.runtimeinformation => system.threading.tasks.extensions}/4.3.0/package-dotnet_library_license.txt (100%) create mode 100644 Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package.nuspec create mode 100644 Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/readme.md rename Build/third-party-libraries/packages/nuget.org/{system.valuetuple/4.5.0 => system.threading.tasks.extensions/4.3.0}/remarks.md (100%) rename Build/third-party-libraries/packages/nuget.org/{system.valuetuple/4.5.0 => system.threading.tasks.extensions/4.3.0}/third-party-notices.txt (100%) delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package-LICENSE.txt delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package.nuspec delete mode 100644 Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/index.json similarity index 69% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/index.json index b78b4fc3..ccd65c2b 100644 --- a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/index.json @@ -9,14 +9,16 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { "Name": "System.Diagnostics.EventLog", - "Version": "6.0.0" + "Version": "4.7.0" + }, + { + "Name": "System.Reflection.Emit", + "Version": "4.7.0" } ] } @@ -31,13 +33,12 @@ "Subject": "repository", "Code": null, "HRef": "https://github.com/castleproject/Core", - "Description": "License should be verified on https://github.com/castleproject/Core" + "Description": "License code NOASSERTION" }, { "Subject": "project", "Code": null, - "HRef": "http://www.castleproject.org/", - "Description": "License should be verified on http://www.castleproject.org/" + "HRef": "http://www.castleproject.org/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/package-LICENSE b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/package-LICENSE similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/package-LICENSE rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/package-LICENSE diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/package.nuspec similarity index 98% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/package.nuspec index 04839f87..a2179779 100644 --- a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/package.nuspec @@ -2,7 +2,7 @@ Castle.Core - 5.1.0 + 5.1.1 Castle Project Contributors Apache-2.0 https://licenses.nuget.org/Apache-2.0 diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/readme.md similarity index 59% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/readme.md index f5dc4a03..1de67e47 100644 --- a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/readme.md @@ -1,15 +1,15 @@ -Castle.Core [5.1.0](https://www.nuget.org/packages/Castle.Core/5.1.0) +Castle.Core [5.1.1](https://www.nuget.org/packages/Castle.Core/5.1.1) -------------------- Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [Apache-2.0](../../../../licenses/apache-2.0) - package license: [Apache-2.0](https://licenses.nuget.org/Apache-2.0) -- repository license: [Unknown](https://github.com/castleproject/Core) , License should be verified on https://github.com/castleproject/Core -- project license: [Unknown](http://www.castleproject.org/) , License should be verified on http://www.castleproject.org/ +- repository license: [Unknown](https://github.com/castleproject/Core) , License code NOASSERTION +- project license: [Unknown](http://www.castleproject.org/) Description ----------- @@ -20,11 +20,12 @@ Remarks no remarks -Dependencies 1 +Dependencies 2 ----------- |Name|Version| |----------|:----| -|[System.Diagnostics.EventLog](../../../../packages/nuget.org/system.diagnostics.eventlog/6.0.0)|6.0.0| +|[System.Diagnostics.EventLog](../../../../packages/nuget.org/system.diagnostics.eventlog/4.7.0)|4.7.0| +|[System.Reflection.Emit](../../../../packages/nuget.org/system.reflection.emit/4.7.0)|4.7.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/repository-LICENSE similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/repository-LICENSE rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/repository-LICENSE diff --git a/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/castle.core/5.1.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/castle.core/5.1.1/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json similarity index 79% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json index b637b6ac..3b3cf0a3 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/index.json +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json @@ -25,13 +25,13 @@ "Subject": "repository", "Code": null, "HRef": "https://github.com/DapperLib/Dapper", - "Description": "License should be verified on https://github.com/DapperLib/Dapper" + "Description": "License code NOASSERTION" }, { "Subject": "project", "Code": null, "HRef": "https://github.com/DapperLib/Dapper", - "Description": "License should be verified on https://github.com/DapperLib/Dapper" + "Description": "License code NOASSERTION" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/package.nuspec b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/package.nuspec similarity index 91% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/package.nuspec index 9404cbf7..75ea09ac 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/package.nuspec @@ -2,7 +2,7 @@ Dapper.StrongName - 2.0.123 + 2.1.15 Dapper (Strong Named) Sam Saffron,Marc Gravell,Nick Craver Sam Saffron,Marc Gravell,Nick Craver @@ -14,7 +14,7 @@ https://dapperlib.github.io/Dapper/ 2019 Stack Exchange, Inc. orm sql micro-orm - + @@ -23,5 +23,6 @@ Dapper.png + readme.md \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/project-License.txt b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/project-License.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/project-License.txt rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/project-License.txt diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md similarity index 71% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md index bde8638a..e0382b14 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md @@ -1,4 +1,4 @@ -Dapper.StrongName [2.0.123](https://www.nuget.org/packages/Dapper.StrongName/2.0.123) +Dapper.StrongName [2.1.15](https://www.nuget.org/packages/Dapper.StrongName/2.1.15) -------------------- Used by: SqlDatabase internal @@ -8,8 +8,8 @@ Target frameworks: net472, net6.0, net7.0 License: [Apache-2.0](../../../../licenses/apache-2.0) - package license: [Apache-2.0](https://licenses.nuget.org/Apache-2.0) -- repository license: [Unknown](https://github.com/DapperLib/Dapper) , License should be verified on https://github.com/DapperLib/Dapper -- project license: [Unknown](https://github.com/DapperLib/Dapper) , License should be verified on https://github.com/DapperLib/Dapper +- repository license: [Unknown](https://github.com/DapperLib/Dapper) , License code NOASSERTION +- project license: [Unknown](https://github.com/DapperLib/Dapper) , License code NOASSERTION Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/remarks.md b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/remarks.md rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/repository-License.txt b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/repository-License.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/repository-License.txt rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/repository-License.txt diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.0.123/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/index.json similarity index 87% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/index.json index 9266c196..524185ce 100644 --- a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/index.json @@ -9,18 +9,16 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { "Name": "EmptyFiles", - "Version": "2.8.0" + "Version": "4.4.0" }, { "Name": "System.Management", - "Version": "5.0.0" + "Version": "6.0.1" } ] } diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/package.nuspec similarity index 54% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/package.nuspec index 5929b640..e76b0bee 100644 --- a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/package.nuspec @@ -2,61 +2,61 @@ DiffEngine - 10.0.0 + 11.3.0 https://github.com/VerifyTests/DiffEngine/graphs/contributors MIT https://licenses.nuget.org/MIT icon.png https://github.com/VerifyTests/DiffEngine Launches diff tools based on file extensions. Designed to be consumed by snapshot testing libraries. - Copyright 2022. All rights reserved + Copyright 2023. All rights reserved Testing, Snapshot, Diff, Compare - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/project-license.txt b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/project-license.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/project-license.txt rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/project-license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/readme.md similarity index 75% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/readme.md index 793c1f12..01116770 100644 --- a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/readme.md @@ -1,9 +1,9 @@ -DiffEngine [10.0.0](https://www.nuget.org/packages/DiffEngine/10.0.0) +DiffEngine [11.3.0](https://www.nuget.org/packages/DiffEngine/11.3.0) -------------------- Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) @@ -25,7 +25,7 @@ Dependencies 2 |Name|Version| |----------|:----| -|[EmptyFiles](../../../../packages/nuget.org/emptyfiles/2.8.0)|2.8.0| -|[System.Management](../../../../packages/nuget.org/system.management/5.0.0)|5.0.0| +|[EmptyFiles](../../../../packages/nuget.org/emptyfiles/4.4.0)|4.4.0| +|[System.Management](../../../../packages/nuget.org/system.management/6.0.1)|6.0.1| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/repository-license.txt b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/repository-license.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/repository-license.txt rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/repository-license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/diffengine/10.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/diffengine/11.3.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/package.nuspec deleted file mode 100644 index 27fce73e..00000000 --- a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/package.nuspec +++ /dev/null @@ -1,20 +0,0 @@ - - - - EmptyFiles - 2.8.0 - https://github.com/SimonCropp/EmptyFiles/graphs/contributors - MIT - https://licenses.nuget.org/MIT - icon.png - https://github.com/SimonCropp/EmptyFiles - A collection of minimal binary files. - Copyright 2021. All rights reserved - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/index.json similarity index 81% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/index.json index 5c459e2d..ee532dc8 100644 --- a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/index.json @@ -9,9 +9,13 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" + ], + "Dependencies": [ + { + "Name": "System.Memory", + "Version": "4.5.5" + } ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/package.nuspec new file mode 100644 index 00000000..efb63dda --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/package.nuspec @@ -0,0 +1,30 @@ + + + + EmptyFiles + 4.4.0 + https://github.com/SimonCropp/EmptyFiles/graphs/contributors + MIT + https://licenses.nuget.org/MIT + icon.png + https://github.com/SimonCropp/EmptyFiles + A collection of minimal binary files. + Copyright 2023. All rights reserved + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/project-license.txt b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/project-license.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/project-license.txt rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/project-license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/readme.md similarity index 66% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/readme.md index b02ddfc5..d1cf40c7 100644 --- a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/readme.md @@ -1,9 +1,9 @@ -EmptyFiles [2.8.0](https://www.nuget.org/packages/EmptyFiles/2.8.0) +EmptyFiles [4.4.0](https://www.nuget.org/packages/EmptyFiles/4.4.0) -------------------- Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) @@ -20,8 +20,11 @@ Remarks no remarks -Dependencies 0 +Dependencies 1 ----------- +|Name|Version| +|----------|:----| +|[System.Memory](../../../../packages/nuget.org/system.memory/4.5.5)|4.5.5| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/repository-license.txt b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/repository-license.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/repository-license.txt rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/repository-license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/emptyfiles/2.8.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/emptyfiles/4.4.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/project-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/project-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/repository-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/repository-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json similarity index 73% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json index b3d3b24a..3bcd358e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json @@ -18,8 +18,9 @@ "Licenses": [ { "Subject": "package", - "Code": null, - "HRef": "LICENSE_NET.txt" + "Code": "ms-net-library", + "HRef": "LICENSE_NET.txt", + "Description": "The license file is identical to the file from version 17.4.0." }, { "Subject": "repository", @@ -29,7 +30,7 @@ { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/" + "HRef": "https://github.com/microsoft/vstest" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/package-LICENSE_NET.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/package-LICENSE_NET.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/package-LICENSE_NET.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/package-LICENSE_NET.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/package.nuspec similarity index 75% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/package.nuspec index 458733c3..1a5d6895 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/package.nuspec @@ -2,20 +2,18 @@ Microsoft.CodeCoverage - 17.4.0 - Microsoft.CodeCoverage + 17.7.2 Microsoft - Microsoft true LICENSE_NET.txt https://aka.ms/deprecateLicenseUrl Icon.png - https://github.com/microsoft/vstest/ - http://go.microsoft.com/fwlink/?LinkID=288859 + https://github.com/microsoft/vstest Microsoft.CodeCoverage package brings infra for collecting code coverage from vstest.console.exe and "dotnet test". © Microsoft Corporation. All rights reserved. vstest visual-studio unittest testplatform mstest microsoft test testing codecoverage code-coverage - + true + diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/project-LICENSE similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/repository-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/project-LICENSE index 984713a4..d859446c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/repository-LICENSE.TXT +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/project-LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors +Copyright (c) Microsoft Corporation All rights reserved. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md similarity index 64% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md index e90f599e..b5c3f475 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md @@ -1,4 +1,4 @@ -Microsoft.CodeCoverage [17.4.0](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.4.0) +Microsoft.CodeCoverage [17.7.2](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.7.2) -------------------- Used by: SqlDatabase internal @@ -7,9 +7,9 @@ Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) -- package license: [Unknown]() +- package license: [ms-net-library]() , The license file is identical to the file from version 17.4.0. - repository license: [MIT](https://github.com/microsoft/vstest) -- project license: [MIT](https://github.com/microsoft/vstest/) +- project license: [MIT](https://github.com/microsoft/vstest) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/repository-LICENSE similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/repository-LICENSE index 984713a4..d859446c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package-LICENSE.txt +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/repository-LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors +Copyright (c) Microsoft Corporation All rights reserved. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.4.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/index.json new file mode 100644 index 00000000..6786e835 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/index.json @@ -0,0 +1,28 @@ +{ + "Source": "https://api.nuget.org/v3/index.json", + "License": { + "Code": "MIT", + "Status": "AutomaticallyApproved" + }, + "UsedBy": [ + { + "Name": "SqlDatabase", + "InternalOnly": true, + "TargetFrameworks": [ + "netstandard2.0" + ] + } + ], + "Licenses": [ + { + "Subject": "package", + "Code": "MIT", + "HRef": "https://licenses.nuget.org/MIT" + }, + { + "Subject": "project", + "Code": null, + "HRef": "https://github.com/dotnet/corefx" + } + ] +} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package.nuspec new file mode 100644 index 00000000..bc9e1494 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/package.nuspec @@ -0,0 +1,67 @@ + + + + Microsoft.CSharp + 4.7.0 + Microsoft.CSharp + Microsoft + microsoft,dotnetframework + false + MIT + https://licenses.nuget.org/MIT + https://github.com/dotnet/corefx + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides support for compilation and code generation, including dynamic, using the C# language. + +Commonly Used Types: +Microsoft.CSharp.RuntimeBinder.Binder +Microsoft.CSharp.RuntimeBinder.RuntimeBinderException +Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo +Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags +Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags + +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/readme.md new file mode 100644 index 00000000..9a3779c9 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/readme.md @@ -0,0 +1,35 @@ +Microsoft.CSharp [4.7.0](https://www.nuget.org/packages/Microsoft.CSharp/4.7.0) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://licenses.nuget.org/MIT) +- project license: [Unknown](https://github.com/dotnet/corefx) + +Description +----------- +Provides support for compilation and code generation, including dynamic, using the C# language. + +Commonly Used Types: +Microsoft.CSharp.RuntimeBinder.Binder +Microsoft.CSharp.RuntimeBinder.RuntimeBinderException +Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo +Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags +Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags + +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 0 +----------- + + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.csharp/4.7.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/project-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/project-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/repository-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/repository-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json similarity index 73% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json index 3c6651e9..e934f5b7 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json @@ -16,11 +16,11 @@ "Dependencies": [ { "Name": "Microsoft.CodeCoverage", - "Version": "17.4.0" + "Version": "17.7.2" }, { "Name": "Microsoft.TestPlatform.TestHost", - "Version": "17.4.0" + "Version": "17.7.2" } ] } @@ -28,8 +28,9 @@ "Licenses": [ { "Subject": "package", - "Code": null, - "HRef": "LICENSE_NET.txt" + "Code": "ms-net-library", + "HRef": "LICENSE_NET.txt", + "Description": "The license file is identical to the file from version 17.4.0." }, { "Subject": "repository", @@ -39,7 +40,7 @@ { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/" + "HRef": "https://github.com/microsoft/vstest" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/package-LICENSE_NET.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/package-LICENSE_NET.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/package-LICENSE_NET.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/package-LICENSE_NET.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/package.nuspec similarity index 68% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/package.nuspec index e1842716..b3e84fcf 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/package.nuspec @@ -2,27 +2,25 @@ Microsoft.NET.Test.Sdk - 17.4.0 - Microsoft.NET.Test.Sdk + 17.7.2 Microsoft - Microsoft true LICENSE_NET.txt https://aka.ms/deprecateLicenseUrl Icon.png - https://github.com/microsoft/vstest/ - http://go.microsoft.com/fwlink/?LinkID=288859 + https://github.com/microsoft/vstest The MSbuild targets and properties for building .NET test projects. © Microsoft Corporation. All rights reserved. vstest visual-studio unittest testplatform mstest microsoft test testing - + true + - - + + - + diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/project-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/project-LICENSE similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/project-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/project-LICENSE index 984713a4..d859446c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/project-LICENSE.TXT +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/project-LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors +Copyright (c) Microsoft Corporation All rights reserved. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md similarity index 62% rename from Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md index c3cbc857..ef3dd1a0 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md @@ -1,4 +1,4 @@ -Microsoft.NET.Test.Sdk [17.4.0](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.4.0) +Microsoft.NET.Test.Sdk [17.7.2](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.7.2) -------------------- Used by: SqlDatabase internal @@ -7,9 +7,9 @@ Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) -- package license: [Unknown]() +- package license: [ms-net-library]() , The license file is identical to the file from version 17.4.0. - repository license: [MIT](https://github.com/microsoft/vstest) -- project license: [MIT](https://github.com/microsoft/vstest/) +- project license: [MIT](https://github.com/microsoft/vstest) Description ----------- @@ -25,7 +25,7 @@ Dependencies 2 |Name|Version| |----------|:----| -|[Microsoft.CodeCoverage](../../../../packages/nuget.org/microsoft.codecoverage/17.4.0)|17.4.0| -|[Microsoft.TestPlatform.TestHost](../../../../packages/nuget.org/microsoft.testplatform.testhost/17.4.0)|17.4.0| +|[Microsoft.CodeCoverage](../../../../packages/nuget.org/microsoft.codecoverage/17.7.2)|17.7.2| +|[Microsoft.TestPlatform.TestHost](../../../../packages/nuget.org/microsoft.testplatform.testhost/17.7.2)|17.7.2| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/repository-LICENSE similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/repository-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/repository-LICENSE index 984713a4..d859446c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/repository-LICENSE.TXT +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/repository-LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors +Copyright (c) Microsoft Corporation All rights reserved. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/project-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/project-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/repository-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/repository-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json similarity index 76% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json index 241c60d1..566ee42e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json @@ -16,7 +16,7 @@ "Dependencies": [ { "Name": "NuGet.Frameworks", - "Version": "5.11.0" + "Version": "6.5.0" }, { "Name": "System.Reflection.Metadata", @@ -28,8 +28,9 @@ "Licenses": [ { "Subject": "package", - "Code": null, - "HRef": "LICENSE_NET.txt" + "Code": "ms-net-library", + "HRef": "LICENSE_NET.txt", + "Description": "The license file is identical to the file from version 17.4.0." }, { "Subject": "repository", @@ -39,7 +40,7 @@ { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/" + "HRef": "https://github.com/microsoft/vstest" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/package-LICENSE_NET.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/package-LICENSE_NET.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/package-LICENSE_NET.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/package-LICENSE_NET.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/package.nuspec similarity index 79% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/package.nuspec index 26886126..3445be41 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/package.nuspec @@ -2,32 +2,30 @@ Microsoft.TestPlatform.ObjectModel - 17.4.0 - Microsoft.TestPlatform.ObjectModel + 17.7.2 Microsoft - Microsoft true LICENSE_NET.txt https://aka.ms/deprecateLicenseUrl Icon.png - https://github.com/microsoft/vstest/ - http://go.microsoft.com/fwlink/?LinkID=288859 + https://github.com/microsoft/vstest The Microsoft Test Platform Object Model. © Microsoft Corporation. All rights reserved. vstest visual-studio unittest testplatform mstest microsoft test testing - + true + - + - + - + diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/project-LICENSE new file mode 100644 index 00000000..d859446c --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/project-LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md similarity index 66% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md index a5c7691d..ef0d232a 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md @@ -1,4 +1,4 @@ -Microsoft.TestPlatform.ObjectModel [17.4.0](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.4.0) +Microsoft.TestPlatform.ObjectModel [17.7.2](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.7.2) -------------------- Used by: SqlDatabase internal @@ -7,9 +7,9 @@ Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) -- package license: [Unknown]() +- package license: [ms-net-library]() , The license file is identical to the file from version 17.4.0. - repository license: [MIT](https://github.com/microsoft/vstest) -- project license: [MIT](https://github.com/microsoft/vstest/) +- project license: [MIT](https://github.com/microsoft/vstest) Description ----------- @@ -25,7 +25,7 @@ Dependencies 2 |Name|Version| |----------|:----| -|[NuGet.Frameworks](../../../../packages/nuget.org/nuget.frameworks/5.11.0)|5.11.0| +|[NuGet.Frameworks](../../../../packages/nuget.org/nuget.frameworks/6.5.0)|6.5.0| |[System.Reflection.Metadata](../../../../packages/nuget.org/system.reflection.metadata/1.6.0)|1.6.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/repository-LICENSE new file mode 100644 index 00000000..d859446c --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/repository-LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/project-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/project-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/repository-LICENSE deleted file mode 100644 index a31c5558..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/repository-LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json similarity index 73% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json index 80643bd9..439cb41a 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json @@ -16,11 +16,11 @@ "Dependencies": [ { "Name": "Microsoft.TestPlatform.ObjectModel", - "Version": "17.4.0" + "Version": "17.7.2" }, { "Name": "Newtonsoft.Json", - "Version": "13.0.2" + "Version": "13.0.1" } ] } @@ -28,8 +28,9 @@ "Licenses": [ { "Subject": "package", - "Code": null, - "HRef": "LICENSE_NET.txt" + "Code": "ms-net-library", + "HRef": "LICENSE_NET.txt", + "Description": "The license file is identical to the file from version 17.4.0." }, { "Subject": "repository", @@ -39,7 +40,7 @@ { "Subject": "project", "Code": "MIT", - "HRef": "https://github.com/microsoft/vstest/" + "HRef": "https://github.com/microsoft/vstest" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/package-LICENSE_NET.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/package-LICENSE_NET.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/package-LICENSE_NET.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/package-LICENSE_NET.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/package.nuspec similarity index 75% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/package.nuspec index 89e8256d..da29550b 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/package.nuspec @@ -2,23 +2,21 @@ Microsoft.TestPlatform.TestHost - 17.4.0 - Microsoft.TestPlatform.TestHost + 17.7.2 Microsoft - Microsoft true LICENSE_NET.txt https://aka.ms/deprecateLicenseUrl Icon.png - https://github.com/microsoft/vstest/ - http://go.microsoft.com/fwlink/?LinkID=288859 + https://github.com/microsoft/vstest Testplatform host executes the test using specified adapter. © Microsoft Corporation. All rights reserved. vstest visual-studio unittest testplatform mstest microsoft test testing - + true + - + diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/project-LICENSE new file mode 100644 index 00000000..d859446c --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/project-LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md similarity index 61% rename from Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md index a288876e..05226dfa 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md @@ -1,4 +1,4 @@ -Microsoft.TestPlatform.TestHost [17.4.0](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.4.0) +Microsoft.TestPlatform.TestHost [17.7.2](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.7.2) -------------------- Used by: SqlDatabase internal @@ -7,9 +7,9 @@ Target frameworks: net472, net6.0, net7.0 License: [ms-net-library](../../../../licenses/ms-net-library) -- package license: [Unknown]() +- package license: [ms-net-library]() , The license file is identical to the file from version 17.4.0. - repository license: [MIT](https://github.com/microsoft/vstest) -- project license: [MIT](https://github.com/microsoft/vstest/) +- project license: [MIT](https://github.com/microsoft/vstest) Description ----------- @@ -25,7 +25,7 @@ Dependencies 2 |Name|Version| |----------|:----| -|[Microsoft.TestPlatform.ObjectModel](../../../../packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0)|17.4.0| -|[Newtonsoft.Json](../../../../packages/nuget.org/newtonsoft.json/13.0.2)|13.0.2| +|[Microsoft.TestPlatform.ObjectModel](../../../../packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2)|17.7.2| +|[Newtonsoft.Json](../../../../packages/nuget.org/newtonsoft.json/13.0.1)|13.0.1| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/repository-LICENSE new file mode 100644 index 00000000..d859446c --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/repository-LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json index 8406635e..e5c050c8 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json @@ -15,6 +15,14 @@ "netstandard2.0" ], "Dependencies": [ + { + "Name": "System.Buffers", + "Version": "4.5.1" + }, + { + "Name": "System.Memory", + "Version": "4.5.4" + }, { "Name": "System.Security.AccessControl", "Version": "4.7.0" @@ -35,8 +43,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md index 25d18ca8..368b7740 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md @@ -8,7 +8,7 @@ Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- @@ -28,11 +28,13 @@ Remarks no remarks -Dependencies 2 +Dependencies 4 ----------- |Name|Version| |----------|:----| +|[System.Buffers](../../../../packages/nuget.org/system.buffers/4.5.1)|4.5.1| +|[System.Memory](../../../../packages/nuget.org/system.memory/4.5.4)|4.5.4| |[System.Security.AccessControl](../../../../packages/nuget.org/system.security.accesscontrol/4.7.0)|4.7.0| |[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/4.7.0)|4.7.0| diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json deleted file mode 100644 index 84f9e03b..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Source": "https://api.nuget.org/v3/index.json", - "License": { - "Code": "MIT", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": true, - "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" - ], - "Dependencies": [ - { - "Name": "System.Security.AccessControl", - "Version": "5.0.0" - }, - { - "Name": "System.Security.Principal.Windows", - "Version": "5.0.0" - } - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT" - }, - { - "Subject": "repository", - "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime" - }, - { - "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime" - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package.nuspec deleted file mode 100644 index b90a7ea7..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/package.nuspec +++ /dev/null @@ -1,94 +0,0 @@ - - - - Microsoft.Win32.Registry - 5.0.0 - Microsoft.Win32.Registry - Microsoft - microsoft,dotnetframework - false - MIT - https://licenses.nuget.org/MIT - Icon.png - https://github.com/dotnet/runtime - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides support for accessing and modifying the Windows Registry. - -Commonly Used Types: -Microsoft.Win32.RegistryKey -Microsoft.Win32.Registry -Microsoft.Win32.RegistryValueKind -Microsoft.Win32.RegistryHive -Microsoft.Win32.RegistryView - -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md deleted file mode 100644 index 3f02b444..00000000 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/readme.md +++ /dev/null @@ -1,40 +0,0 @@ -Microsoft.Win32.Registry [5.0.0](https://www.nuget.org/packages/Microsoft.Win32.Registry/5.0.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](git://github.com/dotnet/runtime) -- project license: [MIT](https://github.com/dotnet/runtime) - -Description ------------ -Provides support for accessing and modifying the Windows Registry. - -Commonly Used Types: -Microsoft.Win32.RegistryKey -Microsoft.Win32.Registry -Microsoft.Win32.RegistryValueKind -Microsoft.Win32.RegistryHive -Microsoft.Win32.RegistryView - -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 2 ------------ - -|Name|Version| -|----------|:----| -|[System.Security.AccessControl](../../../../packages/nuget.org/system.security.accesscontrol/5.0.0)|5.0.0| -|[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/5.0.0)|5.0.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json deleted file mode 100644 index 5785d232..00000000 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/index.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "Source": "https://api.nuget.org/v3/index.json", - "License": { - "Code": "BSD-3-Clause", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": true, - "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" - ], - "Dependencies": [ - { - "Name": "Castle.Core", - "Version": "5.1.0" - } - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": null, - "HRef": "https://raw.githubusercontent.com/moq/moq4/main/License.txt", - "Description": "License should be verified on https://raw.githubusercontent.com/moq/moq4/main/License.txt" - }, - { - "Subject": "repository", - "Code": null, - "HRef": "https://github.com/moq/moq4", - "Description": "License should be verified on https://github.com/moq/moq4" - }, - { - "Subject": "project", - "Code": null, - "HRef": "https://github.com/moq/moq4", - "Description": "License should be verified on https://github.com/moq/moq4" - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package-License.txt b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package-License.txt deleted file mode 100644 index 048dc06e..00000000 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package-License.txt +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, -and Contributors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package.nuspec b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package.nuspec deleted file mode 100644 index 65a776d4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/package.nuspec +++ /dev/null @@ -1,34 +0,0 @@ - - - - Moq - 4.18.2 - Moq: an enjoyable mocking library - Daniel Cazzulino, kzu - https://raw.githubusercontent.com/moq/moq4/main/License.txt - moq.png - https://github.com/moq/moq4 - Moq is the most popular and friendly mocking framework for .NET. - -Built from https://github.com/moq/moq4/tree/c60833da6 - A changelog is available at https://github.com/moq/moq4/blob/main/CHANGELOG.md. - moq tdd mocking mocks unittesting agile unittest - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md b/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md deleted file mode 100644 index 4fad4779..00000000 --- a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/readme.md +++ /dev/null @@ -1,32 +0,0 @@ -Moq [4.18.2](https://www.nuget.org/packages/Moq/4.18.2) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [BSD-3-Clause](../../../../licenses/bsd-3-clause) - -- package license: [Unknown](https://raw.githubusercontent.com/moq/moq4/main/License.txt) , License should be verified on https://raw.githubusercontent.com/moq/moq4/main/License.txt -- repository license: [Unknown](https://github.com/moq/moq4) , License should be verified on https://github.com/moq/moq4 -- project license: [Unknown](https://github.com/moq/moq4) , License should be verified on https://github.com/moq/moq4 - -Description ------------ -Moq is the most popular and friendly mocking framework for .NET. - -Built from https://github.com/moq/moq4/tree/c60833da6 - -Remarks ------------ -no remarks - - -Dependencies 1 ------------ - -|Name|Version| -|----------|:----| -|[Castle.Core](../../../../packages/nuget.org/castle.core/5.1.0)|5.1.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/index.json b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/index.json new file mode 100644 index 00000000..5a1530fd --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/index.json @@ -0,0 +1,45 @@ +{ + "Source": "https://api.nuget.org/v3/index.json", + "License": { + "Code": "BSD-3-Clause", + "Status": "AutomaticallyApproved" + }, + "UsedBy": [ + { + "Name": "SqlDatabase", + "InternalOnly": true, + "TargetFrameworks": [ + "netstandard2.0" + ], + "Dependencies": [ + { + "Name": "Castle.Core", + "Version": "5.1.1" + }, + { + "Name": "System.Threading.Tasks.Extensions", + "Version": "4.5.4" + } + ] + } + ], + "Licenses": [ + { + "Subject": "package", + "Code": "BSD-3-Clause", + "HRef": "https://licenses.nuget.org/BSD-3-Clause" + }, + { + "Subject": "repository", + "Code": null, + "HRef": "https://github.com/moq/moq", + "Description": "License code NOASSERTION" + }, + { + "Subject": "project", + "Code": null, + "HRef": "https://github.com/moq/moq", + "Description": "License code NOASSERTION" + } + ] +} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/package.nuspec b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/package.nuspec new file mode 100644 index 00000000..78b02cae --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/package.nuspec @@ -0,0 +1,36 @@ + + + + Moq + 4.20.69 + Moq: an enjoyable mocking library + Daniel Cazzulino, kzu + false + BSD-3-Clause + https://licenses.nuget.org/BSD-3-Clause + icon.png + readme.md + https://github.com/moq/moq + Moq is the most popular and friendly mocking framework for .NET. + https://github.com/moq/moq/blob/main/changelog.md + Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors. All rights reserved. + moq;tdd;mocking;mocks;unittesting;agile;unittest + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/project-License.txt b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/project-License.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/moq/4.18.2/project-License.txt rename to Build/third-party-libraries/packages/nuget.org/moq/4.20.69/project-License.txt diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/readme.md b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/readme.md new file mode 100644 index 00000000..0e4df030 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/readme.md @@ -0,0 +1,31 @@ +Moq [4.20.69](https://www.nuget.org/packages/Moq/4.20.69) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [BSD-3-Clause](../../../../licenses/bsd-3-clause) + +- package license: [BSD-3-Clause](https://licenses.nuget.org/BSD-3-Clause) +- repository license: [Unknown](https://github.com/moq/moq) , License code NOASSERTION +- project license: [Unknown](https://github.com/moq/moq) , License code NOASSERTION + +Description +----------- +Moq is the most popular and friendly mocking framework for .NET. + +Remarks +----------- +no remarks + + +Dependencies 2 +----------- + +|Name|Version| +|----------|:----| +|[Castle.Core](../../../../packages/nuget.org/castle.core/5.1.1)|5.1.1| +|[System.Threading.Tasks.Extensions](../../../../packages/nuget.org/system.threading.tasks.extensions/4.5.4)|4.5.4| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/remarks.md b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/moq/4.18.2/remarks.md rename to Build/third-party-libraries/packages/nuget.org/moq/4.20.69/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/repository-License.txt b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/repository-License.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/moq/4.18.2/repository-License.txt rename to Build/third-party-libraries/packages/nuget.org/moq/4.20.69/repository-License.txt diff --git a/Build/third-party-libraries/packages/nuget.org/moq/4.18.2/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/moq/4.20.69/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/moq/4.18.2/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/moq/4.20.69/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json index eff7203b..df6d7367 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/index.json @@ -9,10 +9,21 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" + ], + "Dependencies": [ + { + "Name": "System.Buffers", + "Version": "4.4.0" + }, + { + "Name": "System.Memory", + "Version": "4.5.0" + }, + { + "Name": "System.Threading.Tasks.Extensions", + "Version": "4.3.0" + } ] } ], @@ -30,8 +41,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://mysqlconnector.net/", - "Description": "License should be verified on https://mysqlconnector.net/" + "HRef": "https://mysqlconnector.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md index cdfe69ee..fa960705 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/readme.md @@ -3,13 +3,13 @@ MySqlConnector [1.3.10](https://www.nuget.org/packages/MySqlConnector/1.3.10) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) - repository license: [MIT](https://github.com/mysql-net/MySqlConnector.git) -- project license: [Unknown](https://mysqlconnector.net/) , License should be verified on https://mysqlconnector.net/ +- project license: [Unknown](https://mysqlconnector.net/) Description ----------- @@ -20,8 +20,13 @@ Remarks no remarks -Dependencies 0 +Dependencies 3 ----------- +|Name|Version| +|----------|:----| +|[System.Buffers](../../../../packages/nuget.org/system.buffers/4.4.0)|4.4.0| +|[System.Memory](../../../../packages/nuget.org/system.memory/4.5.0)|4.5.0| +|[System.Threading.Tasks.Extensions](../../../../packages/nuget.org/system.threading.tasks.extensions/4.3.0)|4.3.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/repository-LICENSE index a6b033c2..11f3e7c6 100644 --- a/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/repository-LICENSE +++ b/Build/third-party-libraries/packages/nuget.org/mysqlconnector/1.3.10/repository-LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016-2021 Bradley Grainger +Copyright (c) 2016-2023 Bradley Grainger Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json similarity index 82% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json index 68ca6e65..9ea13765 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json @@ -29,8 +29,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://www.newtonsoft.com/json", - "Description": "License should be verified on https://www.newtonsoft.com/json" + "HRef": "https://www.newtonsoft.com/json" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/package-LICENSE.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package-LICENSE.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/package-LICENSE.md rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package-LICENSE.md diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package.nuspec b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package.nuspec new file mode 100644 index 00000000..23ab73b3 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/package.nuspec @@ -0,0 +1,39 @@ + + + + Newtonsoft.Json + 13.0.1 + Json.NET + James Newton-King + false + MIT + https://licenses.nuget.org/MIT + packageIcon.png + https://www.newtonsoft.com/json + Json.NET is a popular high-performance JSON framework for .NET + Copyright © James Newton-King 2008 + json + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md similarity index 68% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md index c0133f73..77437192 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md @@ -1,4 +1,4 @@ -Newtonsoft.Json [13.0.2](https://www.nuget.org/packages/Newtonsoft.Json/13.0.2) +Newtonsoft.Json [13.0.1](https://www.nuget.org/packages/Newtonsoft.Json/13.0.1) -------------------- Used by: SqlDatabase internal @@ -9,7 +9,7 @@ License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) - repository license: [MIT](https://github.com/JamesNK/Newtonsoft.Json) -- project license: [Unknown](https://www.newtonsoft.com/json) , License should be verified on https://www.newtonsoft.com/json +- project license: [Unknown](https://www.newtonsoft.com/json) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/remarks.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/remarks.md rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/repository-LICENSE.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/repository-LICENSE.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/repository-LICENSE.md rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/repository-LICENSE.md diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json similarity index 81% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json index 8c27a13f..9ea13765 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json @@ -24,12 +24,12 @@ { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime" + "HRef": "https://github.com/JamesNK/Newtonsoft.Json" }, { "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime" + "Code": null, + "HRef": "https://www.newtonsoft.com/json" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package-LICENSE.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package-LICENSE.md new file mode 100644 index 00000000..dfaadbe4 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package-LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/package.nuspec b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package.nuspec similarity index 96% rename from Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package.nuspec index 9ef2e1f7..97d1d959 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.2/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/package.nuspec @@ -2,7 +2,7 @@ Newtonsoft.Json - 13.0.2 + 13.0.3 Json.NET James Newton-King MIT @@ -14,7 +14,7 @@ Json.NET is a popular high-performance JSON framework for .NET Copyright © James Newton-King 2008 json - + diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md new file mode 100644 index 00000000..ef6caa82 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md @@ -0,0 +1,27 @@ +Newtonsoft.Json [13.0.3](https://www.nuget.org/packages/Newtonsoft.Json/13.0.3) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: net472, net6.0, net7.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://licenses.nuget.org/MIT) +- repository license: [MIT](https://github.com/JamesNK/Newtonsoft.Json) +- project license: [Unknown](https://www.newtonsoft.com/json) + +Description +----------- +Json.NET is a popular high-performance JSON framework for .NET + +Remarks +----------- +no remarks + + +Dependencies 0 +----------- + + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/repository-LICENSE.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/repository-LICENSE.md new file mode 100644 index 00000000..dfaadbe4 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/repository-LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json index f5a50375..0d56e40d 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/index.json @@ -9,15 +9,20 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ + { + "Name": "System.Memory", + "Version": "4.5.3" + }, { "Name": "System.Runtime.CompilerServices.Unsafe", "Version": "4.5.2" + }, + { + "Name": "System.Threading.Tasks.Extensions", + "Version": "4.5.2" } ] } @@ -36,8 +41,7 @@ { "Subject": "project", "Code": null, - "HRef": "http://www.npgsql.org/", - "Description": "License should be verified on http://www.npgsql.org/" + "HRef": "http://www.npgsql.org/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md index a6d8363b..e99ba1c0 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/readme.md @@ -3,13 +3,13 @@ Npgsql [4.0.11](https://www.nuget.org/packages/Npgsql/4.0.11) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [PostgreSQL](../../../../licenses/postgresql) - package license: [PostgreSQL](https://licenses.nuget.org/PostgreSQL) - repository license: [PostgreSQL](git://github.com/npgsql/npgsql) -- project license: [Unknown](http://www.npgsql.org/) , License should be verified on http://www.npgsql.org/ +- project license: [Unknown](http://www.npgsql.org/) Description ----------- @@ -20,11 +20,13 @@ Remarks no remarks -Dependencies 1 +Dependencies 3 ----------- |Name|Version| |----------|:----| +|[System.Memory](../../../../packages/nuget.org/system.memory/4.5.3)|4.5.3| |[System.Runtime.CompilerServices.Unsafe](../../../../packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2)|4.5.2| +|[System.Threading.Tasks.Extensions](../../../../packages/nuget.org/system.threading.tasks.extensions/4.5.2)|4.5.2| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/repository-LICENSE index b102b0e3..efec310c 100644 --- a/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/repository-LICENSE +++ b/Build/third-party-libraries/packages/nuget.org/npgsql/4.0.11/repository-LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2002-2021, Npgsql +Copyright (c) 2002-2023, Npgsql Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json similarity index 75% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json index 81aabac3..bc28354a 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json @@ -25,13 +25,12 @@ "Subject": "repository", "Code": null, "HRef": "https://github.com/NuGet/NuGet.Client", - "Description": "License should be verified on https://github.com/NuGet/NuGet.Client" + "Description": "License code NOASSERTION" }, { "Subject": "project", "Code": null, - "HRef": "https://aka.ms/nugetprj", - "Description": "License should be verified on https://aka.ms/nugetprj" + "HRef": "https://aka.ms/nugetprj" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/package.nuspec similarity index 86% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/package.nuspec index 5cb721d9..811d1c0d 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/package.nuspec @@ -2,20 +2,20 @@ NuGet.Frameworks - 5.11.0 + 6.5.0 Microsoft true Apache-2.0 https://licenses.nuget.org/Apache-2.0 icon.png + README.md https://aka.ms/nugetprj NuGet's understanding of target frameworks. © Microsoft Corporation. All rights reserved. nuget true - + - diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md similarity index 62% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md index 7a067fec..49077907 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md @@ -1,4 +1,4 @@ -NuGet.Frameworks [5.11.0](https://www.nuget.org/packages/NuGet.Frameworks/5.11.0) +NuGet.Frameworks [6.5.0](https://www.nuget.org/packages/NuGet.Frameworks/6.5.0) -------------------- Used by: SqlDatabase internal @@ -8,8 +8,8 @@ Target frameworks: net472, net6.0, net7.0 License: [Apache-2.0](../../../../licenses/apache-2.0) - package license: [Apache-2.0](https://licenses.nuget.org/Apache-2.0) -- repository license: [Unknown](https://github.com/NuGet/NuGet.Client) , License should be verified on https://github.com/NuGet/NuGet.Client -- project license: [Unknown](https://aka.ms/nugetprj) , License should be verified on https://aka.ms/nugetprj +- repository license: [Unknown](https://github.com/NuGet/NuGet.Client) , License code NOASSERTION +- project license: [Unknown](https://aka.ms/nugetprj) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/remarks.md b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/remarks.md rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/repository-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/repository-LICENSE.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nuget.frameworks/5.11.0/repository-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/repository-LICENSE.txt diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json similarity index 76% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json index 9b16bdaa..ef0a10ca 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json @@ -18,8 +18,9 @@ "Licenses": [ { "Subject": "package", - "Code": null, - "HRef": "LICENSE.txt" + "Code": "MIT", + "HRef": "LICENSE.txt", + "Description": "The license file is identical to the repository license file." }, { "Subject": "repository", @@ -29,8 +30,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://nunit.org/", - "Description": "License should be verified on https://nunit.org/" + "HRef": "https://nunit.org/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package-LICENSE.txt similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package-LICENSE.txt index ab7da19e..7eb103cf 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package-LICENSE.txt +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2022 Charlie Poole, Rob Prouse +Copyright (c) 2023 Charlie Poole, Rob Prouse Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package.nuspec b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package.nuspec similarity index 94% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package.nuspec index 70a874bf..13489c22 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/package.nuspec @@ -2,7 +2,7 @@ NUnit - 3.13.3 + 3.14.0 NUnit Charlie Poole, Rob Prouse Charlie Poole, Rob Prouse @@ -10,6 +10,7 @@ LICENSE.txt https://aka.ms/deprecateLicenseUrl icon.png + README.md https://nunit.org/ https://cdn.rawgit.com/nunit/resources/master/images/icon/nunit_256.png NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. @@ -21,7 +22,7 @@ Supported platforms: - .NET Standard 2.0+

NUnit is a unit-testing framework for all .NET languages with a strong TDD focus. This package includes the NUnit 3 framework assembly, which is referenced by your tests. You will need to install version 3 of the nunit3-console program or a third-party runner that supports NUnit 3 in order to execute tests. Runners intended for use with NUnit 2.x will not run NUnit 3 tests correctly. - Copyright (c) 2022 Charlie Poole, Rob Prouse + Copyright (c) 2023 Charlie Poole, Rob Prouse en-US nunit test testing tdd framework fluent assert theory plugin addin diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md similarity index 79% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md index 64527ef4..509b42fc 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md @@ -1,4 +1,4 @@ -NUnit [3.13.3](https://www.nuget.org/packages/NUnit/3.13.3) +NUnit [3.14.0](https://www.nuget.org/packages/NUnit/3.14.0) -------------------- Used by: SqlDatabase internal @@ -7,9 +7,9 @@ Target frameworks: net472, net6.0, net7.0 License: [MIT](../../../../licenses/mit) -- package license: [Unknown]() +- package license: [MIT]() , The license file is identical to the repository license file. - repository license: [MIT](https://github.com/nunit/nunit) -- project license: [Unknown](https://nunit.org/) , License should be verified on https://nunit.org/ +- project license: [Unknown](https://nunit.org/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/remarks.md b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/remarks.md rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/repository-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/repository-LICENSE.txt similarity index 95% rename from Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/repository-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/repository-LICENSE.txt index 29f0e2ea..7eb103cf 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.13.3/repository-LICENSE.txt +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/repository-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2021 Charlie Poole, Rob Prouse +Copyright (c) 2023 Charlie Poole, Rob Prouse Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json similarity index 84% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json index ef0100e7..659b1c2b 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json @@ -29,8 +29,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://docs.nunit.org/articles/vs-test-adapter/Index.html", - "Description": "License should be verified on https://docs.nunit.org/articles/vs-test-adapter/Index.html" + "HRef": "https://docs.nunit.org/articles/vs-test-adapter/Index.html" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/package.nuspec b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/package.nuspec similarity index 82% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/package.nuspec index b703abf0..bd455332 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/package.nuspec @@ -2,21 +2,22 @@ NUnit3TestAdapter - 4.3.1 + 4.5.0 NUnit3 Test Adapter for Visual Studio and DotNet Charlie Poole, Terje Sandstrom false MIT https://licenses.nuget.org/MIT + nunit_256.png + docs\README.md https://docs.nunit.org/articles/vs-test-adapter/Index.html - https://cdn.rawgit.com/nunit/resources/master/images/icon/nunit_256.png - The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core). + The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core), versions .net framework 4.6.2 or higher, .net core 3.1, .net 5 or higher. Note that this package ONLY contains the adapter, not the NUnit framework. For VS 2017 and forward, you should add this package to every test project in your solution. (Earlier versions only require a single adapter package per solution.) NUnit3 adapter for running tests in Visual Studio and DotNet. Works with NUnit 3.x, use the NUnit 2 adapter for 2.x tests. See https://docs.nunit.org/articles/vs-test-adapter/Adapter-Release-Notes.html - Copyright (c) 2011-2021 Charlie Poole, 2014-2022 Terje Sandstrom + Copyright (c) 2011-2021 Charlie Poole, 2014-2023 Terje Sandstrom en-US test visualstudio testadapter nunit nunit3 dotnet diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md similarity index 76% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md index 73590804..7310d040 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md @@ -1,4 +1,4 @@ -NUnit3TestAdapter [4.3.1](https://www.nuget.org/packages/NUnit3TestAdapter/4.3.1) +NUnit3TestAdapter [4.5.0](https://www.nuget.org/packages/NUnit3TestAdapter/4.5.0) -------------------- Used by: SqlDatabase internal @@ -9,11 +9,11 @@ License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) - repository license: [MIT](https://github.com/nunit/nunit3-vs-adapter) -- project license: [Unknown](https://docs.nunit.org/articles/vs-test-adapter/Index.html) , License should be verified on https://docs.nunit.org/articles/vs-test-adapter/Index.html +- project license: [Unknown](https://docs.nunit.org/articles/vs-test-adapter/Index.html) Description ----------- -The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core). +The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core), versions .net framework 4.6.2 or higher, .net core 3.1, .net 5 or higher. Note that this package ONLY contains the adapter, not the NUnit framework. For VS 2017 and forward, you should add this package to every test project in your solution. (Earlier versions only require a single adapter package per solution.) diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/repository-LICENSE b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/repository-LICENSE similarity index 94% rename from Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/repository-LICENSE rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/repository-LICENSE index 3302bf8b..6783f2bb 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.3.1/repository-LICENSE +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/repository-LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2011-2020 Charlie Poole, 2014-2022 Terje Sandstrom +Copyright (c) 2011-2020 Charlie Poole, 2014-2023 Terje Sandstrom Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/project-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/project-LICENSE.txt deleted file mode 100644 index 2b31d119..00000000 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/project-LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the names of the copyright holders nor the names of - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -[ http://www.opensource.org/licenses/bsd-license.php ] \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md deleted file mode 100644 index 8e4162b8..00000000 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -Shouldly [4.1.0](https://www.nuget.org/packages/Shouldly/4.1.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [BSD-2-Clause](../../../../licenses/bsd-2-clause) - -- package license: [BSD-2-Clause](https://licenses.nuget.org/BSD-2-Clause) -- repository license: [Unknown](https://github.com/shouldly/shouldly.git) , License should be verified on https://github.com/shouldly/shouldly.git -- project license: [Unknown](https://github.com/shouldly/shouldly) , License should be verified on https://github.com/shouldly/shouldly - -Description ------------ -Shouldly - Assertion framework for .NET. The way asserting *Should* be - -Remarks ------------ -no remarks - - -Dependencies 2 ------------ - -|Name|Version| -|----------|:----| -|[DiffEngine](../../../../packages/nuget.org/diffengine/10.0.0)|10.0.0| -|[EmptyFiles](../../../../packages/nuget.org/emptyfiles/2.8.0)|2.8.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/index.json similarity index 67% rename from Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json rename to Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/index.json index 3b1c4481..89f9ce8c 100644 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/index.json @@ -9,18 +9,20 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { "Name": "DiffEngine", - "Version": "10.0.0" + "Version": "11.3.0" }, { "Name": "EmptyFiles", - "Version": "2.8.0" + "Version": "4.4.0" + }, + { + "Name": "Microsoft.CSharp", + "Version": "4.7.0" } ] } @@ -35,13 +37,12 @@ "Subject": "repository", "Code": null, "HRef": "https://github.com/shouldly/shouldly.git", - "Description": "License should be verified on https://github.com/shouldly/shouldly.git" + "Description": "License code NOASSERTION" }, { "Subject": "project", "Code": null, - "HRef": "https://github.com/shouldly/shouldly", - "Description": "License should be verified on https://github.com/shouldly/shouldly" + "HRef": "https://shouldly.org/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/package.nuspec similarity index 62% rename from Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/package.nuspec index 9942b38e..45d46151 100644 --- a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/package.nuspec @@ -2,20 +2,24 @@ Shouldly - 4.1.0 + 4.2.1 Jake Ginnivan, Joseph Woodward, Simon Cropp BSD-2-Clause https://licenses.nuget.org/BSD-2-Clause assets/logo_128x128.png - https://github.com/shouldly/shouldly + https://shouldly.org/ Shouldly - Assertion framework for .NET. The way asserting *Should* be - https://github.com/shouldly/releases/tag/4.1.0 + https://github.com/shouldly/releases/tag/4.2.1 test unit testing TDD AAA should testunit rspec assert assertion framework - + + + + + - - + + diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/readme.md b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/readme.md new file mode 100644 index 00000000..1fd52e51 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/readme.md @@ -0,0 +1,32 @@ +Shouldly [4.2.1](https://www.nuget.org/packages/Shouldly/4.2.1) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [BSD-2-Clause](../../../../licenses/bsd-2-clause) + +- package license: [BSD-2-Clause](https://licenses.nuget.org/BSD-2-Clause) +- repository license: [Unknown](https://github.com/shouldly/shouldly.git) , License code NOASSERTION +- project license: [Unknown](https://shouldly.org/) + +Description +----------- +Shouldly - Assertion framework for .NET. The way asserting *Should* be + +Remarks +----------- +no remarks + + +Dependencies 3 +----------- + +|Name|Version| +|----------|:----| +|[DiffEngine](../../../../packages/nuget.org/diffengine/11.3.0)|11.3.0| +|[EmptyFiles](../../../../packages/nuget.org/emptyfiles/4.4.0)|4.4.0| +|[Microsoft.CSharp](../../../../packages/nuget.org/microsoft.csharp/4.7.0)|4.7.0| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/remarks.md b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/remarks.md rename to Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/repository-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/repository-LICENSE.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/shouldly/4.1.0/repository-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/repository-LICENSE.txt diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/shouldly/4.2.1/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/index.json rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/package-LICENSE b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/package-LICENSE similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/package-LICENSE rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/package-LICENSE diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/package.nuspec b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/package.nuspec similarity index 92% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/package.nuspec index d0148958..9fd61111 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/package.nuspec @@ -2,7 +2,7 @@ StyleCop.Analyzers.Unstable - 1.2.0.435 + 1.2.0.507 StyleCop.Analyzers.Unstable Sam Harwell et. al. Sam Harwell @@ -12,7 +12,7 @@ https://licenses.nuget.org/MIT https://github.com/DotNetAnalyzers/StyleCopAnalyzers An implementation of StyleCop's rules using Roslyn analyzers and code fixes - https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/1.2.0-beta.435 + https://github.com/DotNetAnalyzers/StyleCopAnalyzers/releases/1.2.0-beta.507 Copyright 2015 Tunnel Vision Laboratories, LLC StyleCop DotNetAnalyzers Roslyn Diagnostic Analyzer diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/project-LICENSE b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/project-LICENSE similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/project-LICENSE rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/project-LICENSE diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md similarity index 81% rename from Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md index 7be889bc..61302f29 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md @@ -1,4 +1,4 @@ -StyleCop.Analyzers.Unstable [1.2.0.435](https://www.nuget.org/packages/StyleCop.Analyzers.Unstable/1.2.0.435) +StyleCop.Analyzers.Unstable [1.2.0.507](https://www.nuget.org/packages/StyleCop.Analyzers.Unstable/1.2.0.507) -------------------- Used by: SqlDatabase internal diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json index 77dc572f..082ffec6 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md index 800296fe..dfd93595 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.4.0/readme.md @@ -3,12 +3,12 @@ System.Buffers [4.4.0](https://www.nuget.org/packages/System.Buffers/4.4.0) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json index 77dc572f..32f97a40 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +23,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md index 487aa23d..710959a7 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.buffers/4.5.1/readme.md @@ -3,12 +3,12 @@ System.Buffers [4.5.1](https://www.nuget.org/packages/System.Buffers/4.5.1) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/index.json similarity index 81% rename from Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/index.json index 8c27a13f..0502ba77 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/index.json @@ -9,9 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ] } ], @@ -24,12 +22,12 @@ { "Subject": "repository", "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime" + "HRef": "https://github.com/dotnet/runtime" }, { "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime" + "Code": null, + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/project-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/project-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/package.nuspec similarity index 50% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/package.nuspec index 81a09f5b..d6e3148b 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/package.nuspec @@ -1,37 +1,28 @@  - - + + System.CodeDom - 5.0.0 - System.CodeDom + 6.0.0 Microsoft - microsoft,dotnetframework - false MIT https://licenses.nuget.org/MIT Icon.png - https://github.com/dotnet/runtime - http://go.microsoft.com/fwlink/?LinkID=288859 + https://dot.net/ Provides types that can be used to model the structure of a source code document and to output source code for that model in a supported language. Commonly Used Types: System.CodeDom.CodeObject System.CodeDom.Compiler.CodeDomProvider Microsoft.CSharp.CSharpCodeProvider -Microsoft.VisualBasic.VBCodeProvider - -When using NuGet 3.x this package requires at least version 3.4. +Microsoft.VisualBasic.VBCodeProvider https://go.microsoft.com/fwlink/?LinkID=799421 © Microsoft Corporation. All rights reserved. true - + + - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/readme.md similarity index 65% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/readme.md index 5663fd70..302268e4 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/readme.md @@ -1,15 +1,15 @@ -System.CodeDom [5.0.0](https://www.nuget.org/packages/System.CodeDom/5.0.0) +System.CodeDom [6.0.0](https://www.nuget.org/packages/System.CodeDom/6.0.0) -------------------- Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](git://github.com/dotnet/runtime) -- project license: [MIT](https://github.com/dotnet/runtime) +- repository license: [MIT](https://github.com/dotnet/runtime) +- project license: [Unknown](https://dot.net/) Description ----------- @@ -20,8 +20,6 @@ System.CodeDom.CodeObject System.CodeDom.Compiler.CodeDomProvider Microsoft.CSharp.CSharpCodeProvider Microsoft.VisualBasic.VBCodeProvider - -When using NuGet 3.x this package requires at least version 3.4. Remarks ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/repository-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/5.0.0/repository-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/repository-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.codedom/6.0.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package.nuspec deleted file mode 100644 index 57097461..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package.nuspec +++ /dev/null @@ -1,59 +0,0 @@ - - - - System.Configuration.ConfigurationManager - 4.5.0 - System.Configuration.ConfigurationManager - Microsoft - microsoft,dotnetframework - false - https://github.com/dotnet/corefx/blob/master/LICENSE.TXT - https://dot.net/ - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides types that support using configuration files. - -Commonly Used Types: -System.Configuration.Configuration -System.Configuration.ConfigurationManager - -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md deleted file mode 100644 index ad43b471..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -System.Configuration.ConfigurationManager [4.5.0](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.5.0) --------------------- - -Used by: SqlDatabase - -Target frameworks: net472, net6.0, net7.0, netstandard2.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ - -Description ------------ -Provides types that support using configuration files. - -Commonly Used Types: -System.Configuration.Configuration -System.Configuration.ConfigurationManager - -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 2 ------------ - -|Name|Version| -|----------|:----| -|[System.Security.Cryptography.ProtectedData](../../../../packages/nuget.org/system.security.cryptography.protecteddata/4.5.0)|4.5.0| -|[System.Security.Permissions](../../../../packages/nuget.org/system.security.permissions/4.5.0)|4.5.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json index bc976533..93ca46c5 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json @@ -19,9 +19,25 @@ "Name": "Microsoft.Win32.Registry", "Version": "4.7.0" }, + { + "Name": "System.Buffers", + "Version": "4.5.1" + }, + { + "Name": "System.Diagnostics.DiagnosticSource", + "Version": "4.7.0" + }, + { + "Name": "System.Memory", + "Version": "4.5.4" + }, { "Name": "System.Security.Principal.Windows", "Version": "4.7.0" + }, + { + "Name": "System.Text.Encoding.CodePages", + "Version": "4.7.0" } ] } @@ -35,8 +51,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md index 1390bd7f..9b149b43 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md @@ -8,7 +8,7 @@ Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- @@ -32,12 +32,16 @@ Remarks no remarks -Dependencies 2 +Dependencies 6 ----------- |Name|Version| |----------|:----| |[Microsoft.Win32.Registry](../../../../packages/nuget.org/microsoft.win32.registry/4.7.0)|4.7.0| +|[System.Buffers](../../../../packages/nuget.org/system.buffers/4.5.1)|4.5.1| +|[System.Diagnostics.DiagnosticSource](../../../../packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0)|4.7.0| +|[System.Memory](../../../../packages/nuget.org/system.memory/4.5.4)|4.5.4| |[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/4.7.0)|4.7.0| +|[System.Text.Encoding.CodePages](../../../../packages/nuget.org/system.text.encoding.codepages/4.7.0)|4.7.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json index be21d781..4d4b6b37 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +29,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md index b0859969..968c953e 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0/readme.md @@ -3,12 +3,12 @@ System.Diagnostics.DiagnosticSource [4.7.0](https://www.nuget.org/packages/Syste Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json similarity index 66% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json index f109c484..7ab0c08d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/index.json @@ -9,14 +9,12 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { "Name": "System.Security.Principal.Windows", - "Version": "5.0.0" + "Version": "4.7.0" } ] } @@ -27,15 +25,10 @@ "Code": "MIT", "HRef": "https://licenses.nuget.org/MIT" }, - { - "Subject": "repository", - "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime" - }, { "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime" + "Code": null, + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec similarity index 57% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec index 532ae482..3c247bb4 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/package.nuspec @@ -1,55 +1,49 @@  - System.Security.AccessControl - 5.0.0 - System.Security.AccessControl + System.Diagnostics.EventLog + 4.7.0 + System.Diagnostics.EventLog Microsoft microsoft,dotnetframework false MIT https://licenses.nuget.org/MIT - Icon.png - https://github.com/dotnet/runtime + https://github.com/dotnet/corefx http://go.microsoft.com/fwlink/?LinkID=288859 - Provides base classes that enable managing access and audit control lists on securable objects. + Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. Commonly Used Types: -System.Security.AccessControl.AccessRule -System.Security.AccessControl.AuditRule -System.Security.AccessControl.ObjectAccessRule -System.Security.AccessControl.ObjectAuditRule -System.Security.AccessControl.ObjectSecurity +System.Diagnostics.EventLog When using NuGet 3.x this package requires at least version 3.4. https://go.microsoft.com/fwlink/?LinkID=799421 © Microsoft Corporation. All rights reserved. true - - - - - + - - - + + - - - - + + + + - + - + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md new file mode 100644 index 00000000..f6a9054b --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/readme.md @@ -0,0 +1,34 @@ +System.Diagnostics.EventLog [4.7.0](https://www.nuget.org/packages/System.Diagnostics.EventLog/4.7.0) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://licenses.nuget.org/MIT) +- project license: [Unknown](https://github.com/dotnet/corefx) + +Description +----------- +Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. + +Commonly Used Types: +System.Diagnostics.EventLog + +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 1 +----------- + +|Name|Version| +|----------|:----| +|[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/4.7.0)|4.7.0| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/4.7.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package.nuspec deleted file mode 100644 index 292fa0aa..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package.nuspec +++ /dev/null @@ -1,33 +0,0 @@ - - - - System.Diagnostics.EventLog - 6.0.0 - Microsoft - MIT - https://licenses.nuget.org/MIT - Icon.png - https://dot.net/ - Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. - -Commonly Used Types: -System.Diagnostics.EventLog - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md deleted file mode 100644 index 248e2b72..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/readme.md +++ /dev/null @@ -1,30 +0,0 @@ -System.Diagnostics.EventLog [6.0.0](https://www.nuget.org/packages/System.Diagnostics.EventLog/6.0.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](https://github.com/dotnet/runtime) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ - -Description ------------ -Provides the System.Diagnostics.EventLog class, which allows the applications to use the windows event log service. - -Commonly Used Types: -System.Diagnostics.EventLog - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/index.json similarity index 76% rename from Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/index.json index c78961c0..fccb4cdd 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/index.json @@ -9,9 +9,13 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" + ], + "Dependencies": [ + { + "Name": "System.CodeDom", + "Version": "6.0.0" + } ] } ], @@ -29,8 +33,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/project-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/project-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/package.nuspec similarity index 55% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/package.nuspec rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/package.nuspec index 057dca93..6fd2bc59 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/package.nuspec +++ b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/package.nuspec @@ -1,42 +1,37 @@  - + System.Management - 5.0.0 - System.Management + 6.0.1 Microsoft - microsoft,dotnetframework - false MIT https://licenses.nuget.org/MIT Icon.png - https://github.com/dotnet/runtime - http://go.microsoft.com/fwlink/?LinkID=288859 + https://dot.net/ Provides access to a rich set of management information and management events about the system, devices, and applications instrumented to the Windows Management Instrumentation (WMI) infrastructure. Commonly Used Types: System.Management.ManagementClass System.Management.ManagementObject -System.Management.SelectQuery - -When using NuGet 3.x this package requires at least version 3.4. +System.Management.SelectQuery https://go.microsoft.com/fwlink/?LinkID=799421 © Microsoft Corporation. All rights reserved. true - + - - - - - + + + + + + - + - + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/readme.md similarity index 60% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/readme.md index d5420120..f85bfd79 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/readme.md @@ -1,15 +1,15 @@ -System.Management [5.0.0](https://www.nuget.org/packages/System.Management/5.0.0) +System.Management [6.0.1](https://www.nuget.org/packages/System.Management/6.0.1) -------------------- Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](git://github.com/dotnet/runtime) -- project license: [MIT](https://github.com/dotnet/runtime) +- repository license: [MIT](https://github.com/dotnet/runtime) +- project license: [Unknown](https://dot.net/) Description ----------- @@ -19,20 +19,17 @@ Commonly Used Types: System.Management.ManagementClass System.Management.ManagementObject System.Management.SelectQuery - -When using NuGet 3.x this package requires at least version 3.4. Remarks ----------- no remarks -Dependencies 2 +Dependencies 1 ----------- |Name|Version| |----------|:----| -|[Microsoft.Win32.Registry](../../../../packages/nuget.org/microsoft.win32.registry/5.0.0)|5.0.0| -|[System.CodeDom](../../../../packages/nuget.org/system.codedom/5.0.0)|5.0.0| +|[System.CodeDom](../../../../packages/nuget.org/system.codedom/6.0.0)|6.0.0| *This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/repository-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.codedom/5.0.0/repository-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/repository-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.management/6.0.1/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/index.json similarity index 66% rename from Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/index.json index a6561819..424d9dad 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/index.json @@ -9,18 +9,19 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ { - "Name": "System.Security.Cryptography.ProtectedData", - "Version": "4.5.0" + "Name": "System.Buffers", + "Version": "4.4.0" + }, + { + "Name": "System.Numerics.Vectors", + "Version": "4.4.0" }, { - "Name": "System.Security.Permissions", + "Name": "System.Runtime.CompilerServices.Unsafe", "Version": "4.5.0" } ] @@ -35,8 +36,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.configuration.configurationmanager/4.5.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package.nuspec new file mode 100644 index 00000000..e23e3439 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/package.nuspec @@ -0,0 +1,78 @@ + + + + System.Memory + 4.5.0 + System.Memory + Microsoft + microsoft,dotnetframework + false + https://github.com/dotnet/corefx/blob/master/LICENSE.TXT + https://dot.net/ + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides types for efficient representation and pooling of managed, stack, and native memory segments and sequences of such segments, along with primitives to parse and format UTF-8 encoded text stored in those memory segments. + +Commonly Used Types: +System.Span +System.ReadOnlySpan +System.Memory +System.ReadOnlyMemory +System.Buffers.MemoryPool +System.Buffers.ReadOnlySequence +System.Buffers.Text.Utf8Parser +System.Buffers.Text.Utf8Formatter + +30ab651fcb4354552bd4891619a0bdd81e0ebdbf +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/readme.md new file mode 100644 index 00000000..108f2115 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/readme.md @@ -0,0 +1,44 @@ +System.Memory [4.5.0](https://www.nuget.org/packages/System.Memory/4.5.0) +-------------------- + +Used by: SqlDatabase + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) +- project license: [Unknown](https://dot.net/) + +Description +----------- +Provides types for efficient representation and pooling of managed, stack, and native memory segments and sequences of such segments, along with primitives to parse and format UTF-8 encoded text stored in those memory segments. + +Commonly Used Types: +System.Span +System.ReadOnlySpan +System.Memory +System.ReadOnlyMemory +System.Buffers.MemoryPool +System.Buffers.ReadOnlySequence +System.Buffers.Text.Utf8Parser +System.Buffers.Text.Utf8Formatter + +30ab651fcb4354552bd4891619a0bdd81e0ebdbf +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 3 +----------- + +|Name|Version| +|----------|:----| +|[System.Buffers](../../../../packages/nuget.org/system.buffers/4.4.0)|4.4.0| +|[System.Numerics.Vectors](../../../../packages/nuget.org/system.numerics.vectors/4.4.0)|4.4.0| +|[System.Runtime.CompilerServices.Unsafe](../../../../packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0)|4.5.0| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json index 922821ce..ecf6310f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ @@ -39,8 +36,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md index 3fcd6956..7e47f857 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.3/readme.md @@ -3,12 +3,12 @@ System.Memory [4.5.3](https://www.nuget.org/packages/System.Memory/4.5.3) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json index e65a5a26..a1e7bf15 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ @@ -39,8 +37,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md index 81196829..ba47fe32 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.4/readme.md @@ -3,12 +3,12 @@ System.Memory [4.5.4](https://www.nuget.org/packages/System.Memory/4.5.4) Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/index.json similarity index 51% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/index.json index 4c310736..14b4bc4b 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/index.json @@ -9,18 +9,20 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { - "Name": "Microsoft.Win32.Registry", - "Version": "5.0.0" + "Name": "System.Buffers", + "Version": "4.5.1" }, { - "Name": "System.CodeDom", - "Version": "5.0.0" + "Name": "System.Numerics.Vectors", + "Version": "4.4.0" + }, + { + "Name": "System.Runtime.CompilerServices.Unsafe", + "Version": "4.5.3" } ] } @@ -29,17 +31,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://licenses.nuget.org/MIT" - }, - { - "Subject": "repository", - "Code": "MIT", - "HRef": "git://github.com/dotnet/runtime" + "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" }, { "Subject": "project", - "Code": "MIT", - "HRef": "https://github.com/dotnet/runtime" + "Code": null, + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package.nuspec new file mode 100644 index 00000000..2c1dc836 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/package.nuspec @@ -0,0 +1,105 @@ + + + + System.Memory + 4.5.5 + System.Memory + Microsoft + microsoft,dotnetframework + false + https://github.com/dotnet/corefx/blob/master/LICENSE.TXT + https://dot.net/ + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides types for efficient representation and pooling of managed, stack, and native memory segments and sequences of such segments, along with primitives to parse and format UTF-8 encoded text stored in those memory segments. + +Commonly Used Types: +System.Span +System.ReadOnlySpan +System.Memory +System.ReadOnlyMemory +System.Buffers.MemoryPool +System.Buffers.ReadOnlySequence +System.Buffers.Text.Utf8Parser +System.Buffers.Text.Utf8Formatter + +32b491939fbd125f304031c35038b1e14b4e3958 +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/readme.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/readme.md new file mode 100644 index 00000000..148edfdd --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/readme.md @@ -0,0 +1,44 @@ +System.Memory [4.5.5](https://www.nuget.org/packages/System.Memory/4.5.5) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) +- project license: [Unknown](https://dot.net/) + +Description +----------- +Provides types for efficient representation and pooling of managed, stack, and native memory segments and sequences of such segments, along with primitives to parse and format UTF-8 encoded text stored in those memory segments. + +Commonly Used Types: +System.Span +System.ReadOnlySpan +System.Memory +System.ReadOnlyMemory +System.Buffers.MemoryPool +System.Buffers.ReadOnlySequence +System.Buffers.Text.Utf8Parser +System.Buffers.Text.Utf8Formatter + +32b491939fbd125f304031c35038b1e14b4e3958 +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 3 +----------- + +|Name|Version| +|----------|:----| +|[System.Buffers](../../../../packages/nuget.org/system.buffers/4.5.1)|4.5.1| +|[System.Numerics.Vectors](../../../../packages/nuget.org/system.numerics.vectors/4.4.0)|4.4.0| +|[System.Runtime.CompilerServices.Unsafe](../../../../packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3)|4.5.3| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.memory/4.5.5/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json index 77dc572f..32f97a40 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +23,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md index 20bdd093..77fe24e5 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.numerics.vectors/4.4.0/readme.md @@ -3,12 +3,12 @@ System.Numerics.Vectors [4.4.0](https://www.nuget.org/packages/System.Numerics.V Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/index.json new file mode 100644 index 00000000..6786e835 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/index.json @@ -0,0 +1,28 @@ +{ + "Source": "https://api.nuget.org/v3/index.json", + "License": { + "Code": "MIT", + "Status": "AutomaticallyApproved" + }, + "UsedBy": [ + { + "Name": "SqlDatabase", + "InternalOnly": true, + "TargetFrameworks": [ + "netstandard2.0" + ] + } + ], + "Licenses": [ + { + "Subject": "package", + "Code": "MIT", + "HRef": "https://licenses.nuget.org/MIT" + }, + { + "Subject": "project", + "Code": null, + "HRef": "https://github.com/dotnet/corefx" + } + ] +} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.diagnostics.eventlog/6.0.0/repository-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package.nuspec new file mode 100644 index 00000000..8761f62c --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/package.nuspec @@ -0,0 +1,59 @@ + + + + System.Reflection.Emit.ILGeneration + 4.7.0 + System.Reflection.Emit.ILGeneration + Microsoft + microsoft,dotnetframework + false + MIT + https://licenses.nuget.org/MIT + https://github.com/dotnet/corefx + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides classes that allow a compiler or tool to emit Microsoft intermediate language (MSIL). The primary clients of these classes are script engines and compilers. + +Commonly Used Types: +System.Reflection.Emit.ILGenerator +System.Reflection.Emit.Label +System.Reflection.Emit.CustomAttributeBuilder +System.Reflection.Emit.LocalBuilder +System.Reflection.Emit.ParameterBuilder +System.Reflection.Emit.SignatureHelper + +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/readme.md new file mode 100644 index 00000000..8d929093 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/readme.md @@ -0,0 +1,36 @@ +System.Reflection.Emit.ILGeneration [4.7.0](https://www.nuget.org/packages/System.Reflection.Emit.ILGeneration/4.7.0) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://licenses.nuget.org/MIT) +- project license: [Unknown](https://github.com/dotnet/corefx) + +Description +----------- +Provides classes that allow a compiler or tool to emit Microsoft intermediate language (MSIL). The primary clients of these classes are script engines and compilers. + +Commonly Used Types: +System.Reflection.Emit.ILGenerator +System.Reflection.Emit.Label +System.Reflection.Emit.CustomAttributeBuilder +System.Reflection.Emit.LocalBuilder +System.Reflection.Emit.ParameterBuilder +System.Reflection.Emit.SignatureHelper + +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 0 +----------- + + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/index.json similarity index 57% rename from Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/index.json index 97431699..00a018c2 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/index.json @@ -1,4 +1,5 @@ { + "Source": "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\", "License": { "Code": "MIT", "Status": "AutomaticallyApproved" @@ -6,16 +7,13 @@ "UsedBy": [ { "Name": "SqlDatabase", - "InternalOnly": false, + "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ { - "Name": "System.Security.AccessControl", + "Name": "System.Reflection.Emit.ILGeneration", "Version": "4.7.0" } ] @@ -25,13 +23,12 @@ { "Subject": "package", "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" + "HRef": "https://licenses.nuget.org/MIT" }, { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/package-LICENSE.txt rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package.nuspec new file mode 100644 index 00000000..ff5cb252 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/package.nuspec @@ -0,0 +1,77 @@ + + + + System.Reflection.Emit + 4.7.0 + System.Reflection.Emit + Microsoft + microsoft,dotnetframework + false + MIT + https://licenses.nuget.org/MIT + https://github.com/dotnet/corefx + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides classes that allow a compiler or tool to emit metadata and optionally generate a PE file on disk. The primary clients of these classes are script engines and compilers. + +Commonly Used Types: +System.Reflection.Emit.AssemblyBuilder +System.Reflection.Emit.FieldBuilder +System.Reflection.Emit.TypeBuilder +System.Reflection.Emit.MethodBuilder +System.Reflection.Emit.ConstructorBuilder +System.Reflection.Emit.GenericTypeParameterBuilder +System.Reflection.Emit.ModuleBuilder +System.Reflection.Emit.PropertyBuilder +System.Reflection.Emit.AssemblyBuilderAccess +System.Reflection.Emit.EventBuilder + +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/readme.md new file mode 100644 index 00000000..5d6571b2 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/readme.md @@ -0,0 +1,43 @@ +System.Reflection.Emit [4.7.0](https://www.nuget.org/packages/System.Reflection.Emit/4.7.0) +-------------------- + +Used by: SqlDatabase internal + +Target frameworks: netstandard2.0 + +License: [MIT](../../../../licenses/mit) + +- package license: [MIT](https://licenses.nuget.org/MIT) +- project license: [Unknown](https://github.com/dotnet/corefx) + +Description +----------- +Provides classes that allow a compiler or tool to emit metadata and optionally generate a PE file on disk. The primary clients of these classes are script engines and compilers. + +Commonly Used Types: +System.Reflection.Emit.AssemblyBuilder +System.Reflection.Emit.FieldBuilder +System.Reflection.Emit.TypeBuilder +System.Reflection.Emit.MethodBuilder +System.Reflection.Emit.ConstructorBuilder +System.Reflection.Emit.GenericTypeParameterBuilder +System.Reflection.Emit.ModuleBuilder +System.Reflection.Emit.PropertyBuilder +System.Reflection.Emit.AssemblyBuilderAccess +System.Reflection.Emit.EventBuilder + +When using NuGet 3.x this package requires at least version 3.4. + +Remarks +----------- +no remarks + + +Dependencies 1 +----------- + +|Name|Version| +|----------|:----| +|[System.Reflection.Emit.ILGeneration](../../../../packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0)|4.7.0| + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.reflection.emit/4.7.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/index.json similarity index 75% rename from Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/index.json index 77dc572f..082ffec6 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/project-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package-LICENSE.TXT similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.management/5.0.0/project-LICENSE.TXT rename to Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package-LICENSE.TXT diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package.nuspec new file mode 100644 index 00000000..8235d41b --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/package.nuspec @@ -0,0 +1,37 @@ + + + + System.Runtime.CompilerServices.Unsafe + 4.5.0 + System.Runtime.CompilerServices.Unsafe + Microsoft + microsoft,dotnetframework + false + https://github.com/dotnet/corefx/blob/master/LICENSE.TXT + https://dot.net/ + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides the System.Runtime.CompilerServices.Unsafe class, which provides generic, low-level functionality for manipulating pointers. + +Commonly Used Types: +System.Runtime.CompilerServices.Unsafe + +30ab651fcb4354552bd4891619a0bdd81e0ebdbf +When using NuGet 3.x this package requires at least version 3.4. + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/readme.md similarity index 50% rename from Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md rename to Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/readme.md index 4e0d3383..f6c5a27f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/readme.md @@ -1,22 +1,21 @@ -System.Security.Cryptography.ProtectedData [4.5.0](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.5.0) +System.Runtime.CompilerServices.Unsafe [4.5.0](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.5.0) -------------------- Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- -Provides access to Windows Data Protection Api. +Provides the System.Runtime.CompilerServices.Unsafe class, which provides generic, low-level functionality for manipulating pointers. Commonly Used Types: -System.Security.Cryptography.DataProtectionScope -System.Security.Cryptography.ProtectedData +System.Runtime.CompilerServices.Unsafe 30ab651fcb4354552bd4891619a0bdd81e0ebdbf When using NuGet 3.x this package requires at least version 3.4. diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json index 77dc572f..082ffec6 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md index 67a2f6e0..c59b68cf 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2/readme.md @@ -3,12 +3,12 @@ System.Runtime.CompilerServices.Unsafe [4.5.2](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json index 89e227cd..581a7123 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/index.json @@ -9,9 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ] } ], @@ -24,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md index a83acbfa..67fdfc27 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3/readme.md @@ -3,12 +3,12 @@ System.Runtime.CompilerServices.Unsafe [4.5.3](https://www.nuget.org/packages/Sy Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json index 3b766d86..5b097663 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +23,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md index 3b50540d..ce59f306 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0/readme.md @@ -3,12 +3,12 @@ System.Runtime.CompilerServices.Unsafe [4.7.0](https://www.nuget.org/packages/Sy Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package.nuspec deleted file mode 100644 index ea8fad1d..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package.nuspec +++ /dev/null @@ -1,52 +0,0 @@ - - - - System.Runtime.InteropServices.RuntimeInformation - 4.3.0 - System.Runtime.InteropServices.RuntimeInformation - Microsoft - microsoft,dotnetframework - true - http://go.microsoft.com/fwlink/?LinkId=329770 - https://dot.net/ - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides APIs to query about runtime and OS information. - -Commonly Used Types: -System.Runtime.InteropServices.RuntimeInformation -System.Runtime.InteropServices.OSPlatform - -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md deleted file mode 100644 index 3e1deba7..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/readme.md +++ /dev/null @@ -1,32 +0,0 @@ -System.Runtime.InteropServices.RuntimeInformation [4.3.0](https://www.nuget.org/packages/System.Runtime.InteropServices.RuntimeInformation/4.3.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [ms-net-library](../../../../licenses/ms-net-library) - -- package license: [ms-net-library](http://go.microsoft.com/fwlink/?LinkId=329770) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ - -Description ------------ -Provides APIs to query about runtime and OS information. - -Commonly Used Types: -System.Runtime.InteropServices.RuntimeInformation -System.Runtime.InteropServices.OSPlatform - -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json index a0a61f27..c9617aac 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ] } @@ -25,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md index 3e8f44ef..3d3c47d9 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.runtime.loader/4.3.0/readme.md @@ -3,12 +3,12 @@ System.Runtime.Loader [4.3.0](https://www.nuget.org/packages/System.Runtime.Load Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [ms-net-library](../../../../licenses/ms-net-library) - package license: [ms-net-library](http://go.microsoft.com/fwlink/?LinkId=329770) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json index a4c139cd..b748b1b9 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json @@ -31,8 +31,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md index 2edfda84..5c735a26 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md @@ -8,7 +8,7 @@ Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md deleted file mode 100644 index 633afc90..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/5.0.0/readme.md +++ /dev/null @@ -1,39 +0,0 @@ -System.Security.AccessControl [5.0.0](https://www.nuget.org/packages/System.Security.AccessControl/5.0.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](git://github.com/dotnet/runtime) -- project license: [MIT](https://github.com/dotnet/runtime) - -Description ------------ -Provides base classes that enable managing access and audit control lists on securable objects. - -Commonly Used Types: -System.Security.AccessControl.AccessRule -System.Security.AccessControl.AuditRule -System.Security.AccessControl.ObjectAccessRule -System.Security.AccessControl.ObjectAuditRule -System.Security.AccessControl.ObjectSecurity - -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 1 ------------ - -|Name|Version| -|----------|:----| -|[System.Security.Principal.Windows](../../../../packages/nuget.org/system.security.principal.windows/5.0.0)|5.0.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package-LICENSE.txt deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package.nuspec deleted file mode 100644 index a4f6089a..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.cryptography.protecteddata/4.5.0/package.nuspec +++ /dev/null @@ -1,49 +0,0 @@ - - - - System.Security.Cryptography.ProtectedData - 4.5.0 - System.Security.Cryptography.ProtectedData - Microsoft - microsoft,dotnetframework - false - https://github.com/dotnet/corefx/blob/master/LICENSE.TXT - https://dot.net/ - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides access to Windows Data Protection Api. - -Commonly Used Types: -System.Security.Cryptography.DataProtectionScope -System.Security.Cryptography.ProtectedData - -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package-LICENSE.txt deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package.nuspec deleted file mode 100644 index b839fab2..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/package.nuspec +++ /dev/null @@ -1,39 +0,0 @@ - - - - System.Security.Permissions - 4.5.0 - System.Security.Permissions - Microsoft - microsoft,dotnetframework - false - https://github.com/dotnet/corefx/blob/master/LICENSE.TXT - https://dot.net/ - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides types supporting Code Access Security (CAS). -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md deleted file mode 100644 index f35b7f79..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.permissions/4.5.0/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -System.Security.Permissions [4.5.0](https://www.nuget.org/packages/System.Security.Permissions/4.5.0) --------------------- - -Used by: SqlDatabase - -Target frameworks: net472, net6.0, net7.0, netstandard2.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ - -Description ------------ -Provides types supporting Code Access Security (CAS). -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 1 ------------ - -|Name|Version| -|----------|:----| -|[System.Security.AccessControl](../../../../packages/nuget.org/system.security.accesscontrol/4.7.0)|4.7.0| - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json index 0b94fd18..054eaff4 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json @@ -25,8 +25,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md index b62a6500..4651717f 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md @@ -8,7 +8,7 @@ Target frameworks: net472, net6.0, net7.0, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package-LICENSE.txt deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package.nuspec deleted file mode 100644 index a1ff48c6..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/package.nuspec +++ /dev/null @@ -1,68 +0,0 @@ - - - - System.Security.Principal.Windows - 5.0.0 - System.Security.Principal.Windows - Microsoft - microsoft,dotnetframework - false - MIT - https://licenses.nuget.org/MIT - Icon.png - https://github.com/dotnet/runtime - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides classes for retrieving the current Windows user and for interacting with Windows users and groups. - -Commonly Used Types: -System.Security.Principal.WindowsIdentity -System.Security.Principal.SecurityIdentifier -System.Security.Principal.NTAccount -System.Security.Principal.WindowsPrincipal -System.Security.Principal.IdentityReference -System.Security.Principal.IdentityNotMappedException -System.Security.Principal.WindowsBuiltInRole -System.Security.Principal.WellKnownSidType - -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/project-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/project-LICENSE.TXT deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/project-LICENSE.TXT +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md deleted file mode 100644 index ccbe4bd2..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/readme.md +++ /dev/null @@ -1,39 +0,0 @@ -System.Security.Principal.Windows [5.0.0](https://www.nuget.org/packages/System.Security.Principal.Windows/5.0.0) --------------------- - -Used by: SqlDatabase internal - -Target frameworks: net472, net6.0, net7.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://licenses.nuget.org/MIT) -- repository license: [MIT](git://github.com/dotnet/runtime) -- project license: [MIT](https://github.com/dotnet/runtime) - -Description ------------ -Provides classes for retrieving the current Windows user and for interacting with Windows users and groups. - -Commonly Used Types: -System.Security.Principal.WindowsIdentity -System.Security.Principal.SecurityIdentifier -System.Security.Principal.NTAccount -System.Security.Principal.WindowsPrincipal -System.Security.Principal.IdentityReference -System.Security.Principal.IdentityNotMappedException -System.Security.Principal.WindowsBuiltInRole -System.Security.Principal.WellKnownSidType - -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/repository-LICENSE.TXT b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/repository-LICENSE.TXT deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/5.0.0/repository-LICENSE.TXT +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json index d5613468..6cc05047 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/index.json @@ -10,8 +10,6 @@ "InternalOnly": false, "TargetFrameworks": [ "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +29,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://github.com/dotnet/corefx", - "Description": "License should be verified on https://github.com/dotnet/corefx" + "HRef": "https://github.com/dotnet/corefx" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md index 819dc5f6..ae05e7a9 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.text.encoding.codepages/4.7.0/readme.md @@ -3,12 +3,12 @@ System.Text.Encoding.CodePages [4.7.0](https://www.nuget.org/packages/System.Tex Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://licenses.nuget.org/MIT) -- project license: [Unknown](https://github.com/dotnet/corefx) , License should be verified on https://github.com/dotnet/corefx +- project license: [Unknown](https://github.com/dotnet/corefx) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/index.json similarity index 61% rename from Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json rename to Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/index.json index 49f0f05b..c9617aac 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/index.json @@ -1,5 +1,5 @@ { - "Source": "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\", + "Source": "https://api.nuget.org/v3/index.json", "License": { "Code": "ms-net-library", "Status": "AutomaticallyApproved" @@ -7,11 +7,9 @@ "UsedBy": [ { "Name": "SqlDatabase", - "InternalOnly": true, + "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ] } ], @@ -24,8 +22,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package-dotnet_library_license.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0/package-dotnet_library_license.txt rename to Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package-dotnet_library_license.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package.nuspec new file mode 100644 index 00000000..6f6dc811 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/package.nuspec @@ -0,0 +1,38 @@ + + + + System.Threading.Tasks.Extensions + 4.3.0 + System.Threading.Tasks.Extensions + Microsoft + microsoft,dotnetframework + true + http://go.microsoft.com/fwlink/?LinkId=329770 + https://dot.net/ + http://go.microsoft.com/fwlink/?LinkID=288859 + Provides additional types that simplify the work of writing concurrent and asynchronous code. + +Commonly Used Types: +System.Threading.Tasks.ValueTask<TResult> + https://go.microsoft.com/fwlink/?LinkID=799421 + © Microsoft Corporation. All rights reserved. + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/readme.md new file mode 100644 index 00000000..0ce97f35 --- /dev/null +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/readme.md @@ -0,0 +1,29 @@ +System.Threading.Tasks.Extensions [4.3.0](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.3.0) +-------------------- + +Used by: SqlDatabase + +Target frameworks: netstandard2.0 + +License: [ms-net-library](../../../../licenses/ms-net-library) + +- package license: [ms-net-library](http://go.microsoft.com/fwlink/?LinkId=329770) +- project license: [Unknown](https://dot.net/) + +Description +----------- +Provides additional types that simplify the work of writing concurrent and asynchronous code. + +Commonly Used Types: +System.Threading.Tasks.ValueTask + +Remarks +----------- +no remarks + + +Dependencies 0 +----------- + + +*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/remarks.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/remarks.md similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/remarks.md rename to Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/remarks.md diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/third-party-notices.txt b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/third-party-notices.txt similarity index 100% rename from Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/third-party-notices.txt rename to Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.3.0/third-party-notices.txt diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json index 529624a0..3c94c934 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/index.json @@ -9,9 +9,6 @@ "Name": "SqlDatabase", "InternalOnly": false, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", "netstandard2.0" ], "Dependencies": [ @@ -31,8 +28,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md index e57f2b1d..50cb3d5e 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.2/readme.md @@ -3,12 +3,12 @@ System.Threading.Tasks.Extensions [4.5.2](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json index 6847e281..9c30edc5 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/index.json @@ -9,9 +9,7 @@ "Name": "SqlDatabase", "InternalOnly": true, "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0" + "netstandard2.0" ], "Dependencies": [ { @@ -30,8 +28,7 @@ { "Subject": "project", "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" + "HRef": "https://dot.net/" } ] } \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md index 426cca16..2c92941d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.threading.tasks.extensions/4.5.4/readme.md @@ -3,12 +3,12 @@ System.Threading.Tasks.Extensions [4.5.4](https://www.nuget.org/packages/System. Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: netstandard2.0 License: [MIT](../../../../licenses/mit) - package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ +- project license: [Unknown](https://dot.net/) Description ----------- diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json deleted file mode 100644 index d8ec4970..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/index.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "License": { - "Code": "MIT", - "Status": "AutomaticallyApproved" - }, - "UsedBy": [ - { - "Name": "SqlDatabase", - "InternalOnly": false, - "TargetFrameworks": [ - "net472", - "net6.0", - "net7.0", - "netstandard2.0" - ] - } - ], - "Licenses": [ - { - "Subject": "package", - "Code": "MIT", - "HRef": "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT" - }, - { - "Subject": "project", - "Code": null, - "HRef": "https://dot.net/", - "Description": "License should be verified on https://dot.net/" - } - ] -} \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package-LICENSE.txt b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package-LICENSE.txt deleted file mode 100644 index 984713a4..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package-LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package.nuspec b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package.nuspec deleted file mode 100644 index b0629162..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/package.nuspec +++ /dev/null @@ -1,58 +0,0 @@ - - - - System.ValueTuple - 4.5.0 - System.ValueTuple - Microsoft - microsoft,dotnetframework - false - https://github.com/dotnet/corefx/blob/master/LICENSE.TXT - https://dot.net/ - http://go.microsoft.com/fwlink/?LinkID=288859 - Provides the System.ValueTuple structs, which implement the underlying types for tuples in C# and Visual Basic. - -Commonly Used Types: -System.ValueTuple -System.ValueTuple<T1> -System.ValueTuple<T1, T2> -System.ValueTuple<T1, T2, T3> -System.ValueTuple<T1, T2, T3, T4> -System.ValueTuple<T1, T2, T3, T4, T5> -System.ValueTuple<T1, T2, T3, T4, T5, T6> -System.ValueTuple<T1, T2, T3, T4, T5, T6, T7> -System.ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest> - -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - https://go.microsoft.com/fwlink/?LinkID=799421 - © Microsoft Corporation. All rights reserved. - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md deleted file mode 100644 index e30be422..00000000 --- a/Build/third-party-libraries/packages/nuget.org/system.valuetuple/4.5.0/readme.md +++ /dev/null @@ -1,40 +0,0 @@ -System.ValueTuple [4.5.0](https://www.nuget.org/packages/System.ValueTuple/4.5.0) --------------------- - -Used by: SqlDatabase - -Target frameworks: net472, net6.0, net7.0, netstandard2.0 - -License: [MIT](../../../../licenses/mit) - -- package license: [MIT](https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) -- project license: [Unknown](https://dot.net/) , License should be verified on https://dot.net/ - -Description ------------ -Provides the System.ValueTuple structs, which implement the underlying types for tuples in C# and Visual Basic. - -Commonly Used Types: -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple -System.ValueTuple - -30ab651fcb4354552bd4891619a0bdd81e0ebdbf -When using NuGet 3.x this package requires at least version 3.4. - -Remarks ------------ -no remarks - - -Dependencies 0 ------------ - - -*This page was generated by a tool.* \ No newline at end of file diff --git a/Build/third-party-libraries/readme.md b/Build/third-party-libraries/readme.md index 71542df4..2d4b39cd 100644 --- a/Build/third-party-libraries/readme.md +++ b/Build/third-party-libraries/readme.md @@ -17,55 +17,55 @@ Packages 50 |Name|Version|Source|License|Used by| |----------|:----|:----|:----|:----| -|[Castle.Core](packages/nuget.org/castle.core/5.1.0)|5.1.0|[nuget.org](https://www.nuget.org/packages/Castle.Core/5.1.0)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| -|[Dapper.StrongName](packages/nuget.org/dapper.strongname/2.0.123)|2.0.123|[nuget.org](https://www.nuget.org/packages/Dapper.StrongName/2.0.123)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| -|[DiffEngine](packages/nuget.org/diffengine/10.0.0)|10.0.0|[nuget.org](https://www.nuget.org/packages/DiffEngine/10.0.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[EmptyFiles](packages/nuget.org/emptyfiles/2.8.0)|2.8.0|[nuget.org](https://www.nuget.org/packages/EmptyFiles/2.8.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[Microsoft.CodeCoverage](packages/nuget.org/microsoft.codecoverage/17.4.0)|17.4.0|[nuget.org](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.4.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| -|[Microsoft.NET.Test.Sdk](packages/nuget.org/microsoft.net.test.sdk/17.4.0)|17.4.0|[nuget.org](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.4.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| -|[Microsoft.TestPlatform.ObjectModel](packages/nuget.org/microsoft.testplatform.objectmodel/17.4.0)|17.4.0|[nuget.org](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.4.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| -|[Microsoft.TestPlatform.TestHost](packages/nuget.org/microsoft.testplatform.testhost/17.4.0)|17.4.0|[nuget.org](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.4.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| +|[Castle.Core](packages/nuget.org/castle.core/5.1.1)|5.1.1|[nuget.org](https://www.nuget.org/packages/Castle.Core/5.1.1)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| +|[Dapper.StrongName](packages/nuget.org/dapper.strongname/2.1.15)|2.1.15|[nuget.org](https://www.nuget.org/packages/Dapper.StrongName/2.1.15)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| +|[DiffEngine](packages/nuget.org/diffengine/11.3.0)|11.3.0|[nuget.org](https://www.nuget.org/packages/DiffEngine/11.3.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[EmptyFiles](packages/nuget.org/emptyfiles/4.4.0)|4.4.0|[nuget.org](https://www.nuget.org/packages/EmptyFiles/4.4.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[Microsoft.CodeCoverage](packages/nuget.org/microsoft.codecoverage/17.7.2)|17.7.2|[nuget.org](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.7.2)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| +|[Microsoft.CSharp](packages/nuget.org/microsoft.csharp/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/Microsoft.CSharp/4.7.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[Microsoft.NET.Test.Sdk](packages/nuget.org/microsoft.net.test.sdk/17.7.2)|17.7.2|[nuget.org](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.7.2)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| +|[Microsoft.TestPlatform.ObjectModel](packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2)|17.7.2|[nuget.org](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.7.2)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| +|[Microsoft.TestPlatform.TestHost](packages/nuget.org/microsoft.testplatform.testhost/17.7.2)|17.7.2|[nuget.org](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.7.2)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| |[Microsoft.Win32.Registry](packages/nuget.org/microsoft.win32.registry/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/Microsoft.Win32.Registry/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[Microsoft.Win32.Registry](packages/nuget.org/microsoft.win32.registry/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/Microsoft.Win32.Registry/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| |[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.2.0)|7.2.0|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.2.0)|[MIT](licenses/mit)|SqlDatabase| |[Microsoft.WSMan.Runtime](packages/nuget.org/microsoft.wsman.runtime/7.3.0)|7.3.0|[nuget.org](https://www.nuget.org/packages/Microsoft.WSMan.Runtime/7.3.0)|[MIT](licenses/mit)|SqlDatabase| -|[Moq](packages/nuget.org/moq/4.18.2)|4.18.2|[nuget.org](https://www.nuget.org/packages/Moq/4.18.2)|[BSD-3-Clause](licenses/bsd-3-clause)|SqlDatabase internal| +|[Moq](packages/nuget.org/moq/4.20.69)|4.20.69|[nuget.org](https://www.nuget.org/packages/Moq/4.20.69)|[BSD-3-Clause](licenses/bsd-3-clause)|SqlDatabase internal| |[MySqlConnector](packages/nuget.org/mysqlconnector/1.3.10)|1.3.10|[nuget.org](https://www.nuget.org/packages/MySqlConnector/1.3.10)|[MIT](licenses/mit)|SqlDatabase| |[NETStandard.Library](packages/nuget.org/netstandard.library/2.0.3)|2.0.3|[nuget.org](https://www.nuget.org/packages/NETStandard.Library/2.0.3)|[MIT](licenses/mit)|SqlDatabase| -|[Newtonsoft.Json](packages/nuget.org/newtonsoft.json/13.0.2)|13.0.2|[nuget.org](https://www.nuget.org/packages/Newtonsoft.Json/13.0.2)|[MIT](licenses/mit)|SqlDatabase internal| +|[Newtonsoft.Json](packages/nuget.org/newtonsoft.json/13.0.1)|13.0.1|[nuget.org](https://www.nuget.org/packages/Newtonsoft.Json/13.0.1)|[MIT](licenses/mit)|SqlDatabase internal| +|[Newtonsoft.Json](packages/nuget.org/newtonsoft.json/13.0.3)|13.0.3|[nuget.org](https://www.nuget.org/packages/Newtonsoft.Json/13.0.3)|[MIT](licenses/mit)|SqlDatabase internal| |[Npgsql](packages/nuget.org/npgsql/4.0.11)|4.0.11|[nuget.org](https://www.nuget.org/packages/Npgsql/4.0.11)|[PostgreSQL](licenses/postgresql)|SqlDatabase| -|[NuGet.Frameworks](packages/nuget.org/nuget.frameworks/5.11.0)|5.11.0|[nuget.org](https://www.nuget.org/packages/NuGet.Frameworks/5.11.0)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| -|[NUnit](packages/nuget.org/nunit/3.13.3)|3.13.3|[nuget.org](https://www.nuget.org/packages/NUnit/3.13.3)|[MIT](licenses/mit)|SqlDatabase internal| -|[NUnit3TestAdapter](packages/nuget.org/nunit3testadapter/4.3.1)|4.3.1|[nuget.org](https://www.nuget.org/packages/NUnit3TestAdapter/4.3.1)|[MIT](licenses/mit)|SqlDatabase internal| +|[NuGet.Frameworks](packages/nuget.org/nuget.frameworks/6.5.0)|6.5.0|[nuget.org](https://www.nuget.org/packages/NuGet.Frameworks/6.5.0)|[Apache-2.0](licenses/apache-2.0)|SqlDatabase internal| +|[NUnit](packages/nuget.org/nunit/3.14.0)|3.14.0|[nuget.org](https://www.nuget.org/packages/NUnit/3.14.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[NUnit3TestAdapter](packages/nuget.org/nunit3testadapter/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/NUnit3TestAdapter/4.5.0)|[MIT](licenses/mit)|SqlDatabase internal| |[PowerShellStandard.Library](packages/nuget.org/powershellstandard.library/5.1.0)|5.1.0|[nuget.org](https://www.nuget.org/packages/PowerShellStandard.Library/5.1.0)|[MIT](licenses/mit)|SqlDatabase| -|[Shouldly](packages/nuget.org/shouldly/4.1.0)|4.1.0|[nuget.org](https://www.nuget.org/packages/Shouldly/4.1.0)|[BSD-2-Clause](licenses/bsd-2-clause)|SqlDatabase internal| -|[StyleCop.Analyzers.Unstable](packages/nuget.org/stylecop.analyzers.unstable/1.2.0.435)|1.2.0.435|[nuget.org](https://www.nuget.org/packages/StyleCop.Analyzers.Unstable/1.2.0.435)|[MIT](licenses/mit)|SqlDatabase internal| +|[Shouldly](packages/nuget.org/shouldly/4.2.1)|4.2.1|[nuget.org](https://www.nuget.org/packages/Shouldly/4.2.1)|[BSD-2-Clause](licenses/bsd-2-clause)|SqlDatabase internal| +|[StyleCop.Analyzers.Unstable](packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507)|1.2.0.507|[nuget.org](https://www.nuget.org/packages/StyleCop.Analyzers.Unstable/1.2.0.507)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Buffers](packages/nuget.org/system.buffers/4.4.0)|4.4.0|[nuget.org](https://www.nuget.org/packages/System.Buffers/4.4.0)|[MIT](licenses/mit)|SqlDatabase| |[System.Buffers](packages/nuget.org/system.buffers/4.5.1)|4.5.1|[nuget.org](https://www.nuget.org/packages/System.Buffers/4.5.1)|[MIT](licenses/mit)|SqlDatabase| -|[System.CodeDom](packages/nuget.org/system.codedom/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/System.CodeDom/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[System.Configuration.ConfigurationManager](packages/nuget.org/system.configuration.configurationmanager/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.5.0)|[MIT](licenses/mit)|SqlDatabase| +|[System.CodeDom](packages/nuget.org/system.codedom/6.0.0)|6.0.0|[nuget.org](https://www.nuget.org/packages/System.CodeDom/6.0.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Data.SqlClient](packages/nuget.org/system.data.sqlclient/4.8.5)|4.8.5|[nuget.org](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5)|[MIT](licenses/mit)|SqlDatabase| |[System.Diagnostics.DiagnosticSource](packages/nuget.org/system.diagnostics.diagnosticsource/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Diagnostics.EventLog](packages/nuget.org/system.diagnostics.eventlog/6.0.0)|6.0.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.EventLog/6.0.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[System.Management](packages/nuget.org/system.management/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/System.Management/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[System.Diagnostics.EventLog](packages/nuget.org/system.diagnostics.eventlog/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Diagnostics.EventLog/4.7.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[System.Management](packages/nuget.org/system.management/6.0.1)|6.0.1|[nuget.org](https://www.nuget.org/packages/System.Management/6.0.1)|[MIT](licenses/mit)|SqlDatabase internal| +|[System.Memory](packages/nuget.org/system.memory/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Memory/4.5.0)|[MIT](licenses/mit)|SqlDatabase| |[System.Memory](packages/nuget.org/system.memory/4.5.3)|4.5.3|[nuget.org](https://www.nuget.org/packages/System.Memory/4.5.3)|[MIT](licenses/mit)|SqlDatabase| |[System.Memory](packages/nuget.org/system.memory/4.5.4)|4.5.4|[nuget.org](https://www.nuget.org/packages/System.Memory/4.5.4)|[MIT](licenses/mit)|SqlDatabase| +|[System.Memory](packages/nuget.org/system.memory/4.5.5)|4.5.5|[nuget.org](https://www.nuget.org/packages/System.Memory/4.5.5)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Numerics.Vectors](packages/nuget.org/system.numerics.vectors/4.4.0)|4.4.0|[nuget.org](https://www.nuget.org/packages/System.Numerics.Vectors/4.4.0)|[MIT](licenses/mit)|SqlDatabase| +|[System.Reflection.Emit](packages/nuget.org/system.reflection.emit/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Reflection.Emit/4.7.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[System.Reflection.Emit.ILGeneration](packages/nuget.org/system.reflection.emit.ilgeneration/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Reflection.Emit.ILGeneration/4.7.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Reflection.Metadata](packages/nuget.org/system.reflection.metadata/1.6.0)|1.6.0|[nuget.org](https://www.nuget.org/packages/System.Reflection.Metadata/1.6.0)|[MIT](licenses/mit)|SqlDatabase internal| +|[System.Runtime.CompilerServices.Unsafe](packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.5.0)|[MIT](licenses/mit)|SqlDatabase| |[System.Runtime.CompilerServices.Unsafe](packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.2)|4.5.2|[nuget.org](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.5.2)|[MIT](licenses/mit)|SqlDatabase| |[System.Runtime.CompilerServices.Unsafe](packages/nuget.org/system.runtime.compilerservices.unsafe/4.5.3)|4.5.3|[nuget.org](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.5.3)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Runtime.CompilerServices.Unsafe](packages/nuget.org/system.runtime.compilerservices.unsafe/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Runtime.InteropServices.RuntimeInformation](packages/nuget.org/system.runtime.interopservices.runtimeinformation/4.3.0)|4.3.0|[nuget.org](https://www.nuget.org/packages/System.Runtime.InteropServices.RuntimeInformation/4.3.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase internal| |[System.Runtime.Loader](packages/nuget.org/system.runtime.loader/4.3.0)|4.3.0|[nuget.org](https://www.nuget.org/packages/System.Runtime.Loader/4.3.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase| |[System.Security.AccessControl](packages/nuget.org/system.security.accesscontrol/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Security.AccessControl/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Security.AccessControl](packages/nuget.org/system.security.accesscontrol/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/System.Security.AccessControl/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| -|[System.Security.Cryptography.ProtectedData](packages/nuget.org/system.security.cryptography.protecteddata/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.5.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Security.Permissions](packages/nuget.org/system.security.permissions/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.Security.Permissions/4.5.0)|[MIT](licenses/mit)|SqlDatabase| |[System.Security.Principal.Windows](packages/nuget.org/system.security.principal.windows/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Security.Principal.Windows/4.7.0)|[MIT](licenses/mit)|SqlDatabase| -|[System.Security.Principal.Windows](packages/nuget.org/system.security.principal.windows/5.0.0)|5.0.0|[nuget.org](https://www.nuget.org/packages/System.Security.Principal.Windows/5.0.0)|[MIT](licenses/mit)|SqlDatabase internal| |[System.Text.Encoding.CodePages](packages/nuget.org/system.text.encoding.codepages/4.7.0)|4.7.0|[nuget.org](https://www.nuget.org/packages/System.Text.Encoding.CodePages/4.7.0)|[MIT](licenses/mit)|SqlDatabase| +|[System.Threading.Tasks.Extensions](packages/nuget.org/system.threading.tasks.extensions/4.3.0)|4.3.0|[nuget.org](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.3.0)|[ms-net-library](licenses/ms-net-library)|SqlDatabase| |[System.Threading.Tasks.Extensions](packages/nuget.org/system.threading.tasks.extensions/4.5.2)|4.5.2|[nuget.org](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.5.2)|[MIT](licenses/mit)|SqlDatabase| |[System.Threading.Tasks.Extensions](packages/nuget.org/system.threading.tasks.extensions/4.5.4)|4.5.4|[nuget.org](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.5.4)|[MIT](licenses/mit)|SqlDatabase internal| -|[System.ValueTuple](packages/nuget.org/system.valuetuple/4.5.0)|4.5.0|[nuget.org](https://www.nuget.org/packages/System.ValueTuple/4.5.0)|[MIT](licenses/mit)|SqlDatabase| *This page was generated by [ThirdPartyLibraries.GlobalTool](https://github.com/max-ieremenko/ThirdPartyLibraries).* \ No newline at end of file From 74a3811a0741940330d1b08ce347fae55b331d3f Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Fri, 10 Nov 2023 19:00:06 +0100 Subject: [PATCH 32/38] split SqlDatabase.Test --- Build/build-tasks.ps1 | 2 +- Build/create-images-tasks.ps1 | 28 +++++++++------ Sources/Docker/docker-compose.yml | 19 ++++++++++ .../image-dotnet-runtime-6.0.dockerfile | 0 .../image-dotnet-runtime-7.0.dockerfile | 0 .../Docker}/image-dotnet-sdk-6.0.dockerfile | 0 .../Docker}/image-dotnet-sdk-7.0.dockerfile | 0 .../Docker}/image-mssql-2017.dockerfile | 0 .../Docker}/image-mysql-8025.dockerfile | 0 .../Docker}/image-postgres-133.dockerfile | 0 .../Docker/mssql.create-database.sql | 0 .../Docker/mysql.create-database.sql | 0 .../Docker/pgsql.create-database.sql | 0 .../MsSql/Execute/drop.database.sql | 0 .../IntegrationTests/MsSql/Export/export.sql | 0 .../MsSql/New/01.Tables/01.Person.sql | 0 .../MsSql/New/01.Tables/02.PersonAddress.sql | 0 .../IntegrationTests/MsSql/New/01.create.sql | 0 .../MsSql/New/02.Data/01.Person.sql | 0 .../MsSql/New/02.Data/02.PersonAddress.sql | 0 .../IntegrationTests/MsSql/New/02.schemas.ps1 | 0 .../IntegrationTests/MsSql/New/03.version.sql | 0 .../IntegrationTests/MsSql/Test.ps1 | 0 .../IntegrationTests/MsSql/Test.sh | 0 .../IntegrationTests/MsSql/TestGlobalTool.sh | 0 .../IntegrationTests/MsSql/TestPowerShell.ps1 | 0 .../MsSql/Upgrade/1.0_1.2.sql | 0 .../MsSql/Upgrade/1.2_2.0.ps1 | 0 .../MsSql/Upgrade/2.0_2.1.sql | 0 .../MsSql/Upgrade/SqlDatabase.exe.config | 0 .../UpgradeModularity/SqlDatabase.exe.config | 0 .../UpgradeModularity/moduleA_1.0_2.0.sql | 0 .../UpgradeModularity/moduleB_1.0_1.1.sql | 0 .../UpgradeModularity/moduleC_1.0_2.0.ps1 | 0 .../UpgradeModularity/moduleC_1.0_2.0.txt | 0 .../MySql/Execute/drop.database.ps1 | 0 .../IntegrationTests/MySql/Export/export.sql | 0 .../MySql/New/01.Tables/01.person.sql | 0 .../MySql/New/01.Tables/02.person_address.sql | 0 .../IntegrationTests/MySql/New/01.create.sql | 0 .../MySql/New/02.Data/01.person.sql | 0 .../MySql/New/02.Data/02.person_address.sql | 0 .../IntegrationTests/MySql/New/05.version.sql | 0 .../IntegrationTests/MySql/Test.ps1 | 0 .../IntegrationTests/MySql/Test.sh | 0 .../IntegrationTests/MySql/TestGlobalTool.sh | 0 .../IntegrationTests/MySql/TestPowerShell.ps1 | 0 .../MySql/Upgrade/1.0_1.2.sql | 0 .../MySql/Upgrade/1.2_2.0.ps1 | 0 .../MySql/Upgrade/2.0_2.1.sql | 0 .../MySql/Upgrade/SqlDatabase.exe.config | 0 .../UpgradeModularity/SqlDatabase.exe.config | 0 .../UpgradeModularity/moduleA_1.0_2.0.sql | 0 .../UpgradeModularity/moduleB_1.0_1.1.sql | 0 .../UpgradeModularity/moduleC_1.0_2.0.ps1 | 0 .../UpgradeModularity/moduleC_1.0_2.0.txt | 0 .../PgSql/Execute/drop.database.ps1 | 0 .../IntegrationTests/PgSql/Export/export.sql | 0 .../PgSql/New/01.Tables/01.person.sql | 0 .../PgSql/New/01.Tables/02.person_address.sql | 0 .../IntegrationTests/PgSql/New/01.drop.ps1 | 0 .../PgSql/New/02.Data/01.person.sql | 0 .../PgSql/New/02.Data/02.person_address.sql | 0 .../IntegrationTests/PgSql/New/02.create.sql | 0 .../PgSql/New/03.database_properties.sql | 0 .../IntegrationTests/PgSql/New/04.schemas.sql | 0 .../IntegrationTests/PgSql/New/05.version.sql | 0 .../IntegrationTests/PgSql/Test.ps1 | 0 .../IntegrationTests/PgSql/Test.sh | 0 .../IntegrationTests/PgSql/TestGlobalTool.sh | 0 .../IntegrationTests/PgSql/TestPowerShell.ps1 | 0 .../PgSql/Upgrade/1.0_1.2.sql | 0 .../PgSql/Upgrade/1.2_2.0.ps1 | 0 .../PgSql/Upgrade/2.0_2.1.sql | 0 .../PgSql/Upgrade/SqlDatabase.exe.config | 0 .../UpgradeModularity/SqlDatabase.exe.config | 0 .../UpgradeModularity/moduleA_1.0_2.0.sql | 0 .../UpgradeModularity/moduleB_1.0_1.1.sql | 0 .../UpgradeModularity/moduleC_1.0_2.0.ps1 | 0 .../UpgradeModularity/moduleC_1.0_2.0.txt | 0 .../Docker/docker-compose.yml | 35 ------------------- .../Docker/mssql.entrypoint.sh | 5 --- Sources/SqlDatabase.Test/readme.md | 13 ------- 83 files changed, 38 insertions(+), 64 deletions(-) create mode 100644 Sources/Docker/docker-compose.yml rename {Build => Sources/Docker}/image-dotnet-runtime-6.0.dockerfile (100%) rename {Build => Sources/Docker}/image-dotnet-runtime-7.0.dockerfile (100%) rename {Build => Sources/Docker}/image-dotnet-sdk-6.0.dockerfile (100%) rename {Build => Sources/Docker}/image-dotnet-sdk-7.0.dockerfile (100%) rename {Build => Sources/Docker}/image-mssql-2017.dockerfile (100%) rename {Build => Sources/Docker}/image-mysql-8025.dockerfile (100%) rename {Build => Sources/Docker}/image-postgres-133.dockerfile (100%) rename Sources/{SqlDatabase.Test => }/Docker/mssql.create-database.sql (100%) rename Sources/{SqlDatabase.Test => }/Docker/mysql.create-database.sql (100%) rename Sources/{SqlDatabase.Test => }/Docker/pgsql.create-database.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Execute/drop.database.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Export/export.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/01.Tables/01.Person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/01.Tables/02.PersonAddress.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/01.create.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/02.Data/01.Person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/02.Data/02.PersonAddress.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/02.schemas.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/New/03.version.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Test.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Test.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/TestGlobalTool.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/TestPowerShell.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Upgrade/1.0_1.2.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Upgrade/1.2_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Upgrade/2.0_2.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/Upgrade/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/UpgradeModularity/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/UpgradeModularity/moduleA_1.0_2.0.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/UpgradeModularity/moduleB_1.0_1.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.txt (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Execute/drop.database.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Export/export.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/01.Tables/01.person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/01.Tables/02.person_address.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/01.create.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/02.Data/01.person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/02.Data/02.person_address.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/New/05.version.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Test.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Test.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/TestGlobalTool.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/TestPowerShell.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Upgrade/1.0_1.2.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Upgrade/1.2_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Upgrade/2.0_2.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/Upgrade/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/UpgradeModularity/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/UpgradeModularity/moduleA_1.0_2.0.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/UpgradeModularity/moduleB_1.0_1.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.txt (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Execute/drop.database.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Export/export.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/01.Tables/01.person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/01.Tables/02.person_address.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/01.drop.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/02.Data/01.person.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/02.Data/02.person_address.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/02.create.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/03.database_properties.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/04.schemas.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/New/05.version.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Test.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Test.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/TestGlobalTool.sh (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/TestPowerShell.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Upgrade/1.0_1.2.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Upgrade/1.2_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Upgrade/2.0_2.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/Upgrade/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/UpgradeModularity/SqlDatabase.exe.config (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/UpgradeModularity/moduleA_1.0_2.0.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/UpgradeModularity/moduleB_1.0_1.1.sql (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.ps1 (100%) rename Sources/{SqlDatabase.Test => }/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.txt (100%) delete mode 100644 Sources/SqlDatabase.Test/Docker/docker-compose.yml delete mode 100644 Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh delete mode 100644 Sources/SqlDatabase.Test/readme.md diff --git a/Build/build-tasks.ps1 b/Build/build-tasks.ps1 index 57664923..8b0be980 100644 --- a/Build/build-tasks.ps1 +++ b/Build/build-tasks.ps1 @@ -135,7 +135,7 @@ task InitializeIntegrationTest { Remove-Item -Path $dest -Force -Recurse } - Copy-Item -Path (Join-Path $settings.sources "SqlDatabase.Test\IntegrationTests") -Destination $dest -Force -Recurse + Copy-Item -Path (Join-Path $settings.sources "IntegrationTests") -Destination $dest -Force -Recurse $assemblyScript = Join-Path $settings.bin "..\Examples\CSharpMirationStep\bin\Release\net472\2.1_2.2.*" foreach ($database in $databases) { Copy-Item -Path $assemblyScript -Destination (Join-Path $dest "$database\Upgrade") -Force diff --git a/Build/create-images-tasks.ps1 b/Build/create-images-tasks.ps1 index 1f9b0486..1f3554f2 100644 --- a/Build/create-images-tasks.ps1 +++ b/Build/create-images-tasks.ps1 @@ -7,67 +7,75 @@ task Default ` , BuildPgSqlDatabase ` , BuildMySqlDatabase +Enter-Build { + $context = Join-Path $PSScriptRoot "..\Sources\Docker" +} + task BuildMsSqlDatabase { - $context = Join-Path $PSScriptRoot "..\Sources\SqlDatabase.Test\Docker" + $dockerfile = Join-Path $context "image-mssql-2017.dockerfile" exec { docker build ` - -f image-mssql-2017.dockerfile ` + -f $dockerfile ` -t sqldatabase/mssql:2017 ` $context } } task BuildPgSqlDatabase { - $context = Join-Path $PSScriptRoot "..\Sources\SqlDatabase.Test\Docker" + $dockerfile = Join-Path $context "image-postgres-133.dockerfile" exec { docker build ` - -f image-postgres-133.dockerfile ` + -f $dockerfile ` -t sqldatabase/postgres:13.3 ` $context } } task BuildMySqlDatabase { - $context = Join-Path $PSScriptRoot "..\Sources\SqlDatabase.Test\Docker" + $dockerfile = Join-Path $context "image-mysql-8025.dockerfile" exec { docker build ` - -f image-mysql-8025.dockerfile ` + -f $dockerfile ` -t sqldatabase/mysql:8.0.25 ` $context } } task BuildDotnetSdk60 { + $dockerfile = Join-Path $context "image-dotnet-sdk-6.0.dockerfile" exec { docker build ` - -f image-dotnet-sdk-6.0.dockerfile ` + -f $dockerfile ` -t sqldatabase/dotnet_pwsh:6.0-sdk ` . } } task BuildDotnetRuntime60 { + $dockerfile = Join-Path $context "image-dotnet-runtime-6.0.dockerfile" exec { docker build ` - -f image-dotnet-runtime-6.0.dockerfile ` + -f $dockerfile ` -t sqldatabase/dotnet_pwsh:6.0-runtime ` . } } task BuildDotnetSdk70 { + $dockerfile = Join-Path $context "image-dotnet-sdk-7.0.dockerfile" exec { docker build ` - -f image-dotnet-sdk-7.0.dockerfile ` + -f $dockerfile ` -t sqldatabase/dotnet_pwsh:7.0-sdk ` . } } task BuildDotnetRuntime70 { + $dockerfile = Join-Path $context "image-dotnet-runtime-7.0.dockerfile" exec { docker build ` - -f image-dotnet-runtime-7.0.dockerfile ` + -f $dockerfile ` -t sqldatabase/dotnet_pwsh:7.0-runtime ` . } diff --git a/Sources/Docker/docker-compose.yml b/Sources/Docker/docker-compose.yml new file mode 100644 index 00000000..00319a8c --- /dev/null +++ b/Sources/Docker/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3" +services: + mssql: + image: sqldatabase/mssql:2017 + restart: always + ports: + - 1433:1433 + + pgsql: + image: sqldatabase/postgres:13.3 + restart: always + ports: + - 5432:5432 + + mysql: + image: sqldatabase/mysql:8.0.25 + restart: always + ports: + - 3306:3306 diff --git a/Build/image-dotnet-runtime-6.0.dockerfile b/Sources/Docker/image-dotnet-runtime-6.0.dockerfile similarity index 100% rename from Build/image-dotnet-runtime-6.0.dockerfile rename to Sources/Docker/image-dotnet-runtime-6.0.dockerfile diff --git a/Build/image-dotnet-runtime-7.0.dockerfile b/Sources/Docker/image-dotnet-runtime-7.0.dockerfile similarity index 100% rename from Build/image-dotnet-runtime-7.0.dockerfile rename to Sources/Docker/image-dotnet-runtime-7.0.dockerfile diff --git a/Build/image-dotnet-sdk-6.0.dockerfile b/Sources/Docker/image-dotnet-sdk-6.0.dockerfile similarity index 100% rename from Build/image-dotnet-sdk-6.0.dockerfile rename to Sources/Docker/image-dotnet-sdk-6.0.dockerfile diff --git a/Build/image-dotnet-sdk-7.0.dockerfile b/Sources/Docker/image-dotnet-sdk-7.0.dockerfile similarity index 100% rename from Build/image-dotnet-sdk-7.0.dockerfile rename to Sources/Docker/image-dotnet-sdk-7.0.dockerfile diff --git a/Build/image-mssql-2017.dockerfile b/Sources/Docker/image-mssql-2017.dockerfile similarity index 100% rename from Build/image-mssql-2017.dockerfile rename to Sources/Docker/image-mssql-2017.dockerfile diff --git a/Build/image-mysql-8025.dockerfile b/Sources/Docker/image-mysql-8025.dockerfile similarity index 100% rename from Build/image-mysql-8025.dockerfile rename to Sources/Docker/image-mysql-8025.dockerfile diff --git a/Build/image-postgres-133.dockerfile b/Sources/Docker/image-postgres-133.dockerfile similarity index 100% rename from Build/image-postgres-133.dockerfile rename to Sources/Docker/image-postgres-133.dockerfile diff --git a/Sources/SqlDatabase.Test/Docker/mssql.create-database.sql b/Sources/Docker/mssql.create-database.sql similarity index 100% rename from Sources/SqlDatabase.Test/Docker/mssql.create-database.sql rename to Sources/Docker/mssql.create-database.sql diff --git a/Sources/SqlDatabase.Test/Docker/mysql.create-database.sql b/Sources/Docker/mysql.create-database.sql similarity index 100% rename from Sources/SqlDatabase.Test/Docker/mysql.create-database.sql rename to Sources/Docker/mysql.create-database.sql diff --git a/Sources/SqlDatabase.Test/Docker/pgsql.create-database.sql b/Sources/Docker/pgsql.create-database.sql similarity index 100% rename from Sources/SqlDatabase.Test/Docker/pgsql.create-database.sql rename to Sources/Docker/pgsql.create-database.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Execute/drop.database.sql b/Sources/IntegrationTests/MsSql/Execute/drop.database.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Execute/drop.database.sql rename to Sources/IntegrationTests/MsSql/Execute/drop.database.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Export/export.sql b/Sources/IntegrationTests/MsSql/Export/export.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Export/export.sql rename to Sources/IntegrationTests/MsSql/Export/export.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.Tables/01.Person.sql b/Sources/IntegrationTests/MsSql/New/01.Tables/01.Person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.Tables/01.Person.sql rename to Sources/IntegrationTests/MsSql/New/01.Tables/01.Person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.Tables/02.PersonAddress.sql b/Sources/IntegrationTests/MsSql/New/01.Tables/02.PersonAddress.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.Tables/02.PersonAddress.sql rename to Sources/IntegrationTests/MsSql/New/01.Tables/02.PersonAddress.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.create.sql b/Sources/IntegrationTests/MsSql/New/01.create.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/01.create.sql rename to Sources/IntegrationTests/MsSql/New/01.create.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.Data/01.Person.sql b/Sources/IntegrationTests/MsSql/New/02.Data/01.Person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.Data/01.Person.sql rename to Sources/IntegrationTests/MsSql/New/02.Data/01.Person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.Data/02.PersonAddress.sql b/Sources/IntegrationTests/MsSql/New/02.Data/02.PersonAddress.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.Data/02.PersonAddress.sql rename to Sources/IntegrationTests/MsSql/New/02.Data/02.PersonAddress.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.schemas.ps1 b/Sources/IntegrationTests/MsSql/New/02.schemas.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/02.schemas.ps1 rename to Sources/IntegrationTests/MsSql/New/02.schemas.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/03.version.sql b/Sources/IntegrationTests/MsSql/New/03.version.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/New/03.version.sql rename to Sources/IntegrationTests/MsSql/New/03.version.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Test.ps1 b/Sources/IntegrationTests/MsSql/Test.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Test.ps1 rename to Sources/IntegrationTests/MsSql/Test.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Test.sh b/Sources/IntegrationTests/MsSql/Test.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Test.sh rename to Sources/IntegrationTests/MsSql/Test.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/TestGlobalTool.sh b/Sources/IntegrationTests/MsSql/TestGlobalTool.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/TestGlobalTool.sh rename to Sources/IntegrationTests/MsSql/TestGlobalTool.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/TestPowerShell.ps1 b/Sources/IntegrationTests/MsSql/TestPowerShell.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/TestPowerShell.ps1 rename to Sources/IntegrationTests/MsSql/TestPowerShell.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/1.0_1.2.sql b/Sources/IntegrationTests/MsSql/Upgrade/1.0_1.2.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/1.0_1.2.sql rename to Sources/IntegrationTests/MsSql/Upgrade/1.0_1.2.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/1.2_2.0.ps1 b/Sources/IntegrationTests/MsSql/Upgrade/1.2_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/1.2_2.0.ps1 rename to Sources/IntegrationTests/MsSql/Upgrade/1.2_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/2.0_2.1.sql b/Sources/IntegrationTests/MsSql/Upgrade/2.0_2.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/2.0_2.1.sql rename to Sources/IntegrationTests/MsSql/Upgrade/2.0_2.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/SqlDatabase.exe.config b/Sources/IntegrationTests/MsSql/Upgrade/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/Upgrade/SqlDatabase.exe.config rename to Sources/IntegrationTests/MsSql/Upgrade/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/SqlDatabase.exe.config b/Sources/IntegrationTests/MsSql/UpgradeModularity/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/SqlDatabase.exe.config rename to Sources/IntegrationTests/MsSql/UpgradeModularity/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleA_1.0_2.0.sql b/Sources/IntegrationTests/MsSql/UpgradeModularity/moduleA_1.0_2.0.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleA_1.0_2.0.sql rename to Sources/IntegrationTests/MsSql/UpgradeModularity/moduleA_1.0_2.0.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleB_1.0_1.1.sql b/Sources/IntegrationTests/MsSql/UpgradeModularity/moduleB_1.0_1.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleB_1.0_1.1.sql rename to Sources/IntegrationTests/MsSql/UpgradeModularity/moduleB_1.0_1.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.ps1 b/Sources/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.ps1 rename to Sources/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.txt b/Sources/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.txt similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.txt rename to Sources/IntegrationTests/MsSql/UpgradeModularity/moduleC_1.0_2.0.txt diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Execute/drop.database.ps1 b/Sources/IntegrationTests/MySql/Execute/drop.database.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Execute/drop.database.ps1 rename to Sources/IntegrationTests/MySql/Execute/drop.database.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Export/export.sql b/Sources/IntegrationTests/MySql/Export/export.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Export/export.sql rename to Sources/IntegrationTests/MySql/Export/export.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.Tables/01.person.sql b/Sources/IntegrationTests/MySql/New/01.Tables/01.person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.Tables/01.person.sql rename to Sources/IntegrationTests/MySql/New/01.Tables/01.person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.Tables/02.person_address.sql b/Sources/IntegrationTests/MySql/New/01.Tables/02.person_address.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.Tables/02.person_address.sql rename to Sources/IntegrationTests/MySql/New/01.Tables/02.person_address.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.create.sql b/Sources/IntegrationTests/MySql/New/01.create.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/01.create.sql rename to Sources/IntegrationTests/MySql/New/01.create.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/02.Data/01.person.sql b/Sources/IntegrationTests/MySql/New/02.Data/01.person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/02.Data/01.person.sql rename to Sources/IntegrationTests/MySql/New/02.Data/01.person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/02.Data/02.person_address.sql b/Sources/IntegrationTests/MySql/New/02.Data/02.person_address.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/02.Data/02.person_address.sql rename to Sources/IntegrationTests/MySql/New/02.Data/02.person_address.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/New/05.version.sql b/Sources/IntegrationTests/MySql/New/05.version.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/New/05.version.sql rename to Sources/IntegrationTests/MySql/New/05.version.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Test.ps1 b/Sources/IntegrationTests/MySql/Test.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Test.ps1 rename to Sources/IntegrationTests/MySql/Test.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Test.sh b/Sources/IntegrationTests/MySql/Test.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Test.sh rename to Sources/IntegrationTests/MySql/Test.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/TestGlobalTool.sh b/Sources/IntegrationTests/MySql/TestGlobalTool.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/TestGlobalTool.sh rename to Sources/IntegrationTests/MySql/TestGlobalTool.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/TestPowerShell.ps1 b/Sources/IntegrationTests/MySql/TestPowerShell.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/TestPowerShell.ps1 rename to Sources/IntegrationTests/MySql/TestPowerShell.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/1.0_1.2.sql b/Sources/IntegrationTests/MySql/Upgrade/1.0_1.2.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/1.0_1.2.sql rename to Sources/IntegrationTests/MySql/Upgrade/1.0_1.2.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/1.2_2.0.ps1 b/Sources/IntegrationTests/MySql/Upgrade/1.2_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/1.2_2.0.ps1 rename to Sources/IntegrationTests/MySql/Upgrade/1.2_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/2.0_2.1.sql b/Sources/IntegrationTests/MySql/Upgrade/2.0_2.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/2.0_2.1.sql rename to Sources/IntegrationTests/MySql/Upgrade/2.0_2.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/SqlDatabase.exe.config b/Sources/IntegrationTests/MySql/Upgrade/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/Upgrade/SqlDatabase.exe.config rename to Sources/IntegrationTests/MySql/Upgrade/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/SqlDatabase.exe.config b/Sources/IntegrationTests/MySql/UpgradeModularity/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/SqlDatabase.exe.config rename to Sources/IntegrationTests/MySql/UpgradeModularity/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleA_1.0_2.0.sql b/Sources/IntegrationTests/MySql/UpgradeModularity/moduleA_1.0_2.0.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleA_1.0_2.0.sql rename to Sources/IntegrationTests/MySql/UpgradeModularity/moduleA_1.0_2.0.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleB_1.0_1.1.sql b/Sources/IntegrationTests/MySql/UpgradeModularity/moduleB_1.0_1.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleB_1.0_1.1.sql rename to Sources/IntegrationTests/MySql/UpgradeModularity/moduleB_1.0_1.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.ps1 b/Sources/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.ps1 rename to Sources/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.txt b/Sources/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.txt similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.txt rename to Sources/IntegrationTests/MySql/UpgradeModularity/moduleC_1.0_2.0.txt diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Execute/drop.database.ps1 b/Sources/IntegrationTests/PgSql/Execute/drop.database.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Execute/drop.database.ps1 rename to Sources/IntegrationTests/PgSql/Execute/drop.database.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Export/export.sql b/Sources/IntegrationTests/PgSql/Export/export.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Export/export.sql rename to Sources/IntegrationTests/PgSql/Export/export.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.Tables/01.person.sql b/Sources/IntegrationTests/PgSql/New/01.Tables/01.person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.Tables/01.person.sql rename to Sources/IntegrationTests/PgSql/New/01.Tables/01.person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.Tables/02.person_address.sql b/Sources/IntegrationTests/PgSql/New/01.Tables/02.person_address.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.Tables/02.person_address.sql rename to Sources/IntegrationTests/PgSql/New/01.Tables/02.person_address.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.drop.ps1 b/Sources/IntegrationTests/PgSql/New/01.drop.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/01.drop.ps1 rename to Sources/IntegrationTests/PgSql/New/01.drop.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.Data/01.person.sql b/Sources/IntegrationTests/PgSql/New/02.Data/01.person.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.Data/01.person.sql rename to Sources/IntegrationTests/PgSql/New/02.Data/01.person.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.Data/02.person_address.sql b/Sources/IntegrationTests/PgSql/New/02.Data/02.person_address.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.Data/02.person_address.sql rename to Sources/IntegrationTests/PgSql/New/02.Data/02.person_address.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.create.sql b/Sources/IntegrationTests/PgSql/New/02.create.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/02.create.sql rename to Sources/IntegrationTests/PgSql/New/02.create.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/03.database_properties.sql b/Sources/IntegrationTests/PgSql/New/03.database_properties.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/03.database_properties.sql rename to Sources/IntegrationTests/PgSql/New/03.database_properties.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/04.schemas.sql b/Sources/IntegrationTests/PgSql/New/04.schemas.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/04.schemas.sql rename to Sources/IntegrationTests/PgSql/New/04.schemas.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/05.version.sql b/Sources/IntegrationTests/PgSql/New/05.version.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/New/05.version.sql rename to Sources/IntegrationTests/PgSql/New/05.version.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Test.ps1 b/Sources/IntegrationTests/PgSql/Test.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Test.ps1 rename to Sources/IntegrationTests/PgSql/Test.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Test.sh b/Sources/IntegrationTests/PgSql/Test.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Test.sh rename to Sources/IntegrationTests/PgSql/Test.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/TestGlobalTool.sh b/Sources/IntegrationTests/PgSql/TestGlobalTool.sh similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/TestGlobalTool.sh rename to Sources/IntegrationTests/PgSql/TestGlobalTool.sh diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/TestPowerShell.ps1 b/Sources/IntegrationTests/PgSql/TestPowerShell.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/TestPowerShell.ps1 rename to Sources/IntegrationTests/PgSql/TestPowerShell.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/1.0_1.2.sql b/Sources/IntegrationTests/PgSql/Upgrade/1.0_1.2.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/1.0_1.2.sql rename to Sources/IntegrationTests/PgSql/Upgrade/1.0_1.2.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/1.2_2.0.ps1 b/Sources/IntegrationTests/PgSql/Upgrade/1.2_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/1.2_2.0.ps1 rename to Sources/IntegrationTests/PgSql/Upgrade/1.2_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/2.0_2.1.sql b/Sources/IntegrationTests/PgSql/Upgrade/2.0_2.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/2.0_2.1.sql rename to Sources/IntegrationTests/PgSql/Upgrade/2.0_2.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/SqlDatabase.exe.config b/Sources/IntegrationTests/PgSql/Upgrade/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/Upgrade/SqlDatabase.exe.config rename to Sources/IntegrationTests/PgSql/Upgrade/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/SqlDatabase.exe.config b/Sources/IntegrationTests/PgSql/UpgradeModularity/SqlDatabase.exe.config similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/SqlDatabase.exe.config rename to Sources/IntegrationTests/PgSql/UpgradeModularity/SqlDatabase.exe.config diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleA_1.0_2.0.sql b/Sources/IntegrationTests/PgSql/UpgradeModularity/moduleA_1.0_2.0.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleA_1.0_2.0.sql rename to Sources/IntegrationTests/PgSql/UpgradeModularity/moduleA_1.0_2.0.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleB_1.0_1.1.sql b/Sources/IntegrationTests/PgSql/UpgradeModularity/moduleB_1.0_1.1.sql similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleB_1.0_1.1.sql rename to Sources/IntegrationTests/PgSql/UpgradeModularity/moduleB_1.0_1.1.sql diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.ps1 b/Sources/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.ps1 similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.ps1 rename to Sources/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.ps1 diff --git a/Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.txt b/Sources/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.txt similarity index 100% rename from Sources/SqlDatabase.Test/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.txt rename to Sources/IntegrationTests/PgSql/UpgradeModularity/moduleC_1.0_2.0.txt diff --git a/Sources/SqlDatabase.Test/Docker/docker-compose.yml b/Sources/SqlDatabase.Test/Docker/docker-compose.yml deleted file mode 100644 index 74dfe60f..00000000 --- a/Sources/SqlDatabase.Test/Docker/docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: "3" -services: - mssql: - image: mcr.microsoft.com/mssql/server:latest - restart: always - environment: - - ACCEPT_EULA=Y - - SA_PASSWORD=P@ssw0rd - - MSSQL_PID=Express - volumes: - - ./:/usr/src/app - ports: - - 1433:1433 - working_dir: /usr/src/app - command: bash -c ' chmod +x ./mssql.entrypoint.sh; ./mssql.entrypoint.sh & /opt/mssql/bin/sqlservr;' - - pgsql: - image: postgres:latest - restart: always - environment: - POSTGRES_PASSWORD: qwerty - volumes: - - ./pgsql.create-database.sql:/docker-entrypoint-initdb.d/pgsql.create-database.sql - ports: - - 5432:5432 - - mysql: - image: mysql:latest - restart: always - environment: - MYSQL_ROOT_PASSWORD: qwerty - volumes: - - ./mysql.create-database.sql:/docker-entrypoint-initdb.d/mysql.create-database.sql - ports: - - 3306:3306 diff --git a/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh b/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh deleted file mode 100644 index 41e0409e..00000000 --- a/Sources/SqlDatabase.Test/Docker/mssql.entrypoint.sh +++ /dev/null @@ -1,5 +0,0 @@ -# wait for SQL Server to come up -sleep 10s - -# create database -/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P P@ssw0rd -l 60 -i ./mssql.create-database.sql \ No newline at end of file diff --git a/Sources/SqlDatabase.Test/readme.md b/Sources/SqlDatabase.Test/readme.md deleted file mode 100644 index f99d32d0..00000000 --- a/Sources/SqlDatabase.Test/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -Some tests require SqlServer with already existing database. - -You can use docker: -```bash -$ cd .\SqlDatabase\Sources\SqlDatabase.Test\Docker -$ docker-compose up -``` -If database is not created during container start-up, please increase sleep timeout in entrypoint.sh. - - -Or create database manually on your SqlServer: -1. Docker\CreateDatabase.sql -2. Check connection string in app.config From 304d9459c67b0d305ed66c6c58dbb758db37f637 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 13:07:01 +0100 Subject: [PATCH 33/38] ci build --- .github/workflows/ci.yml | 45 ++++++++++++ Build/build.ps1 | 19 +++++- Build/create-images.ps1 | 2 +- Build/install-dependencies.ps1 | 33 +++++++++ Build/scripts/Get-ModuleVersion.ps1 | 19 ++++++ ...Get-Version.ps1 => Get-ReleaseVersion.ps1} | 2 +- Build/scripts/Invoke-InstallDotNet.ps1 | 68 +++++++++++++++++++ Build/scripts/Invoke-InstallModule.ps1 | 21 ++++++ Build/{ => tasks}/build-tasks.it-linux.ps1 | 2 +- Build/{ => tasks}/build-tasks.it-ps-core.ps1 | 2 +- .../{ => tasks}/build-tasks.it-ps-desktop.ps1 | 2 +- .../{ => tasks}/build-tasks.it-tool-linux.ps1 | 2 +- Build/{ => tasks}/build-tasks.it-win.ps1 | 2 +- Build/{ => tasks}/build-tasks.ps1 | 24 +++++-- Build/{ => tasks}/build-tasks.third-party.ps1 | 4 +- Build/{ => tasks}/build-tasks.unit-test.ps1 | 2 +- Build/{ => tasks}/create-images-tasks.ps1 | 2 +- Sources/global.json | 7 ++ Sources/nuget.config | 6 ++ 19 files changed, 244 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 Build/install-dependencies.ps1 create mode 100644 Build/scripts/Get-ModuleVersion.ps1 rename Build/scripts/{Get-Version.ps1 => Get-ReleaseVersion.ps1} (91%) create mode 100644 Build/scripts/Invoke-InstallDotNet.ps1 create mode 100644 Build/scripts/Invoke-InstallModule.ps1 rename Build/{ => tasks}/build-tasks.it-linux.ps1 (93%) rename Build/{ => tasks}/build-tasks.it-ps-core.ps1 (89%) rename Build/{ => tasks}/build-tasks.it-ps-desktop.ps1 (92%) rename Build/{ => tasks}/build-tasks.it-tool-linux.ps1 (91%) rename Build/{ => tasks}/build-tasks.it-win.ps1 (91%) rename Build/{ => tasks}/build-tasks.ps1 (92%) rename Build/{ => tasks}/build-tasks.third-party.ps1 (84%) rename Build/{ => tasks}/build-tasks.unit-test.ps1 (95%) rename Build/{ => tasks}/create-images-tasks.ps1 (96%) create mode 100644 Sources/global.json create mode 100644 Sources/nuget.config diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..25cf1288 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: + - master + - 'release/**' + - 'feature/**' + paths-ignore: + - '**.md' + pull_request: + branches: + - master + - 'release/**' + paths-ignore: + - '**.md' + +jobs: + build: + name: win-build-and-test + runs-on: windows-latest + + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies + shell: pwsh + run: ./Build/install-dependencies.ps1 + + - name: Dotnet info + shell: pwsh + run: dotnet --info + + - name: Build + shell: pwsh + run: ./Build/build.ps1 -Mode "github" -GithubToken "${{ secrets.GITHUB_TOKEN }}" + + - name: Artifacts + uses: actions/upload-artifact@v3 + with: + name: packages + path: | + .\bin\artifacts\*.nupkg + .\bin\artifacts\*.zip + if-no-files-found: error \ No newline at end of file diff --git a/Build/build.ps1 b/Build/build.ps1 index b6ba01ac..7ce53c07 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -1,8 +1,23 @@ #Requires -Version "7.0" #Requires -Modules @{ ModuleName="InvokeBuild"; ModuleVersion="5.10.4" } +#Requires -Modules @{ ModuleName="ThirdPartyLibraries"; ModuleVersion="3.4.1" } + +[CmdletBinding()] +param ( + [Parameter()] + [ValidateSet("local", "github")] + [string] + $Mode, + + [Parameter()] + [string] + $GithubToken +) Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" -$file = Join-Path $PSScriptRoot "build-tasks.ps1" -Invoke-Build -File $file \ No newline at end of file +$file = Join-Path $PSScriptRoot "tasks/build-tasks.ps1" +$task = ($Mode -eq "github") ? "GithubBuild" : "LocalBuild" + +Invoke-Build -File $file -Task $task -GithubToken $GithubToken \ No newline at end of file diff --git a/Build/create-images.ps1 b/Build/create-images.ps1 index 05b230f1..5938045e 100644 --- a/Build/create-images.ps1 +++ b/Build/create-images.ps1 @@ -3,5 +3,5 @@ Set-StrictMode -Version Latest -$file = Join-Path $PSScriptRoot "create-images-tasks.ps1" +$file = Join-Path $PSScriptRoot "tasks/create-images-tasks.ps1" Invoke-Build -File $file \ No newline at end of file diff --git a/Build/install-dependencies.ps1 b/Build/install-dependencies.ps1 new file mode 100644 index 00000000..695cb85c --- /dev/null +++ b/Build/install-dependencies.ps1 @@ -0,0 +1,33 @@ +#Requires -Version "7.0" + +[CmdletBinding()] +param ( + [Parameter()] + [ValidateSet(".net", "InvokeBuild", "ThirdPartyLibraries")] + [string[]] + $List = (".net", "InvokeBuild", "ThirdPartyLibraries") +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +. (Join-Path $PSScriptRoot "scripts/Get-ModuleVersion.ps1") +. (Join-Path $PSScriptRoot "scripts/Invoke-InstallDotNet.ps1") +. (Join-Path $PSScriptRoot "scripts/Invoke-InstallModule.ps1") + +if (".net" -in $List) { + Invoke-InstallDotNet -Version "6.0.319" + + $version = (Get-Content -Raw (Join-Path $PSScriptRoot "../Sources/global.json") | ConvertFrom-Json).sdk.version + Invoke-InstallDotNet -Version $version +} + +if ("InvokeBuild" -in $List) { + $version = Get-ModuleVersion "InvokeBuild" + Invoke-InstallModule -Name "InvokeBuild" -Version $version +} + +if ("ThirdPartyLibraries" -in $List) { + $version = Get-ModuleVersion "ThirdPartyLibraries" + Invoke-InstallModule -Name "ThirdPartyLibraries" -Version $version +} \ No newline at end of file diff --git a/Build/scripts/Get-ModuleVersion.ps1 b/Build/scripts/Get-ModuleVersion.ps1 new file mode 100644 index 00000000..1d0fd748 --- /dev/null +++ b/Build/scripts/Get-ModuleVersion.ps1 @@ -0,0 +1,19 @@ +function Get-ModuleVersion { + param ( + [Parameter(Mandatory)] + [string] + $Name + ) + + $sources = Get-Content (Join-Path $PSScriptRoot "../build.ps1") -Raw + $tokens = $null + $errors = $null + $modules = [Management.Automation.Language.Parser]::ParseInput($sources, [ref]$tokens, [ref]$errors).ScriptRequirements.RequiredModules + foreach ($module in $modules) { + if ($module.Name -eq $Name) { + return $module.Version + } + } + + throw "Module $Name not found." +} \ No newline at end of file diff --git a/Build/scripts/Get-Version.ps1 b/Build/scripts/Get-ReleaseVersion.ps1 similarity index 91% rename from Build/scripts/Get-Version.ps1 rename to Build/scripts/Get-ReleaseVersion.ps1 index 2fc8122a..4bf2309e 100644 --- a/Build/scripts/Get-Version.ps1 +++ b/Build/scripts/Get-ReleaseVersion.ps1 @@ -1,4 +1,4 @@ -function Get-Version { +function Get-ReleaseVersion { param ( [Parameter(Mandatory)] [ValidateScript({ Test-Path $_ })] diff --git a/Build/scripts/Invoke-InstallDotNet.ps1 b/Build/scripts/Invoke-InstallDotNet.ps1 new file mode 100644 index 00000000..be0d2032 --- /dev/null +++ b/Build/scripts/Invoke-InstallDotNet.ps1 @@ -0,0 +1,68 @@ +function Invoke-InstallDotNet { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string] + $Version + ) + + function Test-Version { + param ( + [Parameter(Mandatory)] + [System.Management.Automation.SemanticVersion] + $Target, + + [Parameter(Mandatory)] + [System.Management.Automation.SemanticVersion] + $Test + ) + + # 6.0 vs 7.0 + if ($Target.Major -ne $Test.Major -or $Target.Minor -ne $Test.Minor) { + $false + } + else { + # 6.0.0 vs 6.0.1 + # 7.0.100 vs 7.0.100-rc.2.22477.23 + $Target.CompareTo($Test) -le 0 + } + } + + if (Get-Command -Name dotnet -ErrorAction SilentlyContinue) { + $versions = dotnet --list-sdks + foreach ($installedVersion in $versions) { + # 6.0.401 [C:\Program Files\dotnet\sdk] + $test = ($installedVersion -split " ")[0] + + if (Test-Version -Target $Version -Test $test) { + Write-Output ".net sdk $test is alredy installed" + return + } + } + } + + $installDir = "C:\Program Files\dotnet" + $installScript = "dotnet-install.ps1" + + if ($IsLinux) { + $installDir = "/usr/share/dotnet" + $installScript = "dotnet-install.sh" + } + + $downloadDir = Join-Path ([System.IO.Path]::GetTempPath()) "install-dotnet" + if (Test-Path $downloadDir) { + Remove-Item -Path $downloadDir -Recurse -Force + } + + New-Item -Path $downloadDir -ItemType Directory | Out-Null + + $dotnetInstall = Join-Path $downloadDir $installScript + Invoke-WebRequest -Uri "https://dot.net/v1/$installScript" -OutFile $dotnetInstall + + if ($IsLinux) { + chmod +x $dotnetInstall + } + + "$dotnetInstall -Version $Version -InstallDir $installDir" + & $dotnetInstall -Version $Version -InstallDir $installDir +} \ No newline at end of file diff --git a/Build/scripts/Invoke-InstallModule.ps1 b/Build/scripts/Invoke-InstallModule.ps1 new file mode 100644 index 00000000..4621e46e --- /dev/null +++ b/Build/scripts/Invoke-InstallModule.ps1 @@ -0,0 +1,21 @@ +function Invoke-InstallModule { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [string] + $Name, + + [Parameter(Mandatory)] + [string] + $Version + ) + + $test = Get-InstalledModule -Name $Name -MinimumVersion $Version -ErrorAction "SilentlyContinue" + if ($test) { + Write-Output "$Name $($test.Version) is alredy installed" + return + } + + Write-Output "Install $Name $version" + Install-Module -Name $Name -RequiredVersion $Version -Force +} \ No newline at end of file diff --git a/Build/build-tasks.it-linux.ps1 b/Build/tasks/build-tasks.it-linux.ps1 similarity index 93% rename from Build/build-tasks.it-linux.ps1 rename to Build/tasks/build-tasks.it-linux.ps1 index 1e3efe34..90bbc882 100644 --- a/Build/build-tasks.it-linux.ps1 +++ b/Build/tasks/build-tasks.it-linux.ps1 @@ -7,7 +7,7 @@ param( task Default StartDatabase, UnZip, RunTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-ps-core.ps1 b/Build/tasks/build-tasks.it-ps-core.ps1 similarity index 89% rename from Build/build-tasks.it-ps-core.ps1 rename to Build/tasks/build-tasks.it-ps-core.ps1 index f0eaf957..a12bb7d7 100644 --- a/Build/build-tasks.it-ps-core.ps1 +++ b/Build/tasks/build-tasks.it-ps-core.ps1 @@ -6,7 +6,7 @@ param( task Default StartDatabase, RunTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-ps-desktop.ps1 b/Build/tasks/build-tasks.it-ps-desktop.ps1 similarity index 92% rename from Build/build-tasks.it-ps-desktop.ps1 rename to Build/tasks/build-tasks.it-ps-desktop.ps1 index c86dec2c..73741b81 100644 --- a/Build/build-tasks.it-ps-desktop.ps1 +++ b/Build/tasks/build-tasks.it-ps-desktop.ps1 @@ -5,7 +5,7 @@ param( task Default RunContainers, CopyModule, PublishModule, RunTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-tool-linux.ps1 b/Build/tasks/build-tasks.it-tool-linux.ps1 similarity index 91% rename from Build/build-tasks.it-tool-linux.ps1 rename to Build/tasks/build-tasks.it-tool-linux.ps1 index 5e3cdd72..87aac1b2 100644 --- a/Build/build-tasks.it-tool-linux.ps1 +++ b/Build/tasks/build-tasks.it-tool-linux.ps1 @@ -6,7 +6,7 @@ param( task Default StartDatabase, RunTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.it-win.ps1 b/Build/tasks/build-tasks.it-win.ps1 similarity index 91% rename from Build/build-tasks.it-win.ps1 rename to Build/tasks/build-tasks.it-win.ps1 index ead3a4c5..718408cc 100644 --- a/Build/build-tasks.it-win.ps1 +++ b/Build/tasks/build-tasks.it-win.ps1 @@ -6,7 +6,7 @@ param( task Default StartDatabase, UnZip, RunTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerId = "" $connectionString = "" diff --git a/Build/build-tasks.ps1 b/Build/tasks/build-tasks.ps1 similarity index 92% rename from Build/build-tasks.ps1 rename to Build/tasks/build-tasks.ps1 index 8b0be980..fd546885 100644 --- a/Build/build-tasks.ps1 +++ b/Build/tasks/build-tasks.ps1 @@ -1,22 +1,32 @@ -task Default Initialize, Clean, Build, ThirdPartyNotices, Pack, UnitTest, IntegrationTest +param( + [Parameter()] + [string] + $GithubToken +) + +task GithubBuild Initialize, Clean, Build, ThirdPartyNotices, Pack +task LocalBuild GithubBuild, UnitTest, IntegrationTest + task Pack PackGlobalTool, PackPoweShellModule, PackNuget472, PackManualDownload task IntegrationTest InitializeIntegrationTest, PsDesktopTest, PsCoreTest, SdkToolTest, NetRuntimeLinuxTest, NetRuntimeWindowsTest -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } task Initialize { - $sources = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\Sources")) - $bin = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\bin")) + $root = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "..\..\")) + $sources = Join-Path $root "Sources" + $bin = Join-Path $root "bin" $artifacts = Join-Path $bin "artifacts" $script:settings = @{ - nugetexe = Join-Path $PSScriptRoot "nuget.exe" + nugetexe = Join-Path $root "Build\nuget.exe" sources = $sources bin = $bin artifacts = $artifacts artifactsPowerShell = Join-Path $artifacts "PowerShell" integrationTests = Join-Path $bin "IntegrationTests" - version = Get-Version -SourcePath $sources + version = Get-ReleaseVersion -SourcePath $sources + githubToken = $GithubToken repositoryCommitId = git rev-parse HEAD } @@ -41,7 +51,7 @@ task Build { } task ThirdPartyNotices { - Invoke-Build -File build-tasks.third-party.ps1 -settings $settings + Invoke-Build -File "build-tasks.third-party.ps1" -settings $settings } task PackGlobalTool { diff --git a/Build/build-tasks.third-party.ps1 b/Build/tasks/build-tasks.third-party.ps1 similarity index 84% rename from Build/build-tasks.third-party.ps1 rename to Build/tasks/build-tasks.third-party.ps1 index 4dfb9433..52b3d09f 100644 --- a/Build/build-tasks.third-party.ps1 +++ b/Build/tasks/build-tasks.third-party.ps1 @@ -5,12 +5,12 @@ param( task Default Update, Test, Publish Enter-Build { - $repository = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "third-party-libraries")) + $repository = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot "../third-party-libraries")) $sources = $settings.sources } task Update { - Update-ThirdPartyLibrariesRepository -AppName "SqlDatabase" -Source $sources -Repository $repository + Update-ThirdPartyLibrariesRepository -AppName "SqlDatabase" -Source $sources -Repository $repository -GithubPersonalAccessToken $settings.githubToken } task Test { diff --git a/Build/build-tasks.unit-test.ps1 b/Build/tasks/build-tasks.unit-test.ps1 similarity index 95% rename from Build/build-tasks.unit-test.ps1 rename to Build/tasks/build-tasks.unit-test.ps1 index 3e0c432a..2fbfba06 100644 --- a/Build/build-tasks.unit-test.ps1 +++ b/Build/tasks/build-tasks.unit-test.ps1 @@ -12,7 +12,7 @@ param( task Default RunContainers, UpdateConfig, RunTests -Get-ChildItem -Path (Join-Path $PSScriptRoot 'scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } +Get-ChildItem -Path (Join-Path $PSScriptRoot '../scripts') -Filter *.ps1 | ForEach-Object { . $_.FullName } $containerIds = @() $mssqlConnectionString = "" diff --git a/Build/create-images-tasks.ps1 b/Build/tasks/create-images-tasks.ps1 similarity index 96% rename from Build/create-images-tasks.ps1 rename to Build/tasks/create-images-tasks.ps1 index 1f3554f2..75695838 100644 --- a/Build/create-images-tasks.ps1 +++ b/Build/tasks/create-images-tasks.ps1 @@ -8,7 +8,7 @@ task Default ` , BuildMySqlDatabase Enter-Build { - $context = Join-Path $PSScriptRoot "..\Sources\Docker" + $context = Join-Path $PSScriptRoot "..\..\Sources\Docker" } task BuildMsSqlDatabase { diff --git a/Sources/global.json b/Sources/global.json new file mode 100644 index 00000000..2ff089f7 --- /dev/null +++ b/Sources/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "7.0.100", + "allowPrerelease": false, + "rollForward": "latestFeature" + } +} \ No newline at end of file diff --git a/Sources/nuget.config b/Sources/nuget.config new file mode 100644 index 00000000..167b985e --- /dev/null +++ b/Sources/nuget.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 47dae5a63e77f2cc97479cac919c2ee8736ef40a Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 13:11:25 +0100 Subject: [PATCH 34/38] ci build: remove feature branches --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25cf1288..88405c2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,6 @@ on: branches: - master - 'release/**' - - 'feature/**' paths-ignore: - '**.md' pull_request: @@ -17,7 +16,7 @@ on: jobs: build: - name: win-build-and-test + name: win-build runs-on: windows-latest steps: From 79f999e1b34ca45bdcc4acd34f6811b2c0b3fe9e Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 14:57:21 +0100 Subject: [PATCH 35/38] .sln target .net8.0 --- Sources/Directory.Build.props | 1 + ...lDatabase.Adapter.AssemblyScripts.Test.csproj | 2 +- .../SqlDatabase.Adapter.MsSql.Test.csproj | 2 +- .../SqlDatabase.Adapter.MySql.Test.csproj | 2 +- .../SqlDatabase.Adapter.PgSql.Test.csproj | 2 +- ...atabase.Adapter.PowerShellScripts.Test.csproj | 2 +- .../InstallationSeeker.cs | 4 +++- .../SqlDatabase.Adapter.PowerShellScripts.csproj | 4 ++-- .../SqlDatabase.Adapter.Sql.Test.csproj | 2 +- .../SqlDatabase.Configuration.Test.csproj | 2 +- .../SqlDatabase.FileSystem.Test.csproj | 2 +- .../SqlDatabase.Sequence.Test.csproj | 2 +- Sources/SqlDatabase.Test/SqlDatabase.Test.csproj | 2 +- .../Configuration/InvalidCommandLineException.cs | 16 +--------------- Sources/SqlDatabase/SqlDatabase.csproj | 4 ++-- Sources/global.json | 4 ++-- 16 files changed, 21 insertions(+), 32 deletions(-) diff --git a/Sources/Directory.Build.props b/Sources/Directory.Build.props index 43bcdf3e..72014747 100644 --- a/Sources/Directory.Build.props +++ b/Sources/Directory.Build.props @@ -13,6 +13,7 @@ false en false + true diff --git a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj index cf359b4f..a2ca550f 100644 --- a/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.AssemblyScripts.Test/SqlDatabase.Adapter.AssemblyScripts.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.AssemblyScripts NU1702 diff --git a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj index 3e29faab..184b29ef 100644 --- a/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.MsSql.Test/SqlDatabase.Adapter.MsSql.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.MsSql diff --git a/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj index a4a11e6a..7ef1c4cf 100644 --- a/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.MySql.Test/SqlDatabase.Adapter.MySql.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.MySql diff --git a/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj index eef24fc4..797873bc 100644 --- a/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.PgSql.Test/SqlDatabase.Adapter.PgSql.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.PgSql diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj index ba34a726..2106e043 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts.Test/SqlDatabase.Adapter.PowerShellScripts.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.PowerShellScripts diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs index 93b820dd..989409f3 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/InstallationSeeker.cs @@ -131,7 +131,9 @@ private static string GetDefaultInstallationRoot() private static bool IsCompatibleVersion(Version version) { -#if NET7_0 +#if NET8_0 + return version < new Version("7.5"); +#elif NET7_0 return version < new Version("7.4"); #elif NET6_0 return version < new Version("7.3"); diff --git a/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj index 2b82949b..d7b2f9c1 100644 --- a/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj +++ b/Sources/SqlDatabase.Adapter.PowerShellScripts/SqlDatabase.Adapter.PowerShellScripts.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0;netstandard2.0 + net472;net6.0;net7.0;net8.0;netstandard2.0 @@ -12,7 +12,7 @@ - + diff --git a/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj index 9e0ab78a..67641488 100644 --- a/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj +++ b/Sources/SqlDatabase.Adapter.Sql.Test/SqlDatabase.Adapter.Sql.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Adapter.Sql diff --git a/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj index e7ee05b5..ea917321 100644 --- a/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj +++ b/Sources/SqlDatabase.Configuration.Test/SqlDatabase.Configuration.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Configuration diff --git a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj index f0fef585..ce4bdfe7 100644 --- a/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj +++ b/Sources/SqlDatabase.FileSystem.Test/SqlDatabase.FileSystem.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.FileSystem diff --git a/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj index 23c7f020..2fcaebb2 100644 --- a/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj +++ b/Sources/SqlDatabase.Sequence.Test/SqlDatabase.Sequence.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase.Sequence diff --git a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj index b189f178..ae5cb1e9 100644 --- a/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj +++ b/Sources/SqlDatabase.Test/SqlDatabase.Test.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0 + net472;net6.0;net7.0;net8.0 SqlDatabase diff --git a/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs b/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs index 2375c2b5..253ff89a 100644 --- a/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs +++ b/Sources/SqlDatabase/Configuration/InvalidCommandLineException.cs @@ -3,8 +3,7 @@ namespace SqlDatabase.Configuration; -[Serializable] -public class InvalidCommandLineException : SystemException +public sealed class InvalidCommandLineException : SystemException { public InvalidCommandLineException() { @@ -32,18 +31,5 @@ public InvalidCommandLineException(string argument, string message, Exception in Argument = argument; } - protected InvalidCommandLineException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - Argument = info.GetString(nameof(Argument)); - } - public string? Argument { get; } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - - info.AddValue(nameof(Argument), Argument); - } } \ No newline at end of file diff --git a/Sources/SqlDatabase/SqlDatabase.csproj b/Sources/SqlDatabase/SqlDatabase.csproj index ec37d066..9a434fc5 100644 --- a/Sources/SqlDatabase/SqlDatabase.csproj +++ b/Sources/SqlDatabase/SqlDatabase.csproj @@ -1,7 +1,7 @@  - net472;net6.0;net7.0;netstandard2.0 - net6.0;net7.0 + net472;net6.0;net7.0;net8.0;netstandard2.0 + net6.0;net7.0;net8.0 Exe diff --git a/Sources/global.json b/Sources/global.json index 2ff089f7..5815c394 100644 --- a/Sources/global.json +++ b/Sources/global.json @@ -1,7 +1,7 @@ { "sdk": { - "version": "7.0.100", - "allowPrerelease": false, + "version": "8.0.100-rc.2.23502.2", + "allowPrerelease": true, "rollForward": "latestFeature" } } \ No newline at end of file From 8eaeb388e9221c0d9f2b6b6bdc730b8ecbb6ee9a Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 14:58:04 +0100 Subject: [PATCH 36/38] tpl target .net8.0 --- .../packages/nuget.org/dapper.strongname/2.1.15/index.json | 3 ++- .../packages/nuget.org/dapper.strongname/2.1.15/readme.md | 2 +- .../nuget.org/microsoft.codecoverage/17.7.2/index.json | 3 ++- .../packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md | 2 +- .../nuget.org/microsoft.net.test.sdk/17.7.2/index.json | 3 ++- .../packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md | 2 +- .../microsoft.testplatform.objectmodel/17.7.2/index.json | 3 ++- .../microsoft.testplatform.objectmodel/17.7.2/readme.md | 2 +- .../microsoft.testplatform.testhost/17.7.2/index.json | 3 ++- .../nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md | 2 +- .../nuget.org/microsoft.win32.registry/4.7.0/index.json | 1 + .../nuget.org/microsoft.win32.registry/4.7.0/readme.md | 2 +- .../nuget.org/microsoft.wsman.runtime/7.2.0/index.json | 1 + .../packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md | 2 +- .../nuget.org/microsoft.wsman.runtime/7.3.0/index.json | 1 + .../packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md | 2 +- .../packages/nuget.org/netstandard.library/2.0.3/index.json | 1 + .../packages/nuget.org/netstandard.library/2.0.3/readme.md | 2 +- .../packages/nuget.org/newtonsoft.json/13.0.1/index.json | 3 ++- .../packages/nuget.org/newtonsoft.json/13.0.1/readme.md | 2 +- .../packages/nuget.org/newtonsoft.json/13.0.3/index.json | 3 ++- .../packages/nuget.org/newtonsoft.json/13.0.3/readme.md | 2 +- .../packages/nuget.org/nuget.frameworks/6.5.0/index.json | 3 ++- .../packages/nuget.org/nuget.frameworks/6.5.0/readme.md | 2 +- .../packages/nuget.org/nunit/3.14.0/index.json | 3 ++- .../packages/nuget.org/nunit/3.14.0/readme.md | 2 +- .../packages/nuget.org/nunit3testadapter/4.5.0/index.json | 3 ++- .../packages/nuget.org/nunit3testadapter/4.5.0/readme.md | 2 +- .../nuget.org/powershellstandard.library/5.1.0/index.json | 1 + .../nuget.org/powershellstandard.library/5.1.0/readme.md | 2 +- .../nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json | 1 + .../nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md | 2 +- .../packages/nuget.org/system.data.sqlclient/4.8.5/index.json | 1 + .../packages/nuget.org/system.data.sqlclient/4.8.5/readme.md | 2 +- .../nuget.org/system.reflection.metadata/1.6.0/index.json | 3 ++- .../nuget.org/system.reflection.metadata/1.6.0/readme.md | 2 +- .../nuget.org/system.security.accesscontrol/4.7.0/index.json | 1 + .../nuget.org/system.security.accesscontrol/4.7.0/readme.md | 2 +- .../system.security.principal.windows/4.7.0/index.json | 1 + .../system.security.principal.windows/4.7.0/readme.md | 2 +- 40 files changed, 51 insertions(+), 31 deletions(-) diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json index 3b3cf0a3..dfadd243 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md index e0382b14..ea8883fd 100644 --- a/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/dapper.strongname/2.1.15/readme.md @@ -3,7 +3,7 @@ Dapper.StrongName [2.1.15](https://www.nuget.org/packages/Dapper.StrongName/2.1. Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [Apache-2.0](../../../../licenses/apache-2.0) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json index 3bcd358e..d4d492c6 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md index b5c3f475..615d9061 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.codecoverage/17.7.2/readme.md @@ -3,7 +3,7 @@ Microsoft.CodeCoverage [17.7.2](https://www.nuget.org/packages/Microsoft.CodeCov Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json index e934f5b7..3f13abfb 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ], "Dependencies": [ { diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md index ef3dd1a0..51309baf 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.net.test.sdk/17.7.2/readme.md @@ -3,7 +3,7 @@ Microsoft.NET.Test.Sdk [17.7.2](https://www.nuget.org/packages/Microsoft.NET.Tes Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json index 566ee42e..f4be26eb 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ], "Dependencies": [ { diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md index ef0d232a..3e833b6e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.objectmodel/17.7.2/readme.md @@ -3,7 +3,7 @@ Microsoft.TestPlatform.ObjectModel [17.7.2](https://www.nuget.org/packages/Micro Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json index 439cb41a..63502005 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ], "Dependencies": [ { diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md index 05226dfa..fbb4fa11 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.testplatform.testhost/17.7.2/readme.md @@ -3,7 +3,7 @@ Microsoft.TestPlatform.TestHost [17.7.2](https://www.nuget.org/packages/Microsof Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [ms-net-library](../../../../licenses/ms-net-library) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json index e5c050c8..0eb6a2a4 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ], "Dependencies": [ diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md index 368b7740..7ed602a2 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.win32.registry/4.7.0/readme.md @@ -3,7 +3,7 @@ Microsoft.Win32.Registry [4.7.0](https://www.nuget.org/packages/Microsoft.Win32. Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json index 01467737..24450662 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md index aad964dc..17289c6e 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.2.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.2.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json index 01467737..24450662 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md index 2d195b40..f1e29f3f 100644 --- a/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/microsoft.wsman.runtime/7.3.0/readme.md @@ -3,7 +3,7 @@ Microsoft.WSMan.Runtime [7.3.0](https://www.nuget.org/packages/Microsoft.WSMan.R Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json index d2766dbc..e616c4c1 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md index cd57a863..54e2194d 100644 --- a/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/netstandard.library/2.0.3/readme.md @@ -3,7 +3,7 @@ NETStandard.Library [2.0.3](https://www.nuget.org/packages/NETStandard.Library/2 Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json index 9ea13765..0bd3aac3 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md index 77437192..d7394d25 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.1/readme.md @@ -3,7 +3,7 @@ Newtonsoft.Json [13.0.1](https://www.nuget.org/packages/Newtonsoft.Json/13.0.1) Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json index 9ea13765..0bd3aac3 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md index ef6caa82..3ee80dad 100644 --- a/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/newtonsoft.json/13.0.3/readme.md @@ -3,7 +3,7 @@ Newtonsoft.Json [13.0.3](https://www.nuget.org/packages/Newtonsoft.Json/13.0.3) Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json index bc28354a..2809b998 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md index 49077907..6d535493 100644 --- a/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nuget.frameworks/6.5.0/readme.md @@ -3,7 +3,7 @@ NuGet.Frameworks [6.5.0](https://www.nuget.org/packages/NuGet.Frameworks/6.5.0) Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [Apache-2.0](../../../../licenses/apache-2.0) diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json index ef0a10ca..27b50717 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md index 509b42fc..0e505383 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit/3.14.0/readme.md @@ -3,7 +3,7 @@ NUnit [3.14.0](https://www.nuget.org/packages/NUnit/3.14.0) Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json index 659b1c2b..0075237a 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md index 7310d040..85936e56 100644 --- a/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/nunit3testadapter/4.5.0/readme.md @@ -3,7 +3,7 @@ NUnit3TestAdapter [4.5.0](https://www.nuget.org/packages/NUnit3TestAdapter/4.5.0 Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json index 9bf2f045..7ea9e2d3 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md index 848489f5..3c701fff 100644 --- a/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/powershellstandard.library/5.1.0/readme.md @@ -3,7 +3,7 @@ PowerShellStandard.Library [5.1.0](https://www.nuget.org/packages/PowerShellStan Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json index 1c98ed25..b4213aec 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md index 61302f29..bc613e4a 100644 --- a/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/stylecop.analyzers.unstable/1.2.0.507/readme.md @@ -3,7 +3,7 @@ StyleCop.Analyzers.Unstable [1.2.0.507](https://www.nuget.org/packages/StyleCop. Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json index 93ca46c5..8533ff19 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ], "Dependencies": [ diff --git a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md index 9b149b43..f3bdcc99 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.data.sqlclient/4.8.5/readme.md @@ -3,7 +3,7 @@ System.Data.SqlClient [4.8.5](https://www.nuget.org/packages/System.Data.SqlClie Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json index 89e227cd..1bbad59c 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/index.json @@ -11,7 +11,8 @@ "TargetFrameworks": [ "net472", "net6.0", - "net7.0" + "net7.0", + "net8.0" ] } ], diff --git a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md index 98448f10..e2a51fb2 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.reflection.metadata/1.6.0/readme.md @@ -3,7 +3,7 @@ System.Reflection.Metadata [1.6.0](https://www.nuget.org/packages/System.Reflect Used by: SqlDatabase internal -Target frameworks: net472, net6.0, net7.0 +Target frameworks: net472, net6.0, net7.0, net8.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json index b748b1b9..2fecc9f9 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ], "Dependencies": [ diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md index 5c735a26..ba201c8e 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.accesscontrol/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.AccessControl [4.7.0](https://www.nuget.org/packages/System.Secu Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json index 054eaff4..cefc7084 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/index.json @@ -12,6 +12,7 @@ "net472", "net6.0", "net7.0", + "net8.0", "netstandard2.0" ] } diff --git a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md index 4651717f..c9e3bf5d 100644 --- a/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md +++ b/Build/third-party-libraries/packages/nuget.org/system.security.principal.windows/4.7.0/readme.md @@ -3,7 +3,7 @@ System.Security.Principal.Windows [4.7.0](https://www.nuget.org/packages/System. Used by: SqlDatabase -Target frameworks: net472, net6.0, net7.0, netstandard2.0 +Target frameworks: net472, net6.0, net7.0, net8.0, netstandard2.0 License: [MIT](../../../../licenses/mit) From 80a1d40cc3a09bf249ffde8352c1c8381847e48d Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 14:59:15 +0100 Subject: [PATCH 37/38] build target .net8.0 --- Build/install-dependencies.ps1 | 1 + Build/tasks/build-tasks.ps1 | 11 +++++++-- Build/tasks/build-tasks.unit-test.ps1 | 2 +- Build/tasks/create-images-tasks.ps1 | 24 ++++++++++++++++++- .../image-dotnet-runtime-8.0.dockerfile | 8 +++++++ .../Docker/image-dotnet-sdk-8.0.dockerfile | 7 ++++++ 6 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 Sources/Docker/image-dotnet-runtime-8.0.dockerfile create mode 100644 Sources/Docker/image-dotnet-sdk-8.0.dockerfile diff --git a/Build/install-dependencies.ps1 b/Build/install-dependencies.ps1 index 695cb85c..6a782c06 100644 --- a/Build/install-dependencies.ps1 +++ b/Build/install-dependencies.ps1 @@ -17,6 +17,7 @@ $ErrorActionPreference = "Stop" if (".net" -in $List) { Invoke-InstallDotNet -Version "6.0.319" + Invoke-InstallDotNet -Version "7.0.100" $version = (Get-Content -Raw (Join-Path $PSScriptRoot "../Sources/global.json") | ConvertFrom-Json).sdk.version Invoke-InstallDotNet -Version $version diff --git a/Build/tasks/build-tasks.ps1 b/Build/tasks/build-tasks.ps1 index fd546885..f311e9ee 100644 --- a/Build/tasks/build-tasks.ps1 +++ b/Build/tasks/build-tasks.ps1 @@ -30,7 +30,7 @@ task Initialize { repositoryCommitId = git rev-parse HEAD } - $script:frameworks = "net472", "net6.0", "net7.0" + $script:frameworks = "net472", "net6.0", "net7.0", "net8.0" $script:databases = "MsSql", "PgSql", "MySql" Write-Output "PackageVersion: $($settings.version)" @@ -109,6 +109,7 @@ task PackNuget472 PackPoweShellModule, { task PackManualDownload PackGlobalTool, PackPoweShellModule, { Get-ChildItem -Path $settings.bin -Recurse -Directory -Filter "publish" | Remove-Item -Force -Recurse + Get-ChildItem -Path $settings.bin -Recurse -Directory -Filter "win-arm64" | Remove-Item -Force -Recurse $out = $settings.artifacts $lic = Join-Path $settings.sources "..\LICENSE.md" @@ -205,6 +206,10 @@ task PsCoreTest { , "mcr.microsoft.com/powershell:7.2.2-ubuntu-20.04" , "mcr.microsoft.com/powershell:7.3-ubuntu-20.04") + foreach ($image in $images) { + exec { docker pull $image } + } + $builds = @() foreach ($image in $images) { foreach ($database in $databases) { @@ -223,7 +228,8 @@ task PsCoreTest { task SdkToolTest { $images = $( "sqldatabase/dotnet_pwsh:6.0-sdk" - , "sqldatabase/dotnet_pwsh:7.0-sdk") + , "sqldatabase/dotnet_pwsh:7.0-sdk" + , "sqldatabase/dotnet_pwsh:8.0-sdk") $builds = @() foreach ($image in $images) { @@ -244,6 +250,7 @@ task NetRuntimeLinuxTest { $testCases = $( @{ targetFramework = "net6.0"; image = "sqldatabase/dotnet_pwsh:6.0-runtime" } , @{ targetFramework = "net7.0"; image = "sqldatabase/dotnet_pwsh:7.0-runtime" } + , @{ targetFramework = "net8.0"; image = "sqldatabase/dotnet_pwsh:8.0-runtime" } ) $builds = @() diff --git a/Build/tasks/build-tasks.unit-test.ps1 b/Build/tasks/build-tasks.unit-test.ps1 index 2fbfba06..05c1b871 100644 --- a/Build/tasks/build-tasks.unit-test.ps1 +++ b/Build/tasks/build-tasks.unit-test.ps1 @@ -5,7 +5,7 @@ param( $Sources, [Parameter(Mandatory)] - [ValidateSet("net472", "net6.0", "net7.0")] + [ValidateSet("net472", "net6.0", "net7.0", "net8.0")] [string] $Framework ) diff --git a/Build/tasks/create-images-tasks.ps1 b/Build/tasks/create-images-tasks.ps1 index 75695838..bc718538 100644 --- a/Build/tasks/create-images-tasks.ps1 +++ b/Build/tasks/create-images-tasks.ps1 @@ -1,8 +1,10 @@ task Default ` BuildDotnetSdk60 ` - , BuildDotnetRuntime60 ` , BuildDotnetSdk70 ` + , BuildDotnetSdk80 ` + , BuildDotnetRuntime60 ` , BuildDotnetRuntime70 ` + , BuildDotnetRuntime80 ` , BuildMsSqlDatabase ` , BuildPgSqlDatabase ` , BuildMySqlDatabase @@ -79,4 +81,24 @@ task BuildDotnetRuntime70 { -t sqldatabase/dotnet_pwsh:7.0-runtime ` . } +} + +task BuildDotnetSdk80 { + $dockerfile = Join-Path $context "image-dotnet-sdk-8.0.dockerfile" + exec { + docker build ` + -f $dockerfile ` + -t sqldatabase/dotnet_pwsh:8.0-sdk ` + . + } +} + +task BuildDotnetRuntime80 { + $dockerfile = Join-Path $context "image-dotnet-runtime-8.0.dockerfile" + exec { + docker build ` + -f $dockerfile ` + -t sqldatabase/dotnet_pwsh:8.0-runtime ` + . + } } \ No newline at end of file diff --git a/Sources/Docker/image-dotnet-runtime-8.0.dockerfile b/Sources/Docker/image-dotnet-runtime-8.0.dockerfile new file mode 100644 index 00000000..e1bb2bb7 --- /dev/null +++ b/Sources/Docker/image-dotnet-runtime-8.0.dockerfile @@ -0,0 +1,8 @@ +FROM mcr.microsoft.com/dotnet/runtime:8.0 + +RUN apt-get update && \ + apt-get install -y curl && \ + curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.3.9/powershell_7.3.9-1.deb_amd64.deb --output powershell.deb && \ + dpkg -i powershell.deb && \ + apt-get install -f && \ + rm -f powershell.deb \ No newline at end of file diff --git a/Sources/Docker/image-dotnet-sdk-8.0.dockerfile b/Sources/Docker/image-dotnet-sdk-8.0.dockerfile new file mode 100644 index 00000000..e8a8bc5e --- /dev/null +++ b/Sources/Docker/image-dotnet-sdk-8.0.dockerfile @@ -0,0 +1,7 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 + +RUN apt-get update && \ + curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.3.9/powershell_7.3.9-1.deb_amd64.deb --output powershell.deb && \ + dpkg -i powershell.deb && \ + apt-get install -f && \ + rm -f powershell.deb \ No newline at end of file From 9ff2f9404887c99ff3393dc3d529fcd7f8f50599 Mon Sep 17 00:00:00 2001 From: max-ieremenko Date: Sun, 12 Nov 2023 14:59:28 +0100 Subject: [PATCH 38/38] .net8.0 --- Build/README.md | 4 ++-- Examples/CSharpMirationStep/readme.md | 2 +- Examples/PowerShellScript/readme.md | 2 +- README.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Build/README.md b/Build/README.md index f827c40e..3aedcafc 100644 --- a/Build/README.md +++ b/Build/README.md @@ -3,12 +3,12 @@ build.ps1 is designed to run on windows - PowerShell Desktop 5.1 -- PowerShell [7.3.0](https://github.com/PowerShell/PowerShell/releases/tag/v7.3.0) for .net 7.0 tests +- PowerShell [7.3.0](https://github.com/PowerShell/PowerShell/releases/tag/v7.3.0) for .net 7.0 and 8.0 tests - PowerShell [7.2.1](https://github.com/PowerShell/PowerShell/releases/tag/v7.2.1) for .net 6.0 tests - Install-Module -Name [InvokeBuild](https://www.powershellgallery.com/packages/InvokeBuild/5.10.4) -RequiredVersion 5.10.4 - Install-Module -Name [ThirdPartyLibraries](https://www.powershellgallery.com/packages/ThirdPartyLibraries/3.4.1) -RequiredVersion 3.4.1 - .net framework 4.7.2+ sdk -- .net 7.0 sdk +- .net 8.0 sdk - docker, switched to linux containers ## How to build diff --git a/Examples/CSharpMirationStep/readme.md b/Examples/CSharpMirationStep/readme.md index 6551144b..fffbd9d3 100644 --- a/Examples/CSharpMirationStep/readme.md +++ b/Examples/CSharpMirationStep/readme.md @@ -4,7 +4,7 @@ Any assembly script is - .exe or .dll for target framework is 4.7.2+ -- .dll for .net 7.0 or 6.0 +- .dll for .net 6.0+ - has exactly one class with script implementation This project is an example of script implementation. diff --git a/Examples/PowerShellScript/readme.md b/Examples/PowerShellScript/readme.md index 15dfc6e8..44a06a19 100644 --- a/Examples/PowerShellScript/readme.md +++ b/Examples/PowerShellScript/readme.md @@ -73,7 +73,7 @@ Installed Powershell Desktop version. Pre-installed Powershell Core is required, will be used by SqlDatabase as external component. Due to the Powershell Core design: -* SqlDatabase .net 7.0 can host Powershell Core versions below 7.4 +* SqlDatabase .net 8.0 and 7.0 can host Powershell Core versions below 7.4 * SqlDatabase .net 6.0 can host Powershell Core versions below 7.3 PowerShell location can be passed via command line: diff --git a/README.md b/README.md index 7e7fc8e7..4b05e83c 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,9 @@ Installation PowerShell module is compatible with Powershell Core 6.1+ and PowerShell Desktop 5.1. -.net tool is compatible with .net sdk 7.0, and 6.0. +.net tool is compatible with .net sdk 8.0, 7.0, and 6.0. -Command-line tool is compatible with .net runtime 7.0, 6.0 and .net framework 4.7.2+. +Command-line tool is compatible with .net runtime 8.0, 7.0, 6.0 and .net framework 4.7.2+. ### PowerShell, from gallery

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