From a745250d3993b693685c2817e4fb0ced09740325 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 5 Oct 2022 12:44:18 +0200 Subject: [PATCH] =?UTF-8?q?Removing=20can=20connect=20to=20database=20chec?= =?UTF-8?q?k=20so=20that=20Umbraco=20errors=20out=20on=20=E2=80=A6=20(#131?= =?UTF-8?q?18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- .../Install/InstallHelper.cs | 43 ++++++++++++++++--- .../Migrations/Install/DatabaseBuilder.cs | 4 +- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Infrastructure/Install/InstallHelper.cs b/src/Umbraco.Infrastructure/Install/InstallHelper.cs index 85839e8757..9305c4444e 100644 --- a/src/Umbraco.Infrastructure/Install/InstallHelper.cs +++ b/src/Umbraco.Infrastructure/Install/InstallHelper.cs @@ -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 _databaseProviderMetadata; private InstallationType? _installationType; - public InstallHelper( - DatabaseBuilder databaseBuilder, + public InstallHelper(DatabaseBuilder databaseBuilder, ILogger logger, IUmbracoVersion umbracoVersion, IOptionsMonitor connectionStrings, @@ -38,7 +39,8 @@ namespace Umbraco.Cms.Infrastructure.Install ICookieManager cookieManager, IUserAgentProvider userAgentProvider, IUmbracoDatabaseFactory umbracoDatabaseFactory, - IFireAndForgetRunner fireAndForgetRunner) + IFireAndForgetRunner fireAndForgetRunner, + IEnumerable 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 instead, scheduled for removal in Umbraco 12")] + public InstallHelper( + DatabaseBuilder databaseBuilder, + ILogger logger, + IUmbracoVersion umbracoVersion, + IOptionsMonitor connectionStrings, + IInstallationService installationService, + ICookieManager cookieManager, + IUserAgentProvider userAgentProvider, + IUmbracoDatabaseFactory umbracoDatabaseFactory, + IFireAndForgetRunner fireAndForgetRunner) + : this( + databaseBuilder, + logger, + umbracoVersion, + connectionStrings, + installationService, + cookieManager, + userAgentProvider, + umbracoDatabaseFactory, + fireAndForgetRunner, + StaticServiceProvider.Instance.GetRequiredService>() + ) + { + + } + + [Obsolete("Please use constructor that takes an IFireAndForgetRunner and IEnumerable instead, scheduled for removal in Umbraco 12")] public InstallHelper( DatabaseBuilder databaseBuilder, ILogger logger, @@ -73,7 +103,8 @@ namespace Umbraco.Cms.Infrastructure.Install cookieManager, userAgentProvider, umbracoDatabaseFactory, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService(), + StaticServiceProvider.Instance.GetRequiredService>()) { } @@ -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; } } diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs index b3188720b0..d8e132440c 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs @@ -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; }