From 1280235dcfe98651123db9ed14c9ca613cae6f03 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 6 Jul 2020 16:25:15 +1000 Subject: [PATCH] Adds custom mapper for SqlCe for Image column, hopefully tests pass now. --- .../Persistence/SqlCeImageMapper.cs | 59 +++++++++++++++++++ .../Persistence/UmbracoDatabase.cs | 17 ++++-- src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../NuCache/PublishedSnapshotService.cs | 2 +- 4 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/Umbraco.Core/Persistence/SqlCeImageMapper.cs diff --git a/src/Umbraco.Core/Persistence/SqlCeImageMapper.cs b/src/Umbraco.Core/Persistence/SqlCeImageMapper.cs new file mode 100644 index 0000000000..33303c68f0 --- /dev/null +++ b/src/Umbraco.Core/Persistence/SqlCeImageMapper.cs @@ -0,0 +1,59 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Data.SqlServerCe; +using System.Linq; +using System.Reflection; +using NPoco; +using Umbraco.Core.Composing; + +namespace Umbraco.Core.Persistence +{ + /// + /// Custom NPoco mapper for SqlCe + /// + /// + /// Work arounds to handle special columns + /// + internal class SqlCeImageMapper : DefaultMapper + { + public override Func GetToDbConverter(Type destType, MemberInfo sourceMemberInfo) + { + if (sourceMemberInfo.GetMemberInfoType() == typeof(byte[])) + { + return x => + { + var pd = Current.SqlContext.PocoDataFactory.ForType(sourceMemberInfo.DeclaringType); + if (pd == null) return null; + var col = pd.AllColumns.FirstOrDefault(x => x.MemberInfoData.MemberInfo == sourceMemberInfo); + if (col == null) return null; + + return new SqlCeParameter + { + SqlDbType = SqlDbType.Image, + Value = x ?? Array.Empty() + }; + }; + } + return base.GetToDbConverter(destType, sourceMemberInfo); + } + + public override Func GetParameterConverter(DbCommand dbCommand, Type sourceType) + { + if (sourceType == typeof(byte[])) + { + return x => + { + var param = new SqlCeParameter + { + SqlDbType = SqlDbType.Image, + Value = x + }; + return param; + }; + + } + return base.GetParameterConverter(dbCommand, sourceType); + } + } +} diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index a95d95ea08..ec09db690f 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Persistence.FaultHandling; namespace Umbraco.Core.Persistence { + /// /// Extends NPoco Database for Umbraco. /// @@ -38,14 +39,10 @@ namespace Umbraco.Core.Persistence : base(connectionString, sqlContext.DatabaseType, provider, sqlContext.SqlSyntax.DefaultIsolationLevel) { SqlContext = sqlContext; - _logger = logger; _connectionRetryPolicy = connectionRetryPolicy; _commandRetryPolicy = commandRetryPolicy; - - EnableSqlTrace = EnableSqlTraceDefault; - - NPocoDatabaseExtensions.ConfigureNPocoBulkExtensions(); + Init(); } /// @@ -57,10 +54,17 @@ namespace Umbraco.Core.Persistence { SqlContext = sqlContext; _logger = logger; + Init(); + } + private void Init() + { EnableSqlTrace = EnableSqlTraceDefault; - NPocoDatabaseExtensions.ConfigureNPocoBulkExtensions(); + if (SqlContext.DatabaseType == DatabaseType.SQLCe) + { + Mappers.Add(new SqlCeImageMapper()); + } } #endregion @@ -257,5 +261,6 @@ namespace Umbraco.Core.Persistence } #endregion + } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 706c2a3650..5e2411db09 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -140,6 +140,7 @@ + diff --git a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs index 99396b45c9..c87f035589 100755 --- a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs @@ -1325,7 +1325,7 @@ namespace Umbraco.Web.PublishedCache.NuCache "SET data=@data, dataRaw=@dataRaw, rv=rv+1 WHERE nodeId=@id AND published=@published", new { - dataRaw = dto.RawData, + dataRaw = dto.RawData ?? Array.Empty(), data = dto.Data, id = dto.NodeId, published = dto.Published