using System.Data.Common; using System.Runtime.Serialization; using Microsoft.Data.SqlClient; using Umbraco.Cms.Core.Install.Models; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Extensions; namespace Umbraco.Cms.Persistence.SqlServer.Services; /// /// Provider metadata for SQL Server /// [DataContract] public class SqlServerDatabaseProviderMetadata : IDatabaseProviderMetadata { /// public Guid Id => new("5e1ad149-1951-4b74-90bf-2ac2aada9e73"); /// public int SortOrder => 2; /// public string DisplayName => "SQL Server"; /// public string DefaultDatabaseName => string.Empty; /// public string ProviderName => Constants.ProviderName; /// public bool SupportsQuickInstall => false; /// public bool IsAvailable => true; /// public bool RequiresServer => true; /// public string ServerPlaceholder => "(local)\\SQLEXPRESS"; /// public bool RequiresCredentials => true; /// public bool SupportsIntegratedAuthentication => true; /// public bool RequiresConnectionTest => true; /// public bool ForceCreateDatabase => true; /// public bool CanRecognizeConnectionString(string? connectionString) { if (connectionString is null) { return false; } try { var builder = new SqlConnectionStringBuilder(connectionString); return string.IsNullOrEmpty(builder.AttachDBFilename); } catch (ArgumentException) { return false; } } /// public string GenerateConnectionString(DatabaseModel databaseModel) { string connectionString = $"Server={databaseModel.Server};Database={databaseModel.DatabaseName};"; connectionString = HandleIntegratedAuthentication(connectionString, databaseModel); connectionString = HandleTrustServerCertificate(connectionString, databaseModel); return connectionString; } private static string HandleIntegratedAuthentication(string connectionString, DatabaseModel databaseModel) { if (databaseModel.IntegratedAuth) { connectionString += "Integrated Security=true"; } else { connectionString += $"User Id={databaseModel.Login};Password={databaseModel.Password}"; } return connectionString; } private static string HandleTrustServerCertificate(string connectionString, DatabaseModel databaseModel) { if (databaseModel.TrustServerCertificate) { connectionString += ";TrustServerCertificate=true;"; } return connectionString; } }