v10: Use ForceCreateDatabase during unattended install and extend GetUmbracoConnectionString extension methods (#12397)

* Add extension methods to get the Umbraco connection string/provider name from configuration

* Added tests for configuration extension methods.

* Fix issue with InstallMissingDatabase and ForceCreateDatabase

* Fix comments

* Revert casing change in GenerateConnectionString

* Re-add AddOptions (without config binding) to fix test

* Update src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Update src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs

* Update src/Umbraco.Infrastructure/Runtime/RuntimeState.cs

* Whitespace and documentation updates

* Add DatabaseProviderMetadataExtensions

* Filter before ordering

* Replace DataDirectory placeholder when setting connection string

Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
This commit is contained in:
Ronald Barendse
2022-05-17 12:59:01 +02:00
committed by GitHub
parent e82bcb1b76
commit 8e6e262c7f
15 changed files with 487 additions and 243 deletions

View File

@@ -0,0 +1,103 @@
using Microsoft.Extensions.Configuration;
using Umbraco.Cms.Core;
namespace Umbraco.Extensions;
/// <summary>
/// Extension methods for configuration.
/// </summary>
public static class ConfigurationExtensions
{
/// <summary>
/// The DataDirectory name.
/// </summary>
internal const string DataDirectoryName = "DataDirectory";
/// <summary>
/// The DataDirectory placeholder.
/// </summary>
internal const string DataDirectoryPlaceholder = "|DataDirectory|";
/// <summary>
/// The postfix used to identify a connection string provider setting.
/// </summary>
internal const string ProviderNamePostfix = "_ProviderName";
/// <summary>
/// Gets the provider name for the connection string name (shorthand for <c>GetSection("ConnectionStrings")[name + "_ProviderName"]</c>).
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="name">The connection string key.</param>
/// <returns>
/// The provider name.
/// </returns>
/// <remarks>
/// This uses the same convention as the <a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0#connection-string-prefixes">Configuration API for connection string environment variables</a>.
/// </remarks>
public static string? GetConnectionStringProviderName(this IConfiguration configuration, string name)
=> configuration.GetConnectionString(name + ProviderNamePostfix);
/// <summary>
/// Gets the Umbraco connection string (shorthand for <c>GetSection("ConnectionStrings")[name]</c> and replacing the <c>|DataDirectory|</c> placeholder).
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="name">The connection string key.</param>
/// <returns>
/// The Umbraco connection string.
/// </returns>
public static string? GetUmbracoConnectionString(this IConfiguration configuration, string name = Constants.System.UmbracoConnectionName)
=> configuration.GetUmbracoConnectionString(name, out _);
/// <summary>
/// Gets the Umbraco connection string and provider name (shorthand for <c>GetSection("ConnectionStrings")[Constants.System.UmbracoConnectionName]</c> and replacing the <c>|DataDirectory|</c> placeholder).
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="providerName">The provider name.</param>
/// <returns>
/// The Umbraco connection string.
/// </returns>
public static string? GetUmbracoConnectionString(this IConfiguration configuration, out string? providerName)
=> configuration.GetUmbracoConnectionString(Constants.System.UmbracoConnectionName, out providerName);
/// <summary>
/// Gets the Umbraco connection string and provider name (shorthand for <c>GetSection("ConnectionStrings")[name]</c> and replacing the <c>|DataDirectory|</c> placeholder).
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="name">The name.</param>
/// <param name="providerName">The provider name.</param>
/// <returns>
/// The Umbraco connection string.
/// </returns>
public static string? GetUmbracoConnectionString(this IConfiguration configuration, string name, out string? providerName)
{
string? connectionString = configuration.GetConnectionString(name);
if (!string.IsNullOrEmpty(connectionString))
{
// Replace data directory
connectionString = ReplaceDataDirectoryPlaceholder(connectionString);
// Get provider name
providerName = configuration.GetConnectionStringProviderName(name);
}
else
{
providerName = null;
}
return connectionString;
}
internal static string? ReplaceDataDirectoryPlaceholder(string? connectionString)
{
if (!string.IsNullOrEmpty(connectionString))
{
string? dataDirectory = AppDomain.CurrentDomain.GetData(DataDirectoryName)?.ToString();
if (!string.IsNullOrEmpty(dataDirectory))
{
return connectionString.Replace(DataDirectoryPlaceholder, dataDirectory);
}
}
return connectionString;
}
}