Fix invalid CertificateCheckUrl column errors on existing databases.
Auto-migrate SonicContainer schema on startup, rename legacy typo columns, and use fallback SQL when the column is not yet present. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -31,7 +31,7 @@ public sealed class DeploymentTargetRepository
|
||||
nameof(environmentCode));
|
||||
}
|
||||
|
||||
const string sql = """
|
||||
const string sqlWithCheckUrl = """
|
||||
SELECT
|
||||
target.[CertificateTargetId],
|
||||
target.[TargetDirectory],
|
||||
@@ -75,11 +75,63 @@ public sealed class DeploymentTargetRepository
|
||||
target.[TargetFileName];
|
||||
""";
|
||||
|
||||
const string sqlWithoutCheckUrl = """
|
||||
SELECT
|
||||
target.[CertificateTargetId],
|
||||
target.[TargetDirectory],
|
||||
target.[TargetFileName],
|
||||
target.[BackupEnabled],
|
||||
target.[BackupDirectoryName],
|
||||
target.[IsActive] AS [TargetIsActive],
|
||||
|
||||
container.[SonicContainerId],
|
||||
container.[ContainerName],
|
||||
container.[ContainerDisplayName],
|
||||
container.[RestartTimeoutSeconds],
|
||||
|
||||
connection.[ConnectionName],
|
||||
|
||||
environment.[EnvironmentCode],
|
||||
environment.[SortOrder] AS [EnvironmentSortOrder],
|
||||
|
||||
company.[CompanyCode]
|
||||
FROM [dbo].[CertificateTarget] AS target
|
||||
INNER JOIN [dbo].[SonicContainer] AS container
|
||||
ON container.[SonicContainerId] = target.[SonicContainerId]
|
||||
INNER JOIN [dbo].[SonicConnection] AS connection
|
||||
ON connection.[SonicConnectionId] = container.[SonicConnectionId]
|
||||
INNER JOIN [dbo].[Environment] AS environment
|
||||
ON environment.[EnvironmentId] = connection.[EnvironmentId]
|
||||
INNER JOIN [dbo].[Company] AS company
|
||||
ON company.[CompanyId] = container.[CompanyId]
|
||||
WHERE target.[IsActive] = 1
|
||||
AND container.[IsActive] = 1
|
||||
AND connection.[IsActive] = 1
|
||||
AND company.[IsActive] = 1
|
||||
AND environment.[IsActive] = 1
|
||||
AND environment.[EnvironmentCode] = @EnvironmentCode
|
||||
ORDER BY
|
||||
company.[CompanyCode],
|
||||
environment.[SortOrder],
|
||||
container.[ContainerName],
|
||||
target.[TargetDirectory],
|
||||
target.[TargetFileName];
|
||||
""";
|
||||
|
||||
List<DeploymentTarget> targets = [];
|
||||
|
||||
await using SqlConnection connection = new(_connectionString);
|
||||
await connection.OpenAsync(cancellationToken);
|
||||
|
||||
bool hasCertificateCheckUrl =
|
||||
await DatabaseSchemaPatcher.HasCertificateCheckUrlColumnAsync(
|
||||
_connectionString,
|
||||
cancellationToken);
|
||||
|
||||
string sql = hasCertificateCheckUrl
|
||||
? sqlWithCheckUrl
|
||||
: sqlWithoutCheckUrl;
|
||||
|
||||
await using SqlCommand command = new(sql, connection);
|
||||
|
||||
command.Parameters.Add(
|
||||
@@ -120,8 +172,9 @@ public sealed class DeploymentTargetRepository
|
||||
int containerDisplayNameOrdinal =
|
||||
reader.GetOrdinal("ContainerDisplayName");
|
||||
|
||||
int certificateCheckUrlOrdinal =
|
||||
reader.GetOrdinal("CertificateCheckUrl");
|
||||
int? certificateCheckUrlOrdinal = hasCertificateCheckUrl
|
||||
? reader.GetOrdinal("CertificateCheckUrl")
|
||||
: null;
|
||||
|
||||
int restartTimeoutOrdinal =
|
||||
reader.GetOrdinal("RestartTimeoutSeconds");
|
||||
@@ -149,9 +202,11 @@ public sealed class DeploymentTargetRepository
|
||||
containerDisplayNameOrdinal);
|
||||
|
||||
string? certificateCheckUrl =
|
||||
ReadNullableString(
|
||||
reader,
|
||||
certificateCheckUrlOrdinal);
|
||||
certificateCheckUrlOrdinal is int checkUrlOrdinal
|
||||
? ReadNullableString(
|
||||
reader,
|
||||
checkUrlOrdinal)
|
||||
: null;
|
||||
|
||||
string companyCode =
|
||||
reader.GetString(companyCodeOrdinal);
|
||||
|
||||
Reference in New Issue
Block a user