using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Install.Models; using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax; namespace Umbraco.Cms.Infrastructure.Persistence; /// /// Extension methods for . /// public static class DatabaseProviderMetadataExtensions { /// /// Gets the available database provider metadata. /// /// The database provider metadata. /// If set to true only returns providers that support quick install. /// /// The available database provider metadata. /// public static IEnumerable GetAvailable(this IEnumerable databaseProviderMetadata, bool onlyQuickInstall = false) => databaseProviderMetadata.Where(x => (!onlyQuickInstall || x.SupportsQuickInstall) && x.IsAvailable).OrderBy(x => x.SortOrder); /// /// Determines whether a database can be created for the specified provider name while ignoring the value of . /// /// The database provider metadata. /// The name of the provider. /// /// true if a database can be created for the specified provider name; otherwise, false. /// [Obsolete("Use CanForceCreateDatabase that takes an IUmbracoDatabaseFactory. Scheduled for removal in Umbraco 13.")] public static bool CanForceCreateDatabase(this IEnumerable databaseProviderMetadata, string? providerName) { return databaseProviderMetadata .FirstOrDefault(x => string.Equals(x.ProviderName, providerName, StringComparison.InvariantCultureIgnoreCase)) ?.ForceCreateDatabase == true; } /// /// Determines whether a database can be created for the specified provider name while ignoring the value of . /// /// The database provider metadata. /// The database factory. /// /// true if a database can be created for the specified database; otherwise, false. /// public static bool CanForceCreateDatabase(this IEnumerable databaseProviderMetadata, IUmbracoDatabaseFactory umbracoDatabaseFactory) { // In case more metadata providers can recognize the connection string, we need to check if any can force create. // E.g. Both SqlServer and SqlAzure will recognize an azure connection string, but luckily none of those can force create. return databaseProviderMetadata .Where(x => string.Equals(x.ProviderName, umbracoDatabaseFactory.SqlContext.SqlSyntax.ProviderName, StringComparison.InvariantCultureIgnoreCase) && x.CanRecognizeConnectionString(umbracoDatabaseFactory.ConnectionString) && x.IsAvailable).Any(x => x.ForceCreateDatabase == true); } /// /// Generates the connection string. /// /// The database provider metadata. /// The name of the database, uses the default database name when null. /// The server. /// The login. /// The password. /// Indicates whether integrated authentication should be used (when supported by the provider). /// /// The generated connection string. /// public static string? GenerateConnectionString(this IDatabaseProviderMetadata databaseProviderMetadata, string? databaseName = null, string? server = null, string? login = null, string? password = null, bool? integratedAuth = null) => databaseProviderMetadata.GenerateConnectionString(new DatabaseModel() { DatabaseProviderMetadataId = databaseProviderMetadata.Id, ProviderName = databaseProviderMetadata.ProviderName, DatabaseName = databaseName ?? databaseProviderMetadata.DefaultDatabaseName, Server = server ?? string.Empty, Login = login ?? string.Empty, Password = password ?? string.Empty, IntegratedAuth = integratedAuth == true && databaseProviderMetadata.SupportsIntegratedAuthentication }); }