using Configuration;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
namespace Database.Connection;
///
/// Helper for building SQL Server connection strings from configuration
/// (backed by the DB_* environment variables).
///
public static class SqlConnectionStringHelper
{
private static SqlConnectionStringBuilder MakeConfiguredConnectionBuilder(
IConfiguration configuration
) =>
new()
{
DataSource = ConfigurationHelpers.GetKeyOrThrow(
configuration,
ConfigurationKeys.DbServer
),
UserID = ConfigurationHelpers.GetKeyOrThrow(configuration, ConfigurationKeys.DbUser),
Password = ConfigurationHelpers.GetKeyOrThrow(
configuration,
ConfigurationKeys.DbPassword
),
TrustServerCertificate = ResolveTrustServerCertificate(configuration),
Encrypt = true,
};
///
/// Builds a SQL Server connection string from configuration.
///
///
/// Returns false if DB_SERVER, DB_NAME, DB_USER, or DB_PASSWORD is unset.
///
/// The configuration to read the DB_* values from.
/// The resolved connection string, if successful.
public static bool TryGetStandardDbConnectionString(
IConfiguration configuration,
out string connectionString
)
{
connectionString = string.Empty;
try
{
SqlConnectionStringBuilder builder = MakeConfiguredConnectionBuilder(configuration);
builder.InitialCatalog = ConfigurationHelpers.GetKeyOrThrow(
configuration,
ConfigurationKeys.DbName
);
connectionString = builder.ConnectionString;
return true;
}
catch
{
return false;
}
}
public static bool TryGetMasterConnectionString(
IConfiguration configuration,
out string connectionString
)
{
connectionString = string.Empty;
try
{
var builder = MakeConfiguredConnectionBuilder(configuration);
builder.InitialCatalog = "master";
connectionString = builder.ConnectionString;
return true;
}
catch
{
return false;
}
}
public static bool TryGetDatabaseNameFromConnectionString(
string connectionString,
out string databaseName
)
{
databaseName = string.Empty;
try
{
var builder = new SqlConnectionStringBuilder(connectionString);
databaseName = builder.InitialCatalog;
return true;
}
catch
{
return false;
}
}
///
/// Resolves the DB_TRUST_SERVER_CERTIFICATE configuration value, defaulting to
/// true when it is unset or not a valid boolean.
///
private static bool ResolveTrustServerCertificate(IConfiguration configuration)
{
return !bool.TryParse(
configuration[ConfigurationKeys.DbTrustServerCertificate],
out bool trustServerCertificate
) || trustServerCertificate;
}
}