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
});
}