using Microsoft.Extensions.Logging;
using NPoco;
using static Umbraco.Cms.Core.Constants;
using ColumnInfo = Umbraco.Cms.Infrastructure.Persistence.SqlSyntax.ColumnInfo;
namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_17_0_1;
///
/// Ensures the propertyTypeId column in umbracoPropertyData has correct camel case naming.
///
///
/// SQL Server is case sensitive for columns used in a SQL Bulk insert statement (which is used in publishing
/// operations on umbracoPropertyData).
/// Earlier versions of Umbraco used all lower case for the propertyTypeId column name (propertytypeid), whereas newer versions
/// use camel case (propertyTypeId).
///
public class EnsureUmbracoPropertyDataColumnCasing : AsyncMigrationBase
{
private readonly ILogger _logger;
///
/// Initializes a new instance of the class.
///
public EnsureUmbracoPropertyDataColumnCasing(IMigrationContext context, ILogger logger)
: base(context) => _logger = logger;
///
protected override Task MigrateAsync()
{
// We only need to do this for SQL Server.
if (DatabaseType == DatabaseType.SQLite)
{
return Task.CompletedTask;
}
const string oldColumnName = "propertytypeid";
const string newColumnName = "propertyTypeId";
ColumnInfo[] columns = [.. SqlSyntax.GetColumnsInSchema(Context.Database)];
ColumnInfo? targetColumn = columns
.FirstOrDefault(x => x.TableName == DatabaseSchema.Tables.PropertyData && string.Equals(x.ColumnName, oldColumnName, StringComparison.InvariantCulture));
if (targetColumn is not null)
{
// The column exists with incorrect casing, we need to rename it.
Rename.Column(oldColumnName)
.OnTable(DatabaseSchema.Tables.PropertyData)
.To(newColumnName)
.Do();
_logger.LogInformation("Renamed column {OldColumnName} to {NewColumnName} on table {TableName}", oldColumnName, newColumnName, DatabaseSchema.Tables.PropertyData);
}
return Task.CompletedTask;
}
}