Skip to content
Snippets Groups Projects
Commit a844a53d authored by Marcel Nellesen's avatar Marcel Nellesen
Browse files

Merge branch 'Sprint/2020-15' into 'master'

Sprint/2020 15

See merge request coscine/cs/database.helpers!2
parents 5928fdd4 d8404710
Branches
Tags v1.1.0
1 merge request!2Sprint/2020 15
Showing
with 450 additions and 0 deletions
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\NUnit3TestAdapter.3.17.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.17.0\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{AC22690F-5194-4CED-BE4D-B32F7954A88C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Coscine.Database.Helpers.Tests</RootNamespace>
<AssemblyName>Coscine.Database.Helpers.Tests</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
<HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
</Reference>
<Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
<HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.12.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DatabaseHelpersTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Database.Helpers\Database.Helpers.csproj">
<Project>{c4551ddc-b648-4ec4-a1ad-584f0b9a019d}</Project>
<Name>Database.Helpers</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.17.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.17.0\build\net35\NUnit3TestAdapter.props'))" />
</Target>
</Project>
\ No newline at end of file
using Coscine.Configuration;
using Coscine.Database.Helpers;
using NUnit.Framework;
using System;
namespace Coscine.Database.Tests
{
[TestFixture]
public class DatabaseHelpersTests
{
private DatabaseMasterHelper _helper;
private string _databaseName;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_databaseName = $"Coscine_Database.Helpers.Tests_{Guid.NewGuid()}";
var settings = new ConfigurationConnectionSettings() { Configuration = new ConsulConfiguration() };
settings.LoadSettingsFromConfiguration();
settings.Database = _databaseName;
_helper = new DatabaseMasterHelper
{
ConnectionSettings = settings
};
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
if (_helper.DatabaseExists(_databaseName))
{
_helper.KillConnectionsToDatabase(_databaseName);
_helper.DropDatabase(_databaseName);
}
}
[Test]
public void CreateDropDatabase()
{
Assert.IsFalse(_helper.DatabaseExists(_databaseName));
_helper.EnsureDatabase(_helper.ConnectionSettings.Database);
Assert.IsTrue(_helper.DatabaseExists(_databaseName));
_helper.KillConnectionsToDatabase(_databaseName);
_helper.DropDatabase(_databaseName);
Assert.IsFalse(_helper.DatabaseExists(_databaseName));
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Database.Helpers.Tests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Database.Helpers.Tests")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ac22690f-5194-4ced-be4d-b32f7954a88c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Consul" version="0.7.2.6" targetFramework="net461" />
<package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
<package id="NUnit" version="3.12.0" targetFramework="net461" />
<package id="NUnit3TestAdapter" version="3.17.0" targetFramework="net461" />
</packages>
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30320.27
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Database.Helpers", "Database.Helpers\Database.Helpers.csproj", "{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Database.Helpers.Tests", "Database.Helpers.Tests\Database.Helpers.Tests.csproj", "{AC22690F-5194-4CED-BE4D-B32F7954A88C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}.Release|Any CPU.Build.0 = Release|Any CPU
{AC22690F-5194-4CED-BE4D-B32F7954A88C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC22690F-5194-4CED-BE4D-B32F7954A88C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC22690F-5194-4CED-BE4D-B32F7954A88C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC22690F-5194-4CED-BE4D-B32F7954A88C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FB8EE51B-F01A-4FF1-B9AE-F59353B2ED2F}
EndGlobalSection
EndGlobal
using Coscine.Configuration;
namespace Coscine.Database.Helpers
{
public class ConfigurationConnectionSettings : ConnectionSettings
{
public static string DataSourceKey = "coscine/global/db_data_source";
public static string DatabaseKey = "coscine/global/db_name";
public static string UserIdKey = "coscine/global/db_user_id";
public static string PasswordKey = "coscine/global/db_password";
public IConfiguration Configuration { get; set; }
public void LoadSettingsFromConfiguration()
{
DataSource = Configuration.GetString(DataSourceKey);
Database = Configuration.GetString(DatabaseKey);
UserId = Configuration.GetString(UserIdKey);
Password = Configuration.GetString(PasswordKey);
}
}
}
namespace Coscine.Database.Helpers
{
public class ConnectionSettings
{
public string DataSource { get; set; }
public string Database { get; set; }
public string UserId { get; set; }
public string Password { get; set; }
public virtual string GetConnectionString(bool useDatabase = true)
{
if (useDatabase && !string.IsNullOrWhiteSpace(Database))
{
return $"Data Source={DataSource};Database={Database};User Id={UserId};Password={Password};";
}
else
{
return $"Data Source={DataSource};User Id={UserId};Password={Password};";
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C4551DDC-B648-4EC4-A1AD-584F0B9A019D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Coscine.Database.Helpers</RootNamespace>
<AssemblyName>Coscine.Database.Helpers</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
<HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
</Reference>
<Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
<HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ConnectionSettings.cs" />
<Compile Include="ConfigurationConnectionSettings.cs" />
<Compile Include="DatabaseMasterHelper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>rwth-aachen</authors>
<owners>rwth-aachen</owners>
<license type="expression">MIT</license>
<projectUrl>https://git.rwth-aachen.de/coscine/cs/database.helpers</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<copyright>$copyright$</copyright>
</metadata>
</package>
\ No newline at end of file
using Coscine.Configuration;
using System.Data.SqlClient;
namespace Coscine.Database.Helpers
{
public class DatabaseMasterHelper
{
private readonly IConfiguration _configuration;
public ConnectionSettings ConnectionSettings { get; set; }
public DatabaseMasterHelper()
{
_configuration = new ConsulConfiguration();
}
public DatabaseMasterHelper(IConfiguration configuration)
{
_configuration = configuration;
}
public void KillConnectionsToDatabase(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionSettings.GetConnectionString(false)))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"alter database {sqlCommandBuilder.QuoteIdentifier(dbDatabase)} set single_user with rollback immediate; alter database {sqlCommandBuilder.QuoteIdentifier(dbDatabase)} set MULTI_USER; ";
command.ExecuteNonQuery();
}
}
public void CreateDatabse(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionSettings.GetConnectionString(false)))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"CREATE DATABASE {sqlCommandBuilder.QuoteIdentifier(dbDatabase)};";
command.ExecuteNonQuery();
}
}
public void DropDatabase(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionSettings.GetConnectionString(false)))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"DROP DATABASE {sqlCommandBuilder.QuoteIdentifier(dbDatabase)};";
command.ExecuteNonQuery();
}
}
public bool DatabaseExists(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionSettings.GetConnectionString(false)))
{
connection.Open();
var command = connection.CreateCommand();
var dbName = sqlCommandBuilder.QuoteIdentifier(dbDatabase);
dbName = dbName.StartsWith("[") ? dbName.Substring(1) : dbName;
dbName = dbName.EndsWith("]") ? dbName.Remove(dbName.Length - 1) : dbName;
command.CommandText = $"SELECT DB_ID('{dbName}') AS RESULT;"; ;
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
var result = reader["RESULT"].ToString();
return !string.IsNullOrWhiteSpace(result);
}
}
return false;
}
}
public void EnsureDatabase(string dbDatabase)
{
if (!DatabaseExists(dbDatabase))
{
CreateDatabse(dbDatabase);
}
}
public string GetConsulDatabaseName()
{
return _configuration.GetString(ConfigurationConnectionSettings.DatabaseKey);
}
}
}
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by Cake.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Reflection;
[assembly: AssemblyTitle("Database.Helpers")]
[assembly: AssemblyDescription("Database.Helpers is a part of the CoScInE group.")]
[assembly: AssemblyCompany("IT Center, RWTH Aachen University")]
[assembly: AssemblyProduct("Database.Helpers")]
[assembly: AssemblyVersion("1.1.0")]
[assembly: AssemblyFileVersion("1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.0-topic-894-automa0001")]
[assembly: AssemblyCopyright("2020 IT Center, RWTH Aachen University")]
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Consul" publicKeyToken="20a6ad9a81df1d95" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.6.1.1" newVersion="1.6.1.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Consul" version="0.7.2.6" targetFramework="net461" />
<package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
</packages>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment