From edd6063c1c4ec935c448758aca6bdc1ceb9c6e42 Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:28:31 -0400 Subject: [PATCH] Fix GUI installer encryption mapping and history logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add missing "Optional" case to encryption switch — previously fell through to default (Mandatory), making the dropdown option non-functional - Remove bare catch in LogInstallationHistoryAsync — exceptions now propagate to the caller which already logs them as warnings. Prevents silent history write failures that cause version detection fallback. Co-Authored-By: Claude Opus 4.6 (1M context) --- InstallerGui/Services/InstallationService.cs | 164 +++++++++---------- 1 file changed, 79 insertions(+), 85 deletions(-) diff --git a/InstallerGui/Services/InstallationService.cs b/InstallerGui/Services/InstallationService.cs index c51657e..7162058 100644 --- a/InstallerGui/Services/InstallationService.cs +++ b/InstallerGui/Services/InstallationService.cs @@ -137,6 +137,7 @@ public static string BuildConnectionString( /*Set encryption mode: Optional, Mandatory, or Strict*/ builder.Encrypt = encryption switch { + "Optional" => SqlConnectionEncryptOption.Optional, "Mandatory" => SqlConnectionEncryptOption.Mandatory, "Strict" => SqlConnectionEncryptOption.Strict, _ => SqlConnectionEncryptOption.Mandatory @@ -1458,101 +1459,94 @@ public static async Task LogInstallationHistoryAsync( int filesFailed, bool isSuccess) { + using var connection = new SqlConnection(connectionString); + await connection.OpenAsync().ConfigureAwait(false); + + /*Check if this is an upgrade by checking for existing installation*/ + string? previousVersion = null; + string installationType = "INSTALL"; + try { - using var connection = new SqlConnection(connectionString); - await connection.OpenAsync().ConfigureAwait(false); - - /*Check if this is an upgrade by checking for existing installation*/ - string? previousVersion = null; - string installationType = "INSTALL"; + using var checkCmd = new SqlCommand(@" + SELECT TOP 1 installer_version + FROM PerformanceMonitor.config.installation_history + WHERE installation_status = 'SUCCESS' + ORDER BY installation_date DESC;", connection); - try + var result = await checkCmd.ExecuteScalarAsync().ConfigureAwait(false); + if (result != null && result != DBNull.Value) { - using var checkCmd = new SqlCommand(@" - SELECT TOP 1 installer_version - FROM PerformanceMonitor.config.installation_history - WHERE installation_status = 'SUCCESS' - ORDER BY installation_date DESC;", connection); - - var result = await checkCmd.ExecuteScalarAsync().ConfigureAwait(false); - if (result != null && result != DBNull.Value) - { - previousVersion = result.ToString(); - bool isSameVersion = Version.TryParse(previousVersion, out var prevVer) - && Version.TryParse(assemblyVersion, out var currVer) - && prevVer == currVer; - installationType = isSameVersion ? "REINSTALL" : "UPGRADE"; - } - } - catch (SqlException) - { - /*Table might not exist yet on first install*/ + previousVersion = result.ToString(); + bool isSameVersion = Version.TryParse(previousVersion, out var prevVer) + && Version.TryParse(assemblyVersion, out var currVer) + && prevVer == currVer; + installationType = isSameVersion ? "REINSTALL" : "UPGRADE"; } + } + catch (SqlException) + { + /*Table might not exist yet on first install*/ + } - /*Get SQL Server version info*/ - string sqlVersion = ""; - string sqlEdition = ""; + /*Get SQL Server version info*/ + string sqlVersion = ""; + string sqlEdition = ""; - using (var versionCmd = new SqlCommand("SELECT @@VERSION, SERVERPROPERTY('Edition');", connection)) - using (var reader = await versionCmd.ExecuteReaderAsync().ConfigureAwait(false)) + using (var versionCmd = new SqlCommand("SELECT @@VERSION, SERVERPROPERTY('Edition');", connection)) + using (var reader = await versionCmd.ExecuteReaderAsync().ConfigureAwait(false)) + { + if (await reader.ReadAsync().ConfigureAwait(false)) { - if (await reader.ReadAsync().ConfigureAwait(false)) - { - sqlVersion = reader.GetString(0); - sqlEdition = reader.GetString(1); - } + sqlVersion = reader.GetString(0); + sqlEdition = reader.GetString(1); } - - long durationMs = (long)(DateTime.Now - startTime).TotalMilliseconds; - string status = isSuccess ? "SUCCESS" : (filesFailed > 0 ? "PARTIAL" : "FAILED"); - - var insertSql = @" - INSERT INTO PerformanceMonitor.config.installation_history - ( - installer_version, - installer_info_version, - sql_server_version, - sql_server_edition, - installation_type, - previous_version, - installation_status, - files_executed, - files_failed, - installation_duration_ms - ) - VALUES - ( - @installer_version, - @installer_info_version, - @sql_server_version, - @sql_server_edition, - @installation_type, - @previous_version, - @installation_status, - @files_executed, - @files_failed, - @installation_duration_ms - );"; - - using var insertCmd = new SqlCommand(insertSql, connection); - insertCmd.Parameters.Add(new SqlParameter("@installer_version", SqlDbType.NVarChar, 50) { Value = assemblyVersion }); - insertCmd.Parameters.Add(new SqlParameter("@installer_info_version", SqlDbType.NVarChar, 100) { Value = (object?)infoVersion ?? DBNull.Value }); - insertCmd.Parameters.Add(new SqlParameter("@sql_server_version", SqlDbType.NVarChar, 500) { Value = sqlVersion }); - insertCmd.Parameters.Add(new SqlParameter("@sql_server_edition", SqlDbType.NVarChar, 128) { Value = sqlEdition }); - insertCmd.Parameters.Add(new SqlParameter("@installation_type", SqlDbType.VarChar, 20) { Value = installationType }); - insertCmd.Parameters.Add(new SqlParameter("@previous_version", SqlDbType.NVarChar, 50) { Value = (object?)previousVersion ?? DBNull.Value }); - insertCmd.Parameters.Add(new SqlParameter("@installation_status", SqlDbType.VarChar, 20) { Value = status }); - insertCmd.Parameters.Add(new SqlParameter("@files_executed", SqlDbType.Int) { Value = filesExecuted }); - insertCmd.Parameters.Add(new SqlParameter("@files_failed", SqlDbType.Int) { Value = filesFailed }); - insertCmd.Parameters.Add(new SqlParameter("@installation_duration_ms", SqlDbType.BigInt) { Value = durationMs }); - - await insertCmd.ExecuteNonQueryAsync().ConfigureAwait(false); - } - catch - { - /*Don't let history logging failure break the installation*/ } + + long durationMs = (long)(DateTime.Now - startTime).TotalMilliseconds; + string status = isSuccess ? "SUCCESS" : (filesFailed > 0 ? "PARTIAL" : "FAILED"); + + var insertSql = @" + INSERT INTO PerformanceMonitor.config.installation_history + ( + installer_version, + installer_info_version, + sql_server_version, + sql_server_edition, + installation_type, + previous_version, + installation_status, + files_executed, + files_failed, + installation_duration_ms + ) + VALUES + ( + @installer_version, + @installer_info_version, + @sql_server_version, + @sql_server_edition, + @installation_type, + @previous_version, + @installation_status, + @files_executed, + @files_failed, + @installation_duration_ms + );"; + + using var insertCmd = new SqlCommand(insertSql, connection); + insertCmd.Parameters.Add(new SqlParameter("@installer_version", SqlDbType.NVarChar, 50) { Value = assemblyVersion }); + insertCmd.Parameters.Add(new SqlParameter("@installer_info_version", SqlDbType.NVarChar, 100) { Value = (object?)infoVersion ?? DBNull.Value }); + insertCmd.Parameters.Add(new SqlParameter("@sql_server_version", SqlDbType.NVarChar, 500) { Value = sqlVersion }); + insertCmd.Parameters.Add(new SqlParameter("@sql_server_edition", SqlDbType.NVarChar, 128) { Value = sqlEdition }); + insertCmd.Parameters.Add(new SqlParameter("@installation_type", SqlDbType.VarChar, 20) { Value = installationType }); + insertCmd.Parameters.Add(new SqlParameter("@previous_version", SqlDbType.NVarChar, 50) { Value = (object?)previousVersion ?? DBNull.Value }); + insertCmd.Parameters.Add(new SqlParameter("@installation_status", SqlDbType.VarChar, 20) { Value = status }); + insertCmd.Parameters.Add(new SqlParameter("@files_executed", SqlDbType.Int) { Value = filesExecuted }); + insertCmd.Parameters.Add(new SqlParameter("@files_failed", SqlDbType.Int) { Value = filesFailed }); + insertCmd.Parameters.Add(new SqlParameter("@installation_duration_ms", SqlDbType.BigInt) { Value = durationMs }); + + await insertCmd.ExecuteNonQueryAsync().ConfigureAwait(false); } [GeneratedRegex(@"^\d{2}[a-z]?_.*\.sql$")]