using Infrastructure.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; } }