Merge remote-tracking branch 'origin/netcore/feature/AB3791-Move-scoping-to-infrastructure-and-replace-callcontext' into netcore/feature/AB4227-move-files-to-infrastructure
# Conflicts: # src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs # src/Umbraco.Tests/TestHelpers/TestHelper.cs # src/Umbraco.Web/Editors/UsersController.cs
This commit is contained in:
@@ -5,6 +5,6 @@ namespace Umbraco.Composing
|
||||
public static class Current
|
||||
{
|
||||
|
||||
public static ILogger Logger { get; set; }
|
||||
public static ILogger Logger { get; set; } = new NullLogger();
|
||||
}
|
||||
}
|
||||
|
||||
109
src/Umbraco.Abstractions/Logging/NullLogger.cs
Normal file
109
src/Umbraco.Abstractions/Logging/NullLogger.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
using System;
|
||||
|
||||
namespace Umbraco.Core.Logging
|
||||
{
|
||||
public class NullLogger : ILogger
|
||||
{
|
||||
public bool IsEnabled(Type reporting, LogLevel level) => false;
|
||||
|
||||
public void Fatal(Type reporting, Exception exception, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Fatal(Type reporting, Exception exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Fatal(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Fatal(Type reporting, Exception exception, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Fatal(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Error(Type reporting, Exception exception, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Error(Type reporting, Exception exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Error(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Error(Type reporting, Exception exception, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Error(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Warn(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Warn(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Warn(Type reporting, Exception exception, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Warn(Type reporting, Exception exception, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Info(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Info(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Debug(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Debug(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Verbose(Type reporting, string message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Verbose(Type reporting, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace Umbraco.Core.Persistence
|
||||
{
|
||||
public class SqlCeBulkSqlInsertProvider : IBulkSqlInsertProvider
|
||||
{
|
||||
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert)
|
||||
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records)
|
||||
{
|
||||
var recordsA = records.ToArray();
|
||||
if (recordsA.Length == 0) return 0;
|
||||
@@ -17,11 +17,8 @@ namespace Umbraco.Core.Persistence
|
||||
var pocoData = database.PocoDataFactory.ForType(typeof(T));
|
||||
if (pocoData == null) throw new InvalidOperationException("Could not find PocoData for " + typeof(T));
|
||||
|
||||
if (useNativeBulkInsert) return BulkInsertRecordsSqlCe(database, pocoData, recordsA);
|
||||
// else, no other choice
|
||||
foreach (var record in recordsA)
|
||||
database.Insert(record);
|
||||
return recordsA.Length;
|
||||
return BulkInsertRecordsSqlCe(database, pocoData, recordsA);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -4,6 +4,6 @@ namespace Umbraco.Core.Persistence
|
||||
{
|
||||
public interface IBulkSqlInsertProvider
|
||||
{
|
||||
int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert);
|
||||
int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,6 @@ namespace Umbraco.Core.Persistence
|
||||
|
||||
bool EnableSqlCount { get; set; }
|
||||
int SqlCount { get; }
|
||||
int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true);
|
||||
int BulkInsertRecords<T>(IEnumerable<T> records);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,26 +30,6 @@ namespace Umbraco.Core.Persistence
|
||||
SqlBulkCopyHelper.SqlTransactionResolver = dbTran => GetTypedTransaction<SqlTransaction>(dbTran);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Bulk-inserts records within a transaction.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of the records.</typeparam>
|
||||
/// <param name="database">The database.</param>
|
||||
/// <param name="records">The records.</param>
|
||||
/// <param name="useNativeBulkInsert">Whether to use native bulk insert when available.</param>
|
||||
public static void BulkInsertRecordsWithTransaction<T>(this IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert = true)
|
||||
{
|
||||
var recordsA = records.ToArray();
|
||||
if (recordsA.Length == 0)
|
||||
return;
|
||||
|
||||
// no need to "try...catch", if the transaction is not completed it will rollback!
|
||||
using (var tr = database.GetTransaction())
|
||||
{
|
||||
database.BulkInsertRecords(recordsA, useNativeBulkInsert);
|
||||
tr.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates bulk-insert commands.
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Umbraco.Core.Persistence
|
||||
{
|
||||
public class SqlServerBulkSqlInsertProvider : IBulkSqlInsertProvider
|
||||
{
|
||||
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records, bool useNativeBulkInsert)
|
||||
public int BulkInsertRecords<T>(IUmbracoDatabase database, IEnumerable<T> records)
|
||||
{
|
||||
var recordsA = records.ToArray();
|
||||
if (recordsA.Length == 0) return 0;
|
||||
@@ -18,10 +18,9 @@ namespace Umbraco.Core.Persistence
|
||||
var pocoData = database.PocoDataFactory.ForType(typeof(T));
|
||||
if (pocoData == null) throw new InvalidOperationException("Could not find PocoData for " + typeof(T));
|
||||
|
||||
return useNativeBulkInsert && database.DatabaseType.IsSqlServer2008OrLater()
|
||||
return database.DatabaseType.IsSqlServer2008OrLater()
|
||||
? BulkInsertRecordsSqlServer(database, pocoData, recordsA)
|
||||
: BulkInsertRecordsWithCommands(database, recordsA);
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -162,9 +162,9 @@ namespace Umbraco.Core.Persistence
|
||||
/// </summary>
|
||||
public int SqlCount { get; private set; }
|
||||
|
||||
public int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true)
|
||||
public int BulkInsertRecords<T>(IEnumerable<T> records)
|
||||
{
|
||||
return _bulkSqlInsertProvider.BulkInsertRecords(this, records, useNativeBulkInsert);
|
||||
return _bulkSqlInsertProvider.BulkInsertRecords(this, records);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
<_UnmanagedRegistrationCache Remove="obj\Umbraco.Infrastructure.csproj.UnmanagedRegistration.cache" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="obj\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Remove="obj\**" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlServerCe;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Migrations.Install;
|
||||
using Umbraco.Core.Persistence;
|
||||
using Umbraco.Core.Persistence.Dtos;
|
||||
using Umbraco.Core.Persistence.Mappers;
|
||||
using Umbraco.Core.Scoping;
|
||||
using Umbraco.Tests.Benchmarks.Config;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using ILogger = Umbraco.Core.Logging.ILogger;
|
||||
|
||||
namespace Umbraco.Tests.Benchmarks
|
||||
{
|
||||
[QuickRunWithMemoryDiagnoserConfig]
|
||||
public class BulkInsertBenchmarks
|
||||
{
|
||||
private static byte[] _initDbBytes;
|
||||
|
||||
// FIXME: should run on LocalDb same as NPoco tests!
|
||||
|
||||
private IUmbracoDatabase GetSqlServerDatabase(ILogger logger)
|
||||
{
|
||||
IScopeProvider f = null;
|
||||
var l = new Lazy<IScopeProvider>(() => f);
|
||||
var factory = new UmbracoDatabaseFactory(
|
||||
"server=.\\SQLExpress;database=YOURDB;user id=YOURUSER;password=YOURPASS",
|
||||
Constants.DatabaseProviders.SqlServer,
|
||||
logger,
|
||||
new Lazy<IMapperCollection>(() => new MapperCollection(Enumerable.Empty<BaseMapper>())),
|
||||
TestHelper.DbProviderFactoryCreator,
|
||||
TestHelper.BulkSqlInsertProvider);
|
||||
return factory.CreateDatabase();
|
||||
}
|
||||
|
||||
private IUmbracoDatabase GetSqlCeDatabase(string cstr, ILogger logger)
|
||||
{
|
||||
var f = new UmbracoDatabaseFactory(
|
||||
cstr,
|
||||
Constants.DatabaseProviders.SqlCe,
|
||||
logger,
|
||||
new Lazy<IMapperCollection>(() => new MapperCollection(Enumerable.Empty<BaseMapper>())),
|
||||
TestHelper.DbProviderFactoryCreator,
|
||||
TestHelper.BulkSqlInsertProvider);
|
||||
return f.CreateDatabase();
|
||||
}
|
||||
|
||||
[GlobalSetup]
|
||||
public void Setup()
|
||||
{
|
||||
var logger = new DebugDiagnosticsLogger(new MessageTemplates());
|
||||
var path = TestHelper.CurrentAssemblyDirectory;
|
||||
var umbracoVersion = TestHelper.GetUmbracoVersion();
|
||||
SetupSqlCe(path, logger, umbracoVersion);
|
||||
SetupSqlServer(logger);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void SetupSqlServer(ILogger logger)
|
||||
{
|
||||
//create the db
|
||||
_dbSqlServer = GetSqlServerDatabase(logger);
|
||||
|
||||
//drop the table
|
||||
// note: DROP TABLE IF EXISTS is SQL 2016+
|
||||
_dbSqlServer.Execute("IF OBJECT_ID('dbo.umbracoServer', 'U') IS NOT NULL DROP TABLE [umbracoServer]");
|
||||
|
||||
//re-create it
|
||||
_dbSqlServer.Execute(@"CREATE TABLE [umbracoServer](
|
||||
[id] [int] IDENTITY(1,1) NOT NULL,
|
||||
[address] [nvarchar](500) NOT NULL,
|
||||
[computerName] [nvarchar](255) NOT NULL,
|
||||
[registeredDate] [datetime] NOT NULL CONSTRAINT [DF_umbracoServer_registeredDate] DEFAULT (getdate()),
|
||||
[lastNotifiedDate] [datetime] NOT NULL,
|
||||
[isActive] [bit] NOT NULL,
|
||||
[isMaster] [bit] NOT NULL,
|
||||
CONSTRAINT [PK_umbracoServer] PRIMARY KEY CLUSTERED
|
||||
(
|
||||
[id] ASC
|
||||
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
||||
)");
|
||||
}
|
||||
|
||||
private void SetupSqlCe(string path, ILogger logger, IUmbracoVersion umbracoVersion)
|
||||
{
|
||||
var dbName = string.Concat("Umb", Guid.NewGuid(), ".sdf");
|
||||
AppDomain.CurrentDomain.SetData("DataDirectory", path);
|
||||
var sqlCeConnectionString = $"Datasource=|DataDirectory|\\{dbName};Flush Interval=1;";
|
||||
|
||||
_dbFile = Path.Combine(path, dbName);
|
||||
|
||||
//only create the db one time
|
||||
if (_initDbBytes == null)
|
||||
{
|
||||
using (var engine = new SqlCeEngine(sqlCeConnectionString))
|
||||
{
|
||||
engine.CreateDatabase();
|
||||
}
|
||||
|
||||
//use the db to create the initial schema so we can reuse in each bench
|
||||
using (_dbSqlCe = GetSqlCeDatabase(sqlCeConnectionString, logger))
|
||||
{
|
||||
var creation = new DatabaseSchemaCreator(_dbSqlCe, logger, umbracoVersion, SettingsForTests.GenerateMockGlobalSettings());
|
||||
creation.InitializeDatabaseSchema();
|
||||
}
|
||||
_initDbBytes = File.ReadAllBytes(_dbFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
File.WriteAllBytes(_dbFile, _initDbBytes);
|
||||
}
|
||||
|
||||
//create the db
|
||||
_dbSqlCe = GetSqlCeDatabase(sqlCeConnectionString, logger);
|
||||
}
|
||||
|
||||
private List<ServerRegistrationDto> GetData()
|
||||
{
|
||||
var data = new List<ServerRegistrationDto>();
|
||||
for (var i = 0; i < 1000; i++)
|
||||
{
|
||||
data.Add(new ServerRegistrationDto
|
||||
{
|
||||
ServerAddress = "address" + Guid.NewGuid(),
|
||||
ServerIdentity = "computer" + Guid.NewGuid(),
|
||||
DateRegistered = DateTime.Now,
|
||||
IsActive = true,
|
||||
DateAccessed = DateTime.Now
|
||||
});
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
[GlobalCleanup]
|
||||
public void Cleanup()
|
||||
{
|
||||
_dbSqlCe.Dispose();
|
||||
_dbSqlServer.Dispose();
|
||||
File.Delete(_dbFile);
|
||||
}
|
||||
|
||||
private string _dbFile;
|
||||
private IUmbracoDatabase _dbSqlCe;
|
||||
private IUmbracoDatabase _dbSqlServer;
|
||||
|
||||
/// <summary>
|
||||
/// Tests updating the existing XML way
|
||||
/// </summary>
|
||||
[Benchmark(Baseline = true)]
|
||||
public void SqlCeOneByOne()
|
||||
{
|
||||
using (var tr = _dbSqlCe.GetTransaction())
|
||||
{
|
||||
_dbSqlCe.BulkInsertRecords(GetData(), false);
|
||||
tr.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests updating with only the object graph
|
||||
/// </summary>
|
||||
[Benchmark]
|
||||
public void SqlCeTableDirect()
|
||||
{
|
||||
using (var tr = _dbSqlCe.GetTransaction())
|
||||
{
|
||||
_dbSqlCe.BulkInsertRecords(GetData());
|
||||
tr.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void SqlServerBulkInsertStatements()
|
||||
{
|
||||
using (var tr = _dbSqlServer.GetTransaction())
|
||||
{
|
||||
_dbSqlServer.BulkInsertRecords(GetData(), false);
|
||||
tr.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void SqlServerBulkCopy()
|
||||
{
|
||||
using (var tr = _dbSqlServer.GetTransaction())
|
||||
{
|
||||
_dbSqlServer.BulkInsertRecords(GetData());
|
||||
tr.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,6 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BulkInsertBenchmarks.cs" />
|
||||
<Compile Include="CombineGuidBenchmarks.cs" />
|
||||
<Compile Include="ConcurrentDictionaryBenchmarks.cs" />
|
||||
<Compile Include="Config\QuickRunConfigAttribute.cs" />
|
||||
|
||||
@@ -4,9 +4,7 @@ using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Serialization;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
|
||||
@@ -18,7 +16,6 @@ namespace Umbraco.Tests.Models
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
Umbraco.Composing.Current.Logger = Current.Logger;
|
||||
Current.Reset();
|
||||
Current.UnlockConfigs(TestHelper.GetConfigsFactory(), TestHelper.IOHelper);
|
||||
Current.Configs.Add(SettingsForTests.GetDefaultGlobalSettings);
|
||||
|
||||
@@ -18,72 +18,7 @@ namespace Umbraco.Tests.Persistence.NPocoTests
|
||||
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
|
||||
public class NPocoBulkInsertTests : TestWithDatabaseBase
|
||||
{
|
||||
[Test]
|
||||
public void Can_Bulk_Insert_One_By_One()
|
||||
{
|
||||
var servers = new List<ServerRegistrationDto>();
|
||||
for (var i = 0; i < 1000; i++)
|
||||
{
|
||||
servers.Add(new ServerRegistrationDto
|
||||
{
|
||||
ServerAddress = "address" + i,
|
||||
ServerIdentity = "computer" + i,
|
||||
DateRegistered = DateTime.Now,
|
||||
IsActive = true,
|
||||
DateAccessed = DateTime.Now
|
||||
});
|
||||
}
|
||||
|
||||
// Act
|
||||
using (ProfilingLogger.TraceDuration<NPocoBulkInsertTests>("starting insert", "finished insert"))
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
scope.Database.BulkInsertRecords(servers, false);
|
||||
scope.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
// Assert
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
Assert.That(scope.Database.ExecuteScalar<int>("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(1000));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Can_Bulk_Insert_One_By_One_Transaction_Rollback()
|
||||
{
|
||||
var servers = new List<ServerRegistrationDto>();
|
||||
for (var i = 0; i < 1000; i++)
|
||||
{
|
||||
servers.Add(new ServerRegistrationDto
|
||||
{
|
||||
ServerAddress = "address" + i,
|
||||
ServerIdentity = "computer" + i,
|
||||
DateRegistered = DateTime.Now,
|
||||
IsActive = true,
|
||||
DateAccessed = DateTime.Now
|
||||
});
|
||||
}
|
||||
|
||||
// Act
|
||||
using (ProfilingLogger.TraceDuration<NPocoBulkInsertTests>("starting insert", "finished insert"))
|
||||
{
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
scope.Database.BulkInsertRecords(servers, false);
|
||||
//don't call complete here - the trans will be rolled back
|
||||
}
|
||||
}
|
||||
|
||||
// Assert
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
Assert.That(scope.Database.ExecuteScalar<int>("SELECT COUNT(*) FROM umbracoServer"), Is.EqualTo(0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[NUnit.Framework.Ignore("Ignored because you need to configure your own SQL Server to test thsi with")]
|
||||
[Test]
|
||||
|
||||
@@ -29,11 +29,9 @@ namespace Umbraco.Tests.Services
|
||||
[TestFixture]
|
||||
[Apartment(ApartmentState.STA)]
|
||||
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
|
||||
[NUnit.Framework.Ignore("These should not be run by the server, only directly as they are only benchmark tests")]
|
||||
[NUnit.Framework.Explicit("These should not be run by the server, only directly as they are only benchmark tests")]
|
||||
public class PerformanceTests : TestWithDatabaseBase
|
||||
{
|
||||
// FIXME: probably making little sense in places due to scope creating a transaction?!
|
||||
|
||||
protected override string GetDbConnectionString()
|
||||
{
|
||||
return @"server=.\SQLEXPRESS;database=UmbTest;user id=sa;password=test";
|
||||
@@ -160,24 +158,6 @@ namespace Umbraco.Tests.Services
|
||||
scope.Complete();
|
||||
}
|
||||
|
||||
//now, test truncating but then do bulk insertion of records
|
||||
using (proflog.DebugDuration<PerformanceTests>("Starting truncate + bulk insert test"))
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
//do this 10x!
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
//clear all the xml entries
|
||||
scope.Database.Execute(@"DELETE FROM cmsContentXml WHERE nodeId IN
|
||||
(SELECT DISTINCT cmsContentXml.nodeId FROM cmsContentXml
|
||||
INNER JOIN cmsContent ON cmsContentXml.nodeId = cmsContent.nodeId)");
|
||||
|
||||
//now we insert each record for the ones we've deleted like we do in the content service.
|
||||
var xmlItems = nodes.Select(node => new ContentXmlDto { NodeId = node.NodeId, Xml = UpdatedXmlStructure }).ToList();
|
||||
scope.Database.BulkInsertRecordsWithTransaction(xmlItems);
|
||||
}
|
||||
}
|
||||
|
||||
//now, test truncating but then do bulk insertion of records
|
||||
using (proflog.DebugDuration<PerformanceTests>("Starting truncate + bulk insert test in one transaction"))
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
@@ -188,19 +168,16 @@ namespace Umbraco.Tests.Services
|
||||
//now we insert each record for the ones we've deleted like we do in the content service.
|
||||
var xmlItems = nodes.Select(node => new ContentXmlDto { NodeId = node.NodeId, Xml = UpdatedXmlStructure }).ToList();
|
||||
|
||||
using (var tr = scope.Database.GetTransaction())
|
||||
{
|
||||
//clear all the xml entries
|
||||
scope.Database.Execute(@"DELETE FROM cmsContentXml WHERE nodeId IN
|
||||
//clear all the xml entries
|
||||
scope.Database.Execute(@"DELETE FROM cmsContentXml WHERE nodeId IN
|
||||
(SELECT DISTINCT cmsContentXml.nodeId FROM cmsContentXml
|
||||
INNER JOIN cmsContent ON cmsContentXml.nodeId = cmsContent.nodeId)");
|
||||
|
||||
|
||||
scope.Database.BulkInsertRecords(xmlItems);
|
||||
|
||||
tr.Complete();
|
||||
}
|
||||
scope.Database.BulkInsertRecords(xmlItems);
|
||||
}
|
||||
|
||||
scope.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,7 +244,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
scope.Database.BulkInsertRecordsWithTransaction(nodes);
|
||||
scope.Database.BulkInsertRecords(nodes);
|
||||
|
||||
//re-get the nodes with ids
|
||||
var sql = Current.SqlContext.Sql();
|
||||
@@ -277,11 +254,11 @@ namespace Umbraco.Tests.Services
|
||||
//create the cmsContent data, each with a new content type id (so we can query on it later if needed)
|
||||
var contentTypeId = 0;
|
||||
var cmsContentItems = nodes.Select(node => new ContentDto { NodeId = node.NodeId, ContentTypeId = contentTypeId++ }).ToList();
|
||||
scope.Database.BulkInsertRecordsWithTransaction(cmsContentItems);
|
||||
scope.Database.BulkInsertRecords(cmsContentItems);
|
||||
|
||||
//create the xml data
|
||||
var xmlItems = nodes.Select(node => new ContentXmlDto { NodeId = node.NodeId, Xml = TestXmlStructure }).ToList();
|
||||
scope.Database.BulkInsertRecordsWithTransaction(xmlItems);
|
||||
scope.Database.BulkInsertRecords(xmlItems);
|
||||
|
||||
scope.Complete();
|
||||
}
|
||||
|
||||
@@ -85,13 +85,13 @@ namespace Umbraco.Tests.TestHelpers
|
||||
}
|
||||
}
|
||||
|
||||
public static IShortStringHelper ShortStringHelper => new DefaultShortStringHelper(new DefaultShortStringHelperConfig());
|
||||
public static IDbProviderFactoryCreator DbProviderFactoryCreator => new UmbracoDbProviderFactoryCreator(Constants.DbProviderNames.SqlCe);
|
||||
public static IBulkSqlInsertProvider BulkSqlInsertProvider => new SqlCeBulkSqlInsertProvider();
|
||||
public static IMarchal Marchal => new FrameworkMarchal();
|
||||
public static ICoreDebug CoreDebug => new CoreDebug();
|
||||
public static IShortStringHelper ShortStringHelper { get; } = new DefaultShortStringHelper(new DefaultShortStringHelperConfig());
|
||||
public static IDbProviderFactoryCreator DbProviderFactoryCreator { get; } = new UmbracoDbProviderFactoryCreator(Constants.DbProviderNames.SqlCe);
|
||||
public static IBulkSqlInsertProvider BulkSqlInsertProvider { get; } = new SqlCeBulkSqlInsertProvider();
|
||||
public static IMarchal Marchal { get; } = new FrameworkMarchal();
|
||||
public static ICoreDebug CoreDebug { get; } = new CoreDebug();
|
||||
|
||||
public static IIOHelper IOHelper = new IOHelper(GetHostingEnvironment());
|
||||
public static IIOHelper IOHelper { get; } = new IOHelper(GetHostingEnvironment());
|
||||
|
||||
/// <summary>
|
||||
/// Maps the given <paramref name="relativePath"/> making it rooted on <see cref="CurrentAssemblyDirectory"/>. <paramref name="relativePath"/> must start with <code>~/</code>
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace Umbraco.Tests.Testing
|
||||
public bool InTransaction { get; }
|
||||
public bool EnableSqlCount { get; set; }
|
||||
public int SqlCount { get; }
|
||||
public int BulkInsertRecords<T>(IEnumerable<T> records, bool useNativeBulkInsert = true) => throw new NotImplementedException();
|
||||
public int BulkInsertRecords<T>(IEnumerable<T> records) => throw new NotImplementedException();
|
||||
|
||||
public DbParameter CreateParameter()
|
||||
{
|
||||
|
||||
@@ -42,7 +42,6 @@ namespace Umbraco.Web.Editors
|
||||
[IsCurrentUserModelFilter]
|
||||
public class UsersController : UmbracoAuthorizedJsonController
|
||||
{
|
||||
private readonly IGlobalSettings _globalSettings;
|
||||
private readonly IMediaFileSystem _mediaFileSystem;
|
||||
private readonly IShortStringHelper _shortStringHelper;
|
||||
|
||||
@@ -59,7 +58,6 @@ namespace Umbraco.Web.Editors
|
||||
IShortStringHelper shortStringHelper)
|
||||
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper)
|
||||
{
|
||||
_globalSettings = globalSettings;
|
||||
_mediaFileSystem = mediaFileSystem;
|
||||
_shortStringHelper = shortStringHelper;
|
||||
}
|
||||
@@ -362,7 +360,7 @@ namespace Umbraco.Web.Editors
|
||||
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
|
||||
}
|
||||
|
||||
if (EmailSender.CanSendRequiredEmail(_globalSettings) == false)
|
||||
if (EmailSender.CanSendRequiredEmail(GlobalSettings) == false)
|
||||
{
|
||||
throw new HttpResponseException(
|
||||
Request.CreateNotificationValidationErrorResponse("No Email server is configured"));
|
||||
@@ -492,7 +490,7 @@ namespace Umbraco.Web.Editors
|
||||
await UserManager.EmailService.SendAsync(
|
||||
//send the special UmbracoEmailMessage which configures it's own sender
|
||||
//to allow for events to handle sending the message if no smtp is configured
|
||||
new UmbracoEmailMessage(new EmailSender(_globalSettings, true))
|
||||
new UmbracoEmailMessage(new EmailSender(GlobalSettings, true))
|
||||
{
|
||||
Body = emailBody,
|
||||
Destination = userDisplay.Email,
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
_umbracoContextAccessor = umbracoContextAccessor;
|
||||
_dataTypeService = dataTypeService;
|
||||
_localizationService = localizationService;
|
||||
_ioHelper = Current.IOHelper;
|
||||
_ioHelper = ioHelper;
|
||||
_logger = logger;
|
||||
_mediaService = mediaService;
|
||||
_contentTypeBaseServiceProvider = contentTypeBaseServiceProvider;
|
||||
|
||||
Reference in New Issue
Block a user