using System.Data.Odbc; using Microsoft.Data.SqlClient; namespace SQLInsight.Connectivity; internal static class ConnectionStrings { public const string ApplicationName = "SQLInsight Pro"; public static string ForSqlClient(ConnectionTarget target) { var builder = new SqlConnectionStringBuilder { DataSource = target.Server, InitialCatalog = "master", ApplicationName = ApplicationName, ConnectTimeout = (int)target.ConnectTimeout.TotalSeconds, Encrypt = target.Encryption == EncryptionMode.Mandatory ? SqlConnectionEncryptOption.Mandatory : SqlConnectionEncryptOption.Optional, TrustServerCertificate = target.TrustServerCertificate, // Monitoring must never hold a pooled session with leftover state on a busy server. Pooling = false, }; if (target.Authentication == AuthenticationMode.Windows) { builder.IntegratedSecurity = true; } else { builder.UserID = RequireUserName(target); builder.Password = target.Password ?? string.Empty; } return builder.ConnectionString; } public static string ForOdbc(ConnectionTarget target) { var builder = new OdbcConnectionStringBuilder { Driver = target.OdbcDriver, }; builder["Server"] = target.Server; builder["Database"] = "master"; builder["APP"] = ApplicationName; builder["Encrypt"] = target.Encryption == EncryptionMode.Mandatory ? "yes" : "no"; builder["TrustServerCertificate"] = target.TrustServerCertificate ? "yes" : "no"; if (target.Authentication == AuthenticationMode.Windows) { builder["Trusted_Connection"] = "yes"; } else { builder["UID"] = RequireUserName(target); builder["PWD"] = target.Password ?? string.Empty; } return builder.ConnectionString; } private static string RequireUserName(ConnectionTarget target) => string.IsNullOrWhiteSpace(target.UserName) ? throw new ArgumentException($"A user name is required for SQL login authentication to '{target.Server}'.", nameof(target)) : target.UserName; }