Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax;

namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_17_4_0;

Expand Down Expand Up @@ -67,20 +69,21 @@ internal static async Task ExecuteMigration(IUmbracoDatabase database, IDataType
// could exceed the default command timeout, so extend it here.
EnsureLongCommandTimeout(database);

ISqlSyntaxProvider syntax = database.SqlContext.SqlSyntax;
var sql = $@"
UPDATE umbracoPropertyData
SET textValue = varcharValue, varcharValue = NULL
WHERE propertyTypeId IN (
SELECT id
FROM cmsPropertyType
WHERE dataTypeId IN (
SELECT nodeId
FROM umbracoDataType
WHERE propertyEditorAlias = '{Constants.PropertyEditors.Aliases.Label}'
AND dbType = '{nameof(ValueStorageType.Ntext)}'
UPDATE {syntax.GetQuotedTableName(PropertyDataDto.TableName)}
SET {syntax.GetQuotedColumnName(PropertyDataDto.TextValueColumnName)} = {syntax.GetQuotedColumnName(PropertyDataDto.VarcharValueColumnName)}, {syntax.GetQuotedColumnName(PropertyDataDto.VarcharValueColumnName)} = NULL
WHERE {syntax.GetQuotedColumnName(PropertyDataDto.PropertyTypeIdColumnName)} IN (
SELECT {syntax.GetQuotedColumnName(PropertyTypeDto.PrimaryKeyColumnName)}
FROM {syntax.GetQuotedTableName(PropertyTypeDto.TableName)}
WHERE {syntax.GetQuotedColumnName(PropertyTypeDto.DataTypeIdColumnName)} IN (
SELECT {syntax.GetQuotedColumnName(DataTypeDto.PrimaryKeyColumnName)}
FROM {syntax.GetQuotedTableName(DataTypeDto.TableName)}
WHERE {syntax.GetQuotedColumnName(DataTypeDto.EditorAliasColumnName)} = '{Constants.PropertyEditors.Aliases.Label}'
AND {syntax.GetQuotedColumnName(DataTypeDto.DbTypeColumnName)} = '{nameof(ValueStorageType.Ntext)}'
)
)
AND varcharValue IS NOT NULL";
AND {syntax.GetQuotedColumnName(PropertyDataDto.VarcharValueColumnName)} IS NOT NULL";
await database.ExecuteAsync(sql);
}
}
6 changes: 4 additions & 2 deletions src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class DataTypeDto
{
public const string TableName = Constants.DatabaseSchema.Tables.DataType;
public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName;
public const string EditorAliasColumnName = "propertyEditorAlias";
public const string DbTypeColumnName = "dbType";

/// <summary>
/// Gets or sets the identifier of the associated node.
Expand All @@ -28,7 +30,7 @@ public class DataTypeDto
/// Gets or sets the alias of the property editor associated with this data type.
/// </summary>
/// <remarks>TODO: should this have a length</remarks>
[Column("propertyEditorAlias")]
[Column(EditorAliasColumnName)]
public string EditorAlias { get; set; } = null!;

/// <summary>
Expand All @@ -41,7 +43,7 @@ public class DataTypeDto
/// <summary>
/// Gets or sets the type of the database column used to store values for this data type.
/// </summary>
[Column("dbType")]
[Column(DbTypeColumnName)]
[Length(50)]
public string DbType { get; set; } = null!;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ internal sealed class PropertyDataDto
public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId;
public const string PropertyTypeIdColumnName = "propertyTypeId";
public const string VersionIdColumnName = "versionId";
public const string TextValueColumnName = "textValue";
public const string VarcharValueColumnName = "varcharValue";
public const int VarcharLength = 512;
public const int SegmentLength = 256;

Expand Down Expand Up @@ -93,15 +95,15 @@ public decimal? DecimalValue
/// Gets or sets the string value stored in the <c>varcharValue</c> column for this property data record.
/// This typically contains the value of a property when stored as a variable-length string.
/// </summary>
[Column("varcharValue")]
[Column(VarcharValueColumnName)]
[NullSetting(NullSetting = NullSettings.Null)]
[Length(VarcharLength)]
public string? VarcharValue { get; set; }

/// <summary>
/// Gets or sets the text value associated with the property data in the database.
/// </summary>
[Column("textValue")]
[Column(TextValueColumnName)]
[NullSetting(NullSetting = NullSettings.Null)]
[SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
public string? TextValue { get; set; }
Expand Down
Loading