Merge pull request #10592 from umbraco/v9/bugfix/sqlce-image-mapper-only-applied-for-sqlce

V9: SqlCeImageMapper only applied for SqlCe
This commit is contained in:
Bjarke Berg
2021-07-07 06:23:51 +02:00
committed by GitHub
9 changed files with 62 additions and 14 deletions

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using NPoco;
using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax;
namespace Umbraco.Cms.Infrastructure.Persistence
@@ -12,17 +13,20 @@ namespace Umbraco.Cms.Infrastructure.Persistence
private readonly IDictionary<string, IEmbeddedDatabaseCreator> _embeddedDatabaseCreators;
private readonly IDictionary<string, ISqlSyntaxProvider> _syntaxProviders;
private readonly IDictionary<string, IBulkSqlInsertProvider> _bulkSqlInsertProviders;
private readonly IDictionary<string, IProviderSpecificMapperFactory> _providerSpecificMapperFactories;
public DbProviderFactoryCreator(
Func<string, DbProviderFactory> getFactory,
IEnumerable<ISqlSyntaxProvider> syntaxProviders,
IEnumerable<IBulkSqlInsertProvider> bulkSqlInsertProviders,
IEnumerable<IEmbeddedDatabaseCreator> embeddedDatabaseCreators)
IEnumerable<IEmbeddedDatabaseCreator> embeddedDatabaseCreators,
IEnumerable<IProviderSpecificMapperFactory> providerSpecificMapperFactories)
{
_getFactory = getFactory;
_embeddedDatabaseCreators = embeddedDatabaseCreators.ToDictionary(x=>x.ProviderName);
_syntaxProviders = syntaxProviders.ToDictionary(x=>x.ProviderName);
_bulkSqlInsertProviders = bulkSqlInsertProviders.ToDictionary(x=>x.ProviderName);
_providerSpecificMapperFactories = providerSpecificMapperFactories.ToDictionary(x=>x.ProviderName);
}
public DbProviderFactory CreateFactory(string providerName)
@@ -61,5 +65,15 @@ namespace Umbraco.Cms.Infrastructure.Persistence
creator.Create();
}
}
public NPocoMapperCollection ProviderSpecificMappers(string providerName)
{
if(_providerSpecificMapperFactories.TryGetValue(providerName, out var mapperFactory))
{
return mapperFactory.Mappers;
}
return new NPocoMapperCollection(Array.Empty<IMapper>());
}
}
}

View File

@@ -10,5 +10,6 @@ namespace Umbraco.Cms.Infrastructure.Persistence
ISqlSyntaxProvider GetSqlSyntaxProvider(string providerName);
IBulkSqlInsertProvider CreateBulkSqlInsertProvider(string providerName);
void CreateDatabase(string providerName);
NPocoMapperCollection ProviderSpecificMappers(string providerName);
}
}

View File

@@ -0,0 +1,8 @@
namespace Umbraco.Cms.Infrastructure.Persistence
{
public interface IProviderSpecificMapperFactory
{
string ProviderName { get; }
NPocoMapperCollection Mappers { get; }
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Data.Common;
using Microsoft.Extensions.Options;
using NPoco;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax;
@@ -51,5 +52,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence
{
throw new NotSupportedException("Embedded databases are not supported");
}
public NPocoMapperCollection ProviderSpecificMappers(string providerName) => new NPocoMapperCollection(Array.Empty<IMapper>());
}
}

View File

@@ -30,7 +30,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence
private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory;
private readonly RetryPolicy _connectionRetryPolicy;
private readonly RetryPolicy _commandRetryPolicy;
//private readonly IEnumerable<IMapper> _mapperCollection;
private readonly IEnumerable<IMapper> _mapperCollection;
private readonly Guid _instanceGuid = Guid.NewGuid();
private List<CommandInfo> _commands;
@@ -51,8 +51,8 @@ namespace Umbraco.Cms.Infrastructure.Persistence
IBulkSqlInsertProvider bulkSqlInsertProvider,
DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory,
RetryPolicy connectionRetryPolicy = null,
RetryPolicy commandRetryPolicy = null
/*IEnumerable<IMapper> mapperCollection = null*/)
RetryPolicy commandRetryPolicy = null,
IEnumerable<IMapper> mapperCollection = null)
: base(connectionString, sqlContext.DatabaseType, provider, sqlContext.SqlSyntax.DefaultIsolationLevel)
{
SqlContext = sqlContext;
@@ -61,7 +61,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence
_databaseSchemaCreatorFactory = databaseSchemaCreatorFactory;
_connectionRetryPolicy = connectionRetryPolicy;
_commandRetryPolicy = commandRetryPolicy;
//_mapperCollection = mapperCollection;
_mapperCollection = mapperCollection;
Init();
}
@@ -86,10 +86,10 @@ namespace Umbraco.Cms.Infrastructure.Persistence
{
EnableSqlTrace = EnableSqlTraceDefault;
NPocoDatabaseExtensions.ConfigureNPocoBulkExtensions();
//if (_mapperCollection != null)
//{
// Mappers.AddRange(_mapperCollection);
//}
if (_mapperCollection != null)
{
Mappers.AddRange(_mapperCollection);
}
}
#endregion

View File

@@ -280,6 +280,8 @@ namespace Umbraco.Cms.Infrastructure.Persistence
// add all registered mappers for NPoco
_pocoMappers.AddRange(_npocoMappers);
_pocoMappers.AddRange(_dbProviderFactoryCreator.ProviderSpecificMappers(_providerName));
var factory = new FluentPocoDataFactory(GetPocoDataFactoryResolver);
_pocoDataFactory = factory;
var config = new FluentConfig(xmappers => factory);
@@ -323,7 +325,9 @@ namespace Umbraco.Cms.Infrastructure.Persistence
_bulkSqlInsertProvider,
_databaseSchemaCreatorFactory,
_connectionRetryPolicy,
_commandRetryPolicy);
_commandRetryPolicy,
_pocoMappers
);
protected override void DisposeResources()
{

View File

@@ -0,0 +1,11 @@
using Umbraco.Cms.Core;
using Umbraco.Cms.Infrastructure.Persistence;
namespace Umbraco.Cms.Persistence.SqlCe
{
public class SqlCeSpecificMapperFactory : IProviderSpecificMapperFactory
{
public string ProviderName => Constants.DatabaseProviders.SqlCe;
public NPocoMapperCollection Mappers => new NPocoMapperCollection(new[] {new SqlCeImageMapper()});
}
}

View File

@@ -145,7 +145,8 @@ namespace Umbraco.Extensions
DbProviderFactories.GetFactory,
factory.GetServices<ISqlSyntaxProvider>(),
factory.GetServices<IBulkSqlInsertProvider>(),
factory.GetServices<IEmbeddedDatabaseCreator>()
factory.GetServices<IEmbeddedDatabaseCreator>(),
factory.GetServices<IProviderSpecificMapperFactory>()
));
builder.AddCoreInitialServices();
@@ -351,14 +352,17 @@ namespace Umbraco.Extensions
Type sqlCeSyntaxProviderType = umbSqlCeAssembly.GetType("Umbraco.Cms.Persistence.SqlCe.SqlCeSyntaxProvider");
Type sqlCeBulkSqlInsertProviderType = umbSqlCeAssembly.GetType("Umbraco.Cms.Persistence.SqlCe.SqlCeBulkSqlInsertProvider");
Type sqlCeEmbeddedDatabaseCreatorType = umbSqlCeAssembly.GetType("Umbraco.Cms.Persistence.SqlCe.SqlCeEmbeddedDatabaseCreator");
Type sqlCeImageMapperType = umbSqlCeAssembly.GetType("Umbraco.Cms.Persistence.SqlCe.SqlCeImageMapper");
Type sqlCeSpecificMapperFactory = umbSqlCeAssembly.GetType("Umbraco.Cms.Persistence.SqlCe.SqlCeSpecificMapperFactory");
if (!(sqlCeSyntaxProviderType is null || sqlCeBulkSqlInsertProviderType is null || sqlCeEmbeddedDatabaseCreatorType is null))
if (!(sqlCeSyntaxProviderType is null
|| sqlCeBulkSqlInsertProviderType is null
|| sqlCeEmbeddedDatabaseCreatorType is null
|| sqlCeSpecificMapperFactory is null))
{
builder.Services.AddSingleton(typeof(ISqlSyntaxProvider), sqlCeSyntaxProviderType);
builder.Services.AddSingleton(typeof(IBulkSqlInsertProvider), sqlCeBulkSqlInsertProviderType);
builder.Services.AddSingleton(typeof(IEmbeddedDatabaseCreator), sqlCeEmbeddedDatabaseCreatorType);
builder.NPocoMappers().Add(sqlCeImageMapperType);
builder.Services.AddSingleton(typeof(IProviderSpecificMapperFactory), sqlCeSpecificMapperFactory);
}
var sqlCeAssembly = Assembly.LoadFrom(Path.Combine(binFolder, "System.Data.SqlServerCe.dll"));

View File

@@ -2,6 +2,7 @@ using System;
using System.Data.Common;
using System.Data.SqlServerCe;
using Microsoft.Extensions.Options;
using NPoco;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Infrastructure.Migrations.Install;
using Umbraco.Cms.Infrastructure.Persistence;
@@ -57,5 +58,7 @@ namespace Umbraco.Web
var engine = new SqlCeEngine(DatabaseBuilder.EmbeddedDatabaseConnectionString);
engine.CreateDatabase();
}
public NPocoMapperCollection ProviderSpecificMappers(string providerName) => new NPocoMapperCollection(Array.Empty<IMapper>());
}
}