Removing can connect to database check so that Umbraco errors out on … (#13118)

* Removing can connect to database check so that Umbraco errors out on startup rather than trying to re-install when unable to connect to database.

* Revert breaking change

* Support installs of missing databases if the provider CanForceCreateDatabase. Else not

Co-authored-by: Austin Gilbert <AGilbert@rbaconsulting.com>
This commit is contained in:
Bjarke Berg
2022-10-05 12:44:18 +02:00
committed by GitHub
parent bc21c64617
commit a745250d39
2 changed files with 39 additions and 8 deletions

View File

@@ -12,6 +12,7 @@ using Umbraco.Cms.Infrastructure.Migrations.Install;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
using Umbraco.Cms.Infrastructure.Persistence;
using Constants = Umbraco.Cms.Core.Constants;
namespace Umbraco.Cms.Infrastructure.Install
@@ -27,10 +28,10 @@ namespace Umbraco.Cms.Infrastructure.Install
private readonly IUserAgentProvider _userAgentProvider;
private readonly IUmbracoDatabaseFactory _umbracoDatabaseFactory;
private readonly IFireAndForgetRunner _fireAndForgetRunner;
private readonly IEnumerable<IDatabaseProviderMetadata> _databaseProviderMetadata;
private InstallationType? _installationType;
public InstallHelper(
DatabaseBuilder databaseBuilder,
public InstallHelper(DatabaseBuilder databaseBuilder,
ILogger<InstallHelper> logger,
IUmbracoVersion umbracoVersion,
IOptionsMonitor<ConnectionStrings> connectionStrings,
@@ -38,7 +39,8 @@ namespace Umbraco.Cms.Infrastructure.Install
ICookieManager cookieManager,
IUserAgentProvider userAgentProvider,
IUmbracoDatabaseFactory umbracoDatabaseFactory,
IFireAndForgetRunner fireAndForgetRunner)
IFireAndForgetRunner fireAndForgetRunner,
IEnumerable<IDatabaseProviderMetadata> databaseProviderMetadata)
{
_logger = logger;
_umbracoVersion = umbracoVersion;
@@ -49,12 +51,40 @@ namespace Umbraco.Cms.Infrastructure.Install
_userAgentProvider = userAgentProvider;
_umbracoDatabaseFactory = umbracoDatabaseFactory;
_fireAndForgetRunner = fireAndForgetRunner;
_databaseProviderMetadata = databaseProviderMetadata;
// We need to initialize the type already, as we can't detect later, if the connection string is added on the fly.
GetInstallationType();
}
[Obsolete("Please use constructor that takes an IFireAndForgetRunner instead, scheduled for removal in Umbraco 12")]
[Obsolete("Please use constructor that takes an IEnumerable<IDatabaseProviderMetadata> instead, scheduled for removal in Umbraco 12")]
public InstallHelper(
DatabaseBuilder databaseBuilder,
ILogger<InstallHelper> logger,
IUmbracoVersion umbracoVersion,
IOptionsMonitor<ConnectionStrings> connectionStrings,
IInstallationService installationService,
ICookieManager cookieManager,
IUserAgentProvider userAgentProvider,
IUmbracoDatabaseFactory umbracoDatabaseFactory,
IFireAndForgetRunner fireAndForgetRunner)
: this(
databaseBuilder,
logger,
umbracoVersion,
connectionStrings,
installationService,
cookieManager,
userAgentProvider,
umbracoDatabaseFactory,
fireAndForgetRunner,
StaticServiceProvider.Instance.GetRequiredService<IEnumerable<IDatabaseProviderMetadata>>()
)
{
}
[Obsolete("Please use constructor that takes an IFireAndForgetRunner and IEnumerable<IDatabaseProviderMetadata> instead, scheduled for removal in Umbraco 12")]
public InstallHelper(
DatabaseBuilder databaseBuilder,
ILogger<InstallHelper> logger,
@@ -73,7 +103,8 @@ namespace Umbraco.Cms.Infrastructure.Install
cookieManager,
userAgentProvider,
umbracoDatabaseFactory,
StaticServiceProvider.Instance.GetRequiredService<IFireAndForgetRunner>())
StaticServiceProvider.Instance.GetRequiredService<IFireAndForgetRunner>(),
StaticServiceProvider.Instance.GetRequiredService<IEnumerable<IDatabaseProviderMetadata>>())
{
}
@@ -133,7 +164,7 @@ namespace Umbraco.Cms.Infrastructure.Install
private bool IsBrandNewInstall =>
_connectionStrings.CurrentValue.IsConnectionStringConfigured() == false ||
_databaseBuilder.IsDatabaseConfigured == false ||
_databaseBuilder.CanConnectToDatabase == false ||
(_databaseBuilder.CanConnectToDatabase == false && _databaseProviderMetadata.CanForceCreateDatabase(_umbracoDatabaseFactory.SqlContext.SqlSyntax.DbProvider)) ||
_databaseBuilder.IsUmbracoInstalled() == false;
}
}

View File

@@ -96,7 +96,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install
public bool HasSomeNonDefaultUser()
{
using (var scope = _scopeProvider.CreateCoreScope())
using (ICoreScope scope = _scopeProvider.CreateCoreScope())
{
// look for the super user with default password
var sql = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql()
@@ -119,7 +119,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install
internal bool IsUmbracoInstalled()
{
using (var scope = _scopeProvider.CreateCoreScope(autoComplete: true))
using (ICoreScope scope = _scopeProvider.CreateCoreScope(autoComplete: true))
{
return _scopeAccessor.AmbientScope?.Database.IsUmbracoInstalled() ?? false;
}