Adds migration for binary column on cmsContentNu

This commit is contained in:
Shannon
2020-07-03 15:41:25 +10:00
parent de67bdc2a2
commit 39625d94dd
9 changed files with 66 additions and 14 deletions

View File

@@ -191,8 +191,9 @@ namespace Umbraco.Core.Migrations.Upgrade
To<MissingContentVersionsIndexes>("{EE288A91-531B-4995-8179-1D62D9AA3E2E}"); To<MissingContentVersionsIndexes>("{EE288A91-531B-4995-8179-1D62D9AA3E2E}");
To<AddMainDomLock>("{2AB29964-02A1-474D-BD6B-72148D2A53A2}"); To<AddMainDomLock>("{2AB29964-02A1-474D-BD6B-72148D2A53A2}");
// to 8.7.0...
To<MissingDictionaryIndex>("{a78e3369-8ea3-40ec-ad3f-5f76929d2b20}"); To<MissingDictionaryIndex>("{a78e3369-8ea3-40ec-ad3f-5f76929d2b20}");
To<AddCmsContentNuByteColumn>("{8DDDCD0B-D7D5-4C97-BD6A-6B38CA65752F}");
//FINAL //FINAL
} }

View File

@@ -0,0 +1,21 @@
using System.Linq;
using Umbraco.Core.Persistence.Dtos;
namespace Umbraco.Core.Migrations.Upgrade.V_8_6_0
{
public class AddCmsContentNuByteColumn : MigrationBase
{
public AddCmsContentNuByteColumn(IMigrationContext context)
: base(context)
{
}
public override void Migrate()
{
var columns = SqlSyntax.GetColumnsInSchema(Context.Database).ToList();
AddColumnIfNotExists<ContentNuDto>(columns, "dataRaw");
}
}
}

View File

@@ -25,8 +25,13 @@ namespace Umbraco.Core.Persistence.Dtos
/// </remarks> /// </remarks>
[Column("data")] [Column("data")]
[SpecialDbType(SpecialDbTypes.NTEXT)] [SpecialDbType(SpecialDbTypes.NTEXT)]
[NullSetting(NullSetting = NullSettings.Null)]
public string Data { get; set; } public string Data { get; set; }
[Column("dataRaw")]
[NullSetting(NullSetting = NullSettings.Null)]
public byte[] RawData { get; set; }
[Column("rv")] [Column("rv")]
public long Rv { get; set; } public long Rv { get; set; }
} }

View File

@@ -132,6 +132,7 @@
<Compile Include="Migrations\Upgrade\V_8_0_0\Models\ContentTypeDto80.cs" /> <Compile Include="Migrations\Upgrade\V_8_0_0\Models\ContentTypeDto80.cs" />
<Compile Include="Migrations\Upgrade\V_8_0_0\Models\PropertyDataDto80.cs" /> <Compile Include="Migrations\Upgrade\V_8_0_0\Models\PropertyDataDto80.cs" />
<Compile Include="Migrations\Upgrade\V_8_0_0\Models\PropertyTypeDto80.cs" /> <Compile Include="Migrations\Upgrade\V_8_0_0\Models\PropertyTypeDto80.cs" />
<Compile Include="Migrations\Upgrade\V_8_7_0\AddCmsContentNuByteColumn.cs" />
<Compile Include="Models\ContentDataIntegrityReport.cs" /> <Compile Include="Models\ContentDataIntegrityReport.cs" />
<Compile Include="Models\ContentDataIntegrityReportEntry.cs" /> <Compile Include="Models\ContentDataIntegrityReportEntry.cs" />
<Compile Include="Models\ContentDataIntegrityReportOptions.cs" /> <Compile Include="Models\ContentDataIntegrityReportOptions.cs" />

View File

@@ -27,6 +27,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
public int EditWriterId { get; set; } public int EditWriterId { get; set; }
public int EditTemplateId { get; set; } public int EditTemplateId { get; set; }
public string EditData { get; set; } public string EditData { get; set; }
public byte[] EditDataRaw { get; set; }
// published data // published data
public int PublishedVersionId { get; set; } public int PublishedVersionId { get; set; }
@@ -35,5 +36,6 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
public int PubWriterId { get; set; } public int PubWriterId { get; set; }
public int PubTemplateId { get; set; } public int PubTemplateId { get; set; }
public string PubData { get; set; } public string PubData { get; set; }
public byte[] PubDataRaw { get; set; }
} }
} }

View File

@@ -49,6 +49,9 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
.AndSelect<ContentNuDto>("nuEdit", x => Alias(x.Data, "EditData")) .AndSelect<ContentNuDto>("nuEdit", x => Alias(x.Data, "EditData"))
.AndSelect<ContentNuDto>("nuPub", x => Alias(x.Data, "PubData")) .AndSelect<ContentNuDto>("nuPub", x => Alias(x.Data, "PubData"))
.AndSelect<ContentNuDto>("nuEdit", x => Alias(x.RawData, "EditDataRaw"))
.AndSelect<ContentNuDto>("nuPub", x => Alias(x.RawData, "PubDataRaw"))
.From<NodeDto>(); .From<NodeDto>();
if (joins != null) if (joins != null)
@@ -136,6 +139,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
.AndSelect<ContentDto>(x => Alias(x.ContentTypeId, "ContentTypeId")) .AndSelect<ContentDto>(x => Alias(x.ContentTypeId, "ContentTypeId"))
.AndSelect<ContentVersionDto>(x => Alias(x.Id, "VersionId"), x => Alias(x.Text, "EditName"), x => Alias(x.VersionDate, "EditVersionDate"), x => Alias(x.UserId, "EditWriterId")) .AndSelect<ContentVersionDto>(x => Alias(x.Id, "VersionId"), x => Alias(x.Text, "EditName"), x => Alias(x.VersionDate, "EditVersionDate"), x => Alias(x.UserId, "EditWriterId"))
.AndSelect<ContentNuDto>("nuEdit", x => Alias(x.Data, "EditData")) .AndSelect<ContentNuDto>("nuEdit", x => Alias(x.Data, "EditData"))
.AndSelect<ContentNuDto>("nuEdit", x => Alias(x.RawData, "EditDataRaw"))
.From<NodeDto>(); .From<NodeDto>();
if (joins != null) if (joins != null)
@@ -211,7 +215,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
if (dto.Edited) if (dto.Edited)
{ {
if (dto.EditData == null) if (dto.EditData == null && dto.EditDataRaw == null)
{ {
if (Debugger.IsAttached) if (Debugger.IsAttached)
throw new Exception("Missing cmsContentNu edited content for node " + dto.Id + ", consider rebuilding."); throw new Exception("Missing cmsContentNu edited content for node " + dto.Id + ", consider rebuilding.");
@@ -219,7 +223,9 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
} }
else else
{ {
var nested = _contentNestedDataSerializer.Deserialize(dto.EditData); var nested = _contentNestedDataSerializer is IContentNestedDataByteSerializer byteSerializer
? byteSerializer.DeserializeBytes(dto.EditDataRaw)
: _contentNestedDataSerializer.Deserialize(dto.EditData);
d = new ContentData d = new ContentData
{ {
@@ -238,7 +244,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
if (dto.Published) if (dto.Published)
{ {
if (dto.PubData == null) if (dto.PubData == null && dto.PubDataRaw == null)
{ {
if (Debugger.IsAttached) if (Debugger.IsAttached)
throw new Exception("Missing cmsContentNu published content for node " + dto.Id + ", consider rebuilding."); throw new Exception("Missing cmsContentNu published content for node " + dto.Id + ", consider rebuilding.");
@@ -246,7 +252,9 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
} }
else else
{ {
var nested = _contentNestedDataSerializer.Deserialize(dto.PubData); var nested = _contentNestedDataSerializer is IContentNestedDataByteSerializer byteSerializer
? byteSerializer.DeserializeBytes(dto.PubDataRaw)
: _contentNestedDataSerializer.Deserialize(dto.PubData);
p = new ContentData p = new ContentData
{ {
@@ -279,10 +287,12 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
private ContentNodeKit CreateMediaNodeKit(ContentSourceDto dto) private ContentNodeKit CreateMediaNodeKit(ContentSourceDto dto)
{ {
if (dto.EditData == null) if (dto.EditData == null && dto.EditDataRaw == null)
throw new Exception("No data for media " + dto.Id); throw new Exception("No data for media " + dto.Id);
var nested = _contentNestedDataSerializer.Deserialize(dto.EditData); var nested = _contentNestedDataSerializer is IContentNestedDataByteSerializer byteSerializer
? byteSerializer.DeserializeBytes(dto.EditDataRaw)
: _contentNestedDataSerializer.Deserialize(dto.EditData);
var p = new ContentData var p = new ContentData
{ {

View File

@@ -6,9 +6,17 @@ using System.Threading.Tasks;
namespace Umbraco.Web.PublishedCache.NuCache.DataSource namespace Umbraco.Web.PublishedCache.NuCache.DataSource
{ {
// TODO: We need a better name, not sure why the class is called ContentNested in the first place
public interface IContentNestedDataByteSerializer : IContentNestedDataSerializer
{
ContentNestedData DeserializeBytes(byte[] data);
byte[] SerializeBytes(ContentNestedData nestedData);
}
// TODO: We need a better name, not sure why the class is called ContentNested in the first place
public interface IContentNestedDataSerializer public interface IContentNestedDataSerializer
{ {
ContentNestedData Deserialize(string data); ContentNestedData Deserialize(string data);
string Serialize(ContentNestedData nestedData); string Serialize(ContentNestedData nestedData);
} }
} }

View File

@@ -6,7 +6,7 @@ using System.Collections.Generic;
namespace Umbraco.Web.PublishedCache.NuCache.DataSource namespace Umbraco.Web.PublishedCache.NuCache.DataSource
{ {
internal class MsgPackContentNestedDataSerializer : IContentNestedDataSerializer internal class MsgPackContentNestedDataSerializer : IContentNestedDataByteSerializer
{ {
private MessagePackSerializerOptions _options; private MessagePackSerializerOptions _options;
@@ -39,8 +39,6 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
return json; return json;
} }
// TODO: Instead of returning base64 it would be more ideal to avoid that translation entirely and just store/retrieve raw bytes
public ContentNestedData Deserialize(string data) public ContentNestedData Deserialize(string data)
{ {
var bin = Convert.FromBase64String(data); var bin = Convert.FromBase64String(data);
@@ -54,6 +52,10 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource
return Convert.ToBase64String(bin); return Convert.ToBase64String(bin);
} }
public ContentNestedData DeserializeBytes(byte[] data) => MessagePackSerializer.Deserialize<ContentNestedData>(data, _options);
public byte[] SerializeBytes(ContentNestedData nestedData) => MessagePackSerializer.Serialize(nestedData, _options);
//private class ContentNestedDataResolver : IFormatterResolver //private class ContentNestedDataResolver : IFormatterResolver
//{ //{
// // GetFormatter<T>'s get cost should be minimized so use type cache. // // GetFormatter<T>'s get cost should be minimized so use type cache.

View File

@@ -1322,9 +1322,10 @@ namespace Umbraco.Web.PublishedCache.NuCache
var dto = GetDto(content, published); var dto = GetDto(content, published);
db.InsertOrUpdate(dto, db.InsertOrUpdate(dto,
"SET data=@data, rv=rv+1 WHERE nodeId=@id AND published=@published", "SET data=@data, dataRaw=@dataRaw, rv=rv+1 WHERE nodeId=@id AND published=@published",
new new
{ {
dataRaw = dto.RawData,
data = dto.Data, data = dto.Data,
id = dto.NodeId, id = dto.NodeId,
published = dto.Published published = dto.Published
@@ -1456,7 +1457,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
{ {
NodeId = content.Id, NodeId = content.Id,
Published = published, Published = published,
Data = _contentNestedDataSerializer.Serialize(nestedData) Data = !(_contentNestedDataSerializer is IContentNestedDataByteSerializer) ? _contentNestedDataSerializer.Serialize(nestedData) : null,
RawData = (_contentNestedDataSerializer is IContentNestedDataByteSerializer byteSerializer) ? byteSerializer.SerializeBytes(nestedData) : null
}; };
//Core.Composing.Current.Logger.Debug<PublishedSnapshotService>(dto.Data); //Core.Composing.Current.Logger.Debug<PublishedSnapshotService>(dto.Data);