diff --git a/src/Umbraco.Core/CoreRuntime.cs b/src/Umbraco.Core/CoreRuntime.cs index 780d83a1e4..3e4b5749a4 100644 --- a/src/Umbraco.Core/CoreRuntime.cs +++ b/src/Umbraco.Core/CoreRuntime.cs @@ -148,7 +148,7 @@ namespace Umbraco.Core { try { - var dbfactory = container.GetInstance(); + var dbfactory = container.GetInstance(); SetRuntimeStateLevel(_state, dbfactory, Logger); Logger.Debug($"Runtime level: {_state.Level}"); } @@ -225,14 +225,11 @@ namespace Umbraco.Core // will be initialized with syntax providers and a logger, and will try to configure // from the default connection string name, if possible, else will remain non-configured // until the database context configures it properly (eg when installing) - container.RegisterSingleton(); + container.RegisterSingleton(); // register database context container.RegisterSingleton(); - // register query factory - fixme kill - container.RegisterSingleton(f => f.GetInstance().QueryFactory); - // register a database accessor - required by database factory // will be replaced by HybridUmbracoDatabaseAccessor in the web runtime // fixme - we should NOT be using thread static at all + will NOT get replaced = wtf? @@ -247,7 +244,7 @@ namespace Umbraco.Core builder.AddCore(); } - private void SetRuntimeStateLevel(RuntimeState runtimeState, IDatabaseFactory databaseFactory, ILogger logger) + private void SetRuntimeStateLevel(RuntimeState runtimeState, IUmbracoDatabaseFactory databaseFactory, ILogger logger) { var localVersion = LocalVersion; // the local, files, version var codeVersion = runtimeState.SemanticVersion; // the executing code version @@ -340,14 +337,12 @@ namespace Umbraco.Core runtimeState.Level = RuntimeLevel.Upgrade; } - protected virtual bool EnsureMigration(IDatabaseFactory databaseFactory, SemVersion codeVersion) + protected virtual bool EnsureMigration(IUmbracoDatabaseFactory databaseFactory, SemVersion codeVersion) { - var uf = databaseFactory as UmbracoDatabaseFactory; // fixme - if (uf == null) throw new Exception("oops: db."); - using (var database = uf.CreateDatabase()) // no scope - just the database + using (var database = databaseFactory.CreateDatabase()) // no scope - just the database { var codeVersionString = codeVersion.ToString(); - var sql = database.Sql() + var sql = databaseFactory.Sql() .Select() .From() .Where(x => x.Name.InvariantEquals(GlobalSettings.UmbracoMigrationName) && x.Version == codeVersionString); diff --git a/src/Umbraco.Core/DatabaseBuilder.cs b/src/Umbraco.Core/DatabaseBuilder.cs index 4fc631c305..21b579e618 100644 --- a/src/Umbraco.Core/DatabaseBuilder.cs +++ b/src/Umbraco.Core/DatabaseBuilder.cs @@ -22,14 +22,14 @@ namespace Umbraco.Core /// public class DatabaseBuilder { - private readonly IDatabaseFactory _databaseFactory; + private readonly IUmbracoDatabaseFactory _databaseFactory; private readonly IRuntimeState _runtime; private readonly IMigrationEntryService _migrationEntryService; private readonly ILogger _logger; private DatabaseSchemaResult _databaseSchemaValidationResult; - public DatabaseBuilder(IDatabaseFactory databaseFactory, IRuntimeState runtime, IMigrationEntryService migrationEntryService, ILogger logger) + public DatabaseBuilder(IUmbracoDatabaseFactory databaseFactory, IRuntimeState runtime, IMigrationEntryService migrationEntryService, ILogger logger) { _databaseFactory = databaseFactory; _runtime = runtime; @@ -37,7 +37,7 @@ namespace Umbraco.Core _logger = logger; } - public UmbracoDatabase Database => _databaseFactory.GetDatabase(); + public IUmbracoDatabase Database => _databaseFactory.GetDatabase(); public ISqlSyntaxProvider SqlSyntax => _databaseFactory.SqlSyntax; @@ -103,7 +103,7 @@ namespace Umbraco.Core ConfigureEmbeddedDatabaseConnection(_databaseFactory, _logger); } - private static void ConfigureEmbeddedDatabaseConnection(IDatabaseFactory factory, ILogger logger) + private static void ConfigureEmbeddedDatabaseConnection(IUmbracoDatabaseFactory factory, ILogger logger) { SaveConnectionString(EmbeddedDatabaseConnectionString, Constants.DbProviderNames.SqlCe, logger); @@ -329,7 +329,7 @@ namespace Umbraco.Core #region Utils - internal static void GiveLegacyAChance(IDatabaseFactory factory, ILogger logger) + internal static void GiveLegacyAChance(IUmbracoDatabaseFactory factory, ILogger logger) { // look for the legacy appSettings key var legacyConnString = ConfigurationManager.AppSettings[GlobalSettings.UmbracoConnectionName]; diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index f5c8392bf3..6ba8762e53 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core /// public class DatabaseContext { - private readonly IDatabaseFactory _databaseFactory; + private readonly IUmbracoDatabaseFactory _databaseFactory; /// /// Initializes a new instance of the class. @@ -27,21 +27,13 @@ namespace Umbraco.Core /// Umbraco connection string is not available because we are installing. In which case this /// database builder must sort things out and configure the database factory before it can be /// used. - public DatabaseContext(IDatabaseFactory databaseFactory) + public DatabaseContext(IUmbracoDatabaseFactory databaseFactory) { if (databaseFactory == null) throw new ArgumentNullException(nameof(databaseFactory)); _databaseFactory = databaseFactory; } - // in most cases, this should not be used, keeping it here for compatibility (temp) - // todo: get rid of it - /// - /// Gets the query factory. - /// - /// In most cases this should not be used, better use Query{T}. - public IQueryFactory QueryFactory => _databaseFactory.QueryFactory; - /// /// Gets the database Sql syntax. /// @@ -55,18 +47,18 @@ namespace Umbraco.Core /// /// Creates a Sql statement. /// - public Sql Sql(string sql, params object[] args) => Sql().Append(sql, args); + public Sql Sql(string sql, params object[] args) => _databaseFactory.Sql(sql, args); /// /// Creates a Query expression. /// - public IQuery Query() => _databaseFactory.QueryFactory.Create(); + public IQuery Query() => _databaseFactory.Query(); /// /// Gets an ambient database for doing CRUD operations against custom tables that resides in the Umbraco database. /// /// Should not be used for operation against standard Umbraco tables; as services should be used instead. - public UmbracoDatabase Database => _databaseFactory.GetDatabase(); + public IUmbracoDatabase Database => _databaseFactory.GetDatabase(); /// /// Gets an ambient database scope. @@ -74,9 +66,7 @@ namespace Umbraco.Core /// A disposable object representing the scope. public IDisposable CreateDatabaseScope() // fixme - move over to factory { - var factory = _databaseFactory as UmbracoDatabaseFactory; // fixme - though... IDatabaseFactory? - if (factory == null) throw new NotSupportedException(); - return factory.CreateScope(); + return _databaseFactory.CreateScope(); } #if DEBUG_DATABASES diff --git a/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs b/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs index dd723f2eca..a0766d9e7b 100644 --- a/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs +++ b/src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs @@ -12,11 +12,11 @@ namespace Umbraco.Core.Persistence { public class DatabaseSchemaHelper { - private readonly UmbracoDatabase _database; + private readonly IUmbracoDatabase _database; private readonly ILogger _logger; private readonly BaseDataCreation _baseDataCreation; - public DatabaseSchemaHelper(UmbracoDatabase database, ILogger logger) + public DatabaseSchemaHelper(IUmbracoDatabase database, ILogger logger) { _database = database; _logger = logger; diff --git a/src/Umbraco.Core/Persistence/DatabaseScope.cs b/src/Umbraco.Core/Persistence/DatabaseScope.cs index 0fed6279ba..72d2f53a8f 100644 --- a/src/Umbraco.Core/Persistence/DatabaseScope.cs +++ b/src/Umbraco.Core/Persistence/DatabaseScope.cs @@ -3,19 +3,19 @@ using System.Threading; namespace Umbraco.Core.Persistence { - public class DatabaseScope : IDisposeOnRequestEnd // implies IDisposable + public class DatabaseScope : IDatabaseScope, IDisposeOnRequestEnd // implies IDisposable { private readonly DatabaseScope _parent; private readonly IDatabaseScopeAccessor _accessor; - private readonly UmbracoDatabaseFactory _factory; - private UmbracoDatabase _database; + private readonly IUmbracoDatabaseFactory _factory; + private IUmbracoDatabase _database; private bool _isParent; private int _disposed; private bool _disposeDatabase; // can specify a database to create a "substitute" scope eg for deploy - oh my - internal DatabaseScope(IDatabaseScopeAccessor accessor, UmbracoDatabaseFactory factory, UmbracoDatabase database = null) + internal DatabaseScope(IDatabaseScopeAccessor accessor, IUmbracoDatabaseFactory factory, IUmbracoDatabase database = null) { _accessor = accessor; _factory = factory; @@ -25,7 +25,7 @@ namespace Umbraco.Core.Persistence _accessor.Scope = this; } - public UmbracoDatabase Database + public IUmbracoDatabase Database { get { diff --git a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs index a3e2eeea68..ae53178563 100644 --- a/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs +++ b/src/Umbraco.Core/Persistence/DatabasenodeLockExtensions.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Persistence internal static class DatabaseNodeLockExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ValidateDatabase(UmbracoDatabase database) + private static void ValidateDatabase(IUmbracoDatabase database) { if (database == null) throw new ArgumentNullException("database"); @@ -20,7 +20,7 @@ namespace Umbraco.Core.Persistence // that record which will be kept until the transaction is ended, effectively locking // out all other accesses to that record - thus obtaining an exclusive lock over the // protected resources. - public static void AcquireLockNodeWriteLock(this UmbracoDatabase database, int nodeId) + public static void AcquireLockNodeWriteLock(this IUmbracoDatabase database, int nodeId) { ValidateDatabase(database); @@ -32,7 +32,7 @@ namespace Umbraco.Core.Persistence // that record which will be kept until the transaction is ended, effectively preventing // other write accesses to that record - thus obtaining a shared lock over the protected // resources. - public static void AcquireLockNodeReadLock(this UmbracoDatabase database, int nodeId) + public static void AcquireLockNodeReadLock(this IUmbracoDatabase database, int nodeId) { ValidateDatabase(database); diff --git a/src/Umbraco.Core/Persistence/IDatabaseContext.cs b/src/Umbraco.Core/Persistence/IDatabaseContext.cs new file mode 100644 index 0000000000..ec56d4d849 --- /dev/null +++ b/src/Umbraco.Core/Persistence/IDatabaseContext.cs @@ -0,0 +1,29 @@ +using NPoco; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence +{ + public interface IDatabaseContext + { + /// + /// Gets the database Sql syntax. + /// + ISqlSyntaxProvider SqlSyntax { get; } + + /// + /// Creates a new Sql expression. + /// + Sql Sql(); + + /// + /// Creates a new Sql expression. + /// + Sql Sql(string sql, params object[] args); + + /// + /// Creates a new query expression. + /// + IQuery Query(); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/IDatabaseFactory.cs b/src/Umbraco.Core/Persistence/IDatabaseFactory.cs deleted file mode 100644 index ab563b9493..0000000000 --- a/src/Umbraco.Core/Persistence/IDatabaseFactory.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using NPoco; -using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.SqlSyntax; - -namespace Umbraco.Core.Persistence -{ - /// - /// Creates and manages the "ambient" database. - /// - public interface IDatabaseFactory : IDisposable - { - /// - /// Gets (creates or retrieves) the "ambient" database connection. - /// - /// The "ambient" database connection. - UmbracoDatabase GetDatabase(); - - void Configure(string connectionString, string providerName); - - bool Configured { get; } - - bool CanConnect { get; } - - IQueryFactory QueryFactory { get; } - - ISqlSyntaxProvider SqlSyntax { get; } - - Sql Sql(); - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/IDatabaseScope.cs b/src/Umbraco.Core/Persistence/IDatabaseScope.cs new file mode 100644 index 0000000000..c9566b07a4 --- /dev/null +++ b/src/Umbraco.Core/Persistence/IDatabaseScope.cs @@ -0,0 +1,12 @@ +using System; + +namespace Umbraco.Core.Persistence +{ + /// + /// Represents a database scope. + /// + public interface IDatabaseScope : IDisposable + { + IUmbracoDatabase Database { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/IUmbracoDatabase.cs b/src/Umbraco.Core/Persistence/IUmbracoDatabase.cs new file mode 100644 index 0000000000..113e028f66 --- /dev/null +++ b/src/Umbraco.Core/Persistence/IUmbracoDatabase.cs @@ -0,0 +1,25 @@ +using NPoco; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence +{ + public interface IUmbracoDatabase : IDatabase + { + /// + /// Gets the database Sql syntax. + /// + ISqlSyntaxProvider SqlSyntax { get; } // fixme - kill + + /// + /// Gets the Sql context. + /// + SqlContext SqlContext { get; } + + /// + /// Gets the database instance unique identifier as a string. + /// + /// UmbracoDatabase returns the first eight digits of its unique Guid and, in some + /// debug mode, the underlying database connection identifier (if any). + string InstanceId { get; } + } +} diff --git a/src/Umbraco.Core/Persistence/IUmbracoDatabaseConfig.cs b/src/Umbraco.Core/Persistence/IUmbracoDatabaseConfig.cs deleted file mode 100644 index 89ce2b7863..0000000000 --- a/src/Umbraco.Core/Persistence/IUmbracoDatabaseConfig.cs +++ /dev/null @@ -1,13 +0,0 @@ -using NPoco; -using Umbraco.Core.Persistence.SqlSyntax; - -namespace Umbraco.Core.Persistence -{ - public interface IUmbracoDatabaseConfig : IDatabaseConfig - { - /// - /// The Umbraco SqlSyntax used to handle different syntaxes in the different database providers. - /// - ISqlSyntaxProvider SqlSyntax { get; } - } -} diff --git a/src/Umbraco.Core/Persistence/IUmbracoDatabaseFactory.cs b/src/Umbraco.Core/Persistence/IUmbracoDatabaseFactory.cs new file mode 100644 index 0000000000..8384ef9346 --- /dev/null +++ b/src/Umbraco.Core/Persistence/IUmbracoDatabaseFactory.cs @@ -0,0 +1,57 @@ +using System; + +namespace Umbraco.Core.Persistence +{ + /// + /// Creates and manages the "ambient" database. + /// + public interface IUmbracoDatabaseFactory : IDatabaseContext, IDisposable + { + /// + /// Gets (creates if needed) the ambient database. + /// + /// There is no ambient database scope. + /// The ambient database is the database owned by the ambient scope. It should not + /// be disposed, as the scope takes care of disposing it when appropriate. + IUmbracoDatabase GetDatabase(); + + /// + /// Gets (creates if needed) the ambient database. + /// + /// This is just a shortcut to GetDatabase. + IUmbracoDatabase Database { get; } // fixme keep? + + /// + /// Creates a new database. + /// + /// The new database is not part of any scope and must be disposed after being used. + IUmbracoDatabase CreateDatabase(); + + /// + /// Creates a new database scope. + /// + /// A database for the scope. + /// + /// The new database scope becomes the ambient scope and may be nested under + /// an already existing ambient scope. + /// In most cases, should be null. It can be used to force the temporary + /// usage of another database instance. Use with care. + /// + IDatabaseScope CreateScope(IUmbracoDatabase database = null); + + /// + /// Gets a value indicating whether the database factory is configured. + /// + bool Configured { get; } + + /// + /// Gets a value indicating whether the database can connect. + /// + bool CanConnect { get; } + + /// + /// Configures the database factory. + /// + void Configure(string connectionString, string providerName); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/ILocalMigration.cs b/src/Umbraco.Core/Persistence/Migrations/ILocalMigration.cs new file mode 100644 index 0000000000..c15b7fdf66 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Migrations/ILocalMigration.cs @@ -0,0 +1,16 @@ +using Umbraco.Core.Persistence.Migrations.Syntax.Alter; +using Umbraco.Core.Persistence.Migrations.Syntax.Create; +using Umbraco.Core.Persistence.Migrations.Syntax.Delete; +using Umbraco.Core.Persistence.Migrations.Syntax.Execute; + +namespace Umbraco.Core.Persistence.Migrations +{ + public interface ILocalMigration + { + IExecuteBuilder Execute { get; } + IDeleteBuilder Delete { get; } + IAlterSyntaxBuilder Alter { get; } + ICreateBuilder Create { get; } + string GetSql(); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/IMigrationContext.cs b/src/Umbraco.Core/Persistence/Migrations/IMigrationContext.cs index 2e750b4108..44f758faea 100644 --- a/src/Umbraco.Core/Persistence/Migrations/IMigrationContext.cs +++ b/src/Umbraco.Core/Persistence/Migrations/IMigrationContext.cs @@ -3,12 +3,14 @@ using Umbraco.Core.Logging; namespace Umbraco.Core.Persistence.Migrations { - public interface IMigrationContext + public interface IMigrationContext : IDatabaseContext { - UmbracoDatabase Database { get; } + IUmbracoDatabase Database { get; } ICollection Expressions { get; set; } ILogger Logger { get; } + + ILocalMigration GetLocalMigration(); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs b/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs index b5340832b5..97a3f09fad 100644 --- a/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/IMigrationExpression.cs @@ -7,6 +7,6 @@ namespace Umbraco.Core.Persistence.Migrations /// public interface IMigrationExpression { - string Process(UmbracoDatabase database); + string Process(IUmbracoDatabase database); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs index 7d7b869a4a..9756a30b64 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs @@ -11,10 +11,10 @@ namespace Umbraco.Core.Persistence.Migrations.Initial /// internal class BaseDataCreation { - private readonly Database _database; + private readonly IDatabase _database; private readonly ILogger _logger; - public BaseDataCreation(Database database, ILogger logger) + public BaseDataCreation(IDatabase database, ILogger logger) { _database = database; _logger = logger; diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs index 4aa2cb9289..58cc7a2c0e 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial internal class DatabaseSchemaCreation { private readonly DatabaseSchemaHelper _schemaHelper; - private readonly UmbracoDatabase _database; + private readonly IUmbracoDatabase _database; private readonly ILogger _logger; /// @@ -24,7 +24,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial /// /// /// - public DatabaseSchemaCreation(UmbracoDatabase database, ILogger logger) + public DatabaseSchemaCreation(IUmbracoDatabase database, ILogger logger) { _database = database; _logger = logger; diff --git a/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs b/src/Umbraco.Core/Persistence/Migrations/LocalMigration.cs similarity index 87% rename from src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs rename to src/Umbraco.Core/Persistence/Migrations/LocalMigration.cs index e53cc7b143..c6509c1a3b 100644 --- a/src/Umbraco.Core/Persistence/Migrations/LocalMigrationContext.cs +++ b/src/Umbraco.Core/Persistence/Migrations/LocalMigration.cs @@ -8,9 +8,9 @@ using Umbraco.Core.Persistence.Migrations.Syntax.Execute; namespace Umbraco.Core.Persistence.Migrations { - internal class LocalMigrationContext : MigrationContext + internal class LocalMigration : MigrationContext, ILocalMigration { - public LocalMigrationContext(UmbracoDatabase database, ILogger logger) + public LocalMigration(IUmbracoDatabase database, ILogger logger) : base(database, logger) { } diff --git a/src/Umbraco.Core/Persistence/Migrations/MigrationBase.cs b/src/Umbraco.Core/Persistence/Migrations/MigrationBase.cs index 73e32554ca..4ea8696316 100644 --- a/src/Umbraco.Core/Persistence/Migrations/MigrationBase.cs +++ b/src/Umbraco.Core/Persistence/Migrations/MigrationBase.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Persistence.Migrations { public abstract class MigrationBase : IMigration { - public ISqlSyntaxProvider SqlSyntax => Context.Database.SqlSyntax; + public ISqlSyntaxProvider SqlSyntax => Context.SqlSyntax; public DatabaseType DatabaseType => Context.Database.DatabaseType; @@ -44,7 +44,9 @@ namespace Umbraco.Core.Persistence.Migrations public IUpdateBuilder Update => new UpdateBuilder(Context); - protected Sql Sql() => Context.Database.Sql(); + protected Sql Sql() => Context.Sql(); + + protected Sql Sql(string sql, params object[] args) => Context.Sql(sql, args); public IIfDatabaseBuilder IfDatabase(params DatabaseType[] supportedDatabaseTypes) { diff --git a/src/Umbraco.Core/Persistence/Migrations/MigrationContext.cs b/src/Umbraco.Core/Persistence/Migrations/MigrationContext.cs index 486cd87f12..cfd1a1304a 100644 --- a/src/Umbraco.Core/Persistence/Migrations/MigrationContext.cs +++ b/src/Umbraco.Core/Persistence/Migrations/MigrationContext.cs @@ -3,13 +3,14 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using NPoco; using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations { internal class MigrationContext : IMigrationContext { - public MigrationContext(UmbracoDatabase database, ILogger logger) + public MigrationContext(IUmbracoDatabase database, ILogger logger) { if (database == null) throw new ArgumentNullException(nameof(database)); if (logger == null) throw new ArgumentNullException(nameof(logger)); @@ -21,12 +22,20 @@ namespace Umbraco.Core.Persistence.Migrations public ICollection Expressions { get; set; } - public UmbracoDatabase Database { get; } + public IUmbracoDatabase Database { get; } public ISqlSyntaxProvider SqlSyntax => Database.SqlSyntax; + public Sql Sql() => new Sql(Database.SqlContext); + + public Sql Sql(string sql, params object[] args) => new Sql(Database.SqlContext, sql, args); + + public IQuery Query() => new Query(Database.SqlContext); + public DatabaseType DatabaseType => Database.DatabaseType; public ILogger Logger { get; } + + public ILocalMigration GetLocalMigration() => new LocalMigration(Database, Logger); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs index b39402adba..b2cea511a4 100644 --- a/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Core/Persistence/Migrations/MigrationExpressionBase.cs @@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence.Migrations || SupportedDatabaseTypes.Any(x => CurrentDatabaseType.GetType().Inherits(x.GetType())); } - public virtual string Process(UmbracoDatabase database) + public virtual string Process(IUmbracoDatabase database) { return ToString(); } diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs index b9f80b0638..ef33968709 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/ExecuteBuilder.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute _context.Expressions.Add(expression); } - public void Code(Func codeStatement) + public void Code(Func codeStatement) { var expression = new ExecuteCodeStatementExpression(_context, _supportedDatabaseTypes) { CodeStatement = codeStatement }; _context.Expressions.Add(expression); diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs index aa4c69d914..aec042298d 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs @@ -9,9 +9,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute.Expressions : base(context, supportedDatabaseTypes) { } - public virtual Func CodeStatement { get; set; } + public virtual Func CodeStatement { get; set; } - public override string Process(UmbracoDatabase database) + public override string Process(IUmbracoDatabase database) { if(CodeStatement != null) return CodeStatement(database); diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs index 41dfe1ac3b..cf81266caf 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Execute/IExecuteBuilder.cs @@ -1,11 +1,10 @@ using System; -using NPoco; namespace Umbraco.Core.Persistence.Migrations.Syntax.Execute { public interface IExecuteBuilder : IFluentSyntax { void Sql(string sqlStatement); - void Code(Func codeStatement); + void Code(Func codeStatement); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs index a1e9a7b72a..fe620fbe9e 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs @@ -13,7 +13,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions public virtual string OldName { get; set; } public virtual string NewName { get; set; } - public override string Process(UmbracoDatabase database) + public override string Process(IUmbracoDatabase database) { if (CurrentDatabaseType.IsMySql()) { diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionEight/AddRedirectUrlTable.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionEight/AddRedirectUrlTable.cs index af264c5503..42c9f7a276 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionEight/AddRedirectUrlTable.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionEight/AddRedirectUrlTable.cs @@ -16,10 +16,10 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionEight Execute.Code(MigrationCode); } - private string MigrationCode(UmbracoDatabase database) + private string MigrationCode(IUmbracoDatabase database) { var umbracoRedirectUrlTableName = "umbracoRedirectUrl"; - var localContext = new LocalMigrationContext(database, Logger); + var local = Context.GetLocalMigration(); var tables = SqlSyntax.GetTablesInSchema(database).ToArray(); @@ -28,17 +28,17 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionEight var columns = SqlSyntax.GetColumnsInSchema(database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals(umbracoRedirectUrlTableName) && x.ColumnName.InvariantEquals("id") && x.DataType == "uniqueidentifier")) return null; - localContext.Delete.Table(umbracoRedirectUrlTableName); + local.Delete.Table(umbracoRedirectUrlTableName); } - localContext.Create.Table(umbracoRedirectUrlTableName) + local.Create.Table(umbracoRedirectUrlTableName) .WithColumn("id").AsGuid().NotNullable().PrimaryKey("PK_" + umbracoRedirectUrlTableName) .WithColumn("createDateUtc").AsDateTime().NotNullable() .WithColumn("url").AsString(2048).NotNullable() .WithColumn("contentKey").AsGuid().NotNullable() .WithColumn("urlHash").AsString(40).NotNullable(); - localContext.Create.Index("IX_" + umbracoRedirectUrlTableName).OnTable(umbracoRedirectUrlTableName) + local.Create.Index("IX_" + umbracoRedirectUrlTableName).OnTable(umbracoRedirectUrlTableName) .OnColumn("urlHash") .Ascending() .OnColumn("contentKey") @@ -47,11 +47,11 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionEight .Descending() .WithOptions().NonClustered(); - localContext.Create.ForeignKey("FK_" + umbracoRedirectUrlTableName) + local.Create.ForeignKey("FK_" + umbracoRedirectUrlTableName) .FromTable(umbracoRedirectUrlTableName).ForeignColumn("contentKey") .ToTable("umbracoNode").PrimaryColumn("uniqueID"); - return localContext.GetSql(); + return local.GetSql(); } public override void Down() diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterCmsMacroPropertyTable.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterCmsMacroPropertyTable.cs index 7f758c6c36..747d29d6cf 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterCmsMacroPropertyTable.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/AlterCmsMacroPropertyTable.cs @@ -41,7 +41,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSeven //If we are on SQLServer, we need to delete default constraints by name, older versions of umbraco did not name these default constraints // consistently so we need to look up the constraint name to delete, this only pertains to SQL Server and this issue: // http://issues.umbraco.org/issue/U4-4133 - var sqlServerSyntaxProvider = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlServerSyntaxProvider = new SqlServerSyntaxProvider(new Lazy(() => null)); var defaultConstraints = sqlServerSyntaxProvider.GetDefaultConstraintsPerColumn(Context.Database).Distinct(); //lookup the constraint we want to delete, normally would be called "DF_cmsMacroProperty_macroPropertyHidden" but diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs index b9e636bcf9..8baf88c451 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSeven/UpdateRelatedLinksData.cs @@ -30,7 +30,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSeven Execute.Code(UpdateRelatedLinksDataDo); } - public string UpdateRelatedLinksDataDo(Database database) + public string UpdateRelatedLinksDataDo(IDatabase database) { if (database != null) { @@ -133,7 +133,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSeven throw new DataLossException("Cannot downgrade from a version 7 database to a prior version, the database schema has already been modified"); } - private static void UpdateXmlTable(List propertyTypes, dynamic data, List cmsContentXmlEntries, Database database) + private static void UpdateXmlTable(List propertyTypes, dynamic data, List cmsContentXmlEntries, IDatabase database) { //now we need to update the cmsContentXml table var propertyType = propertyTypes.SingleOrDefault(x => x.Id == data.propertytypeid); diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs index 3b855fbc25..f0365b3578 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs @@ -23,32 +23,31 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer Execute.Code(MigrationCode); } - private string MigrationCode(UmbracoDatabase database) + private string MigrationCode(IUmbracoDatabase database) { - var localContext = new LocalMigrationContext(database, Logger); + var local = Context.GetLocalMigration(); //Clear all stylesheet data if the tables exist var tables = SqlSyntax.GetTablesInSchema(Context.Database).ToArray(); if (tables.InvariantContains("cmsStylesheetProperty")) { - localContext.Delete.FromTable("cmsStylesheetProperty").AllRows(); - localContext.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = new Guid(Constants.ObjectTypes.StylesheetProperty) }); + local.Delete.FromTable("cmsStylesheetProperty").AllRows(); + local.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = new Guid(Constants.ObjectTypes.StylesheetProperty) }); - localContext.Delete.Table("cmsStylesheetProperty"); + local.Delete.Table("cmsStylesheetProperty"); } if (tables.InvariantContains("cmsStylesheet")) { - localContext.Delete.FromTable("cmsStylesheet").AllRows(); - localContext.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = new Guid(Constants.ObjectTypes.Stylesheet) }); + local.Delete.FromTable("cmsStylesheet").AllRows(); + local.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = new Guid(Constants.ObjectTypes.Stylesheet) }); - localContext.Delete.Table("cmsStylesheet"); + local.Delete.Table("cmsStylesheet"); } - return localContext.GetSql(); + return local.GetSql(); } public override void Down() - { - } + { } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/UpdateUniqueIndexOnCmsPropertyData.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/UpdateUniqueIndexOnCmsPropertyData.cs index b968e8ea58..a9788ef3ae 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/UpdateUniqueIndexOnCmsPropertyData.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFiveZero/UpdateUniqueIndexOnCmsPropertyData.cs @@ -41,7 +41,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFiveZer var delPropQry = SqlSyntax.GetDeleteSubquery( "cmsPropertyData", "id", - Context.Database.Sql("SELECT MIN(id) FROM cmsPropertyData GROUP BY contentNodeId, versionId, propertytypeid HAVING MIN(id) IS NOT NULL"), + Sql("SELECT MIN(id) FROM cmsPropertyData GROUP BY contentNodeId, versionId, propertytypeid HAVING MIN(id) IS NOT NULL"), WhereInType.NotIn); Execute.Sql(delPropQry.SQL); } diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs index 97e1669f71..4537eb8523 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/AddUniqueIdPropertyTypeGroupColumn.cs @@ -39,7 +39,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFourZer } } - private static string UpdateGuids(Database database) + private static string UpdateGuids(IDatabase database) { var updates = new List>(); diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/EnsureContentTypeUniqueIdsAreConsistent.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/EnsureContentTypeUniqueIdsAreConsistent.cs index 30b981ae7b..107560a3f2 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/EnsureContentTypeUniqueIdsAreConsistent.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourZero/EnsureContentTypeUniqueIdsAreConsistent.cs @@ -28,7 +28,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFourZer Constants.ObjectTypes.MemberTypeGuid, }; - var sql = Context.Database.Sql() + var sql = Context.Sql() .Select("umbracoNode.id,cmsContentType.alias,umbracoNode.nodeObjectType") .From() .InnerJoin() diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AddChangeDocumentTypePermission.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AddChangeDocumentTypePermission.cs index 7a3d67ce1d..b87626eb8e 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AddChangeDocumentTypePermission.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/AddChangeDocumentTypePermission.cs @@ -26,7 +26,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSixTwoZero Execute.Code(UndoChangeDocumentTypePermissionDo); } - private static string AddChangeDocumentTypePermissionDo(Database database) + private static string AddChangeDocumentTypePermissionDo(IDatabase database) { var adminUserType = database.Fetch("WHERE Id = 1").FirstOrDefault(); @@ -42,7 +42,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSixTwoZero return string.Empty; } - private static string UndoChangeDocumentTypePermissionDo(Database database) + private static string UndoChangeDocumentTypePermissionDo(IDatabase database) { var adminUserType = database.Fetch("WHERE Id = 1").FirstOrDefault(); diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/UpdateToNewMemberPropertyAliases.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/UpdateToNewMemberPropertyAliases.cs index 88cbfb59af..788a382c42 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/UpdateToNewMemberPropertyAliases.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixTwoZero/UpdateToNewMemberPropertyAliases.cs @@ -21,7 +21,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSixTwoZero Execute.Code(Update); } - internal string Update(Database database) + internal string Update(IDatabase database) { if (database != null) { diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixZeroOne/UpdatePropertyTypesAndGroups.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixZeroOne/UpdatePropertyTypesAndGroups.cs index 1dd428f922..9ffc0bb93c 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixZeroOne/UpdatePropertyTypesAndGroups.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSixZeroOne/UpdatePropertyTypesAndGroups.cs @@ -26,7 +26,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSixZeroOne } - public static string UpdatePropertyTypesAndGroupsDo(Database database) + public static string UpdatePropertyTypesAndGroupsDo(IDatabase database) { if (database != null) { diff --git a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs index c50e22aaee..9b7ede89f0 100644 --- a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs +++ b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs @@ -73,7 +73,7 @@ namespace Umbraco.Core.Persistence /// Note that with proper transactions, if T2 begins after T1 then we are sure that the database will contain T2's value /// once T1 and T2 have completed. Whereas here, it could contain T1's value. /// - internal static RecordPersistenceType InsertOrUpdate(this IDatabase db, T poco) + internal static RecordPersistenceType InsertOrUpdate(this IUmbracoDatabase db, T poco) where T : class { return db.InsertOrUpdate(poco, null, null); @@ -96,7 +96,7 @@ namespace Umbraco.Core.Persistence /// Note that with proper transactions, if T2 begins after T1 then we are sure that the database will contain T2's value /// once T1 and T2 have completed. Whereas here, it could contain T1's value. /// - internal static RecordPersistenceType InsertOrUpdate(this IDatabase db, + internal static RecordPersistenceType InsertOrUpdate(this IUmbracoDatabase db, T poco, string updateCommand, object updateArgs) @@ -168,7 +168,7 @@ namespace Umbraco.Core.Persistence /// The database. /// The records. /// Whether to use native bulk insert when available. - public static void BulkInsertRecordsWithTransaction(this Database database, IEnumerable records, bool useNativeBulkInsert = true) + public static void BulkInsertRecordsWithTransaction(this IUmbracoDatabase database, IEnumerable records, bool useNativeBulkInsert = true) { var recordsA = records.ToArray(); if (recordsA.Length == 0) @@ -190,7 +190,7 @@ namespace Umbraco.Core.Persistence /// The records. /// Whether to use native bulk insert when available. /// The number of records that were inserted. - public static int BulkInsertRecords(this Database database, IEnumerable records, bool useNativeBulkInsert = true) + public static int BulkInsertRecords(this IUmbracoDatabase database, IEnumerable records, bool useNativeBulkInsert = true) { var recordsA = records.ToArray(); if (recordsA.Length == 0) return 0; @@ -227,7 +227,7 @@ namespace Umbraco.Core.Persistence /// The database. /// The records. /// The number of records that were inserted. - private static int BulkInsertRecordsWithCommands(Database database, T[] records) + private static int BulkInsertRecordsWithCommands(IUmbracoDatabase database, T[] records) { foreach (var command in database.GenerateBulkInsertCommands(records)) command.ExecuteNonQuery(); @@ -242,7 +242,7 @@ namespace Umbraco.Core.Persistence /// The database. /// The records. /// The sql commands to execute. - internal static IDbCommand[] GenerateBulkInsertCommands(this Database database, T[] records) + internal static IDbCommand[] GenerateBulkInsertCommands(this IUmbracoDatabase database, T[] records) { var pocoData = database.PocoDataFactory.ForType(typeof(T)); @@ -313,7 +313,7 @@ namespace Umbraco.Core.Persistence /// The PocoData object corresponding to the record's type. /// The records. /// The number of records that were inserted. - internal static int BulkInsertRecordsSqlCe(Database database, PocoData pocoData, IEnumerable records) + internal static int BulkInsertRecordsSqlCe(IUmbracoDatabase database, PocoData pocoData, IEnumerable records) { var columns = pocoData.Columns.ToArray(); @@ -363,7 +363,7 @@ namespace Umbraco.Core.Persistence /// The PocoData object corresponding to the record's type. /// The records. /// The number of records that were inserted. - internal static int BulkInsertRecordsSqlServer(Database database, PocoData pocoData, IEnumerable records) + internal static int BulkInsertRecordsSqlServer(IUmbracoDatabase database, PocoData pocoData, IEnumerable records) { // create command against the original database.Connection using (var command = database.CreateCommand(database.Connection, CommandType.Text, string.Empty)) @@ -373,9 +373,7 @@ namespace Umbraco.Core.Persistence var tTransaction = GetTypedTransaction(command.Transaction); var tableName = pocoData.TableInfo.TableName; - var umbracoDatabase = database as UmbracoDatabase; - if (umbracoDatabase == null) throw new NotSupportedException("Database must be UmbracoDatabase."); - var syntax = umbracoDatabase.SqlSyntax as SqlServerSyntaxProvider; + var syntax = database.SqlSyntax as SqlServerSyntaxProvider; if (syntax == null) throw new NotSupportedException("SqlSyntax must be SqlServerSyntaxProvider."); using (var copy = new SqlBulkCopy(tConnection, SqlBulkCopyOptions.Default, tTransaction) { BulkCopyTimeout = 10000, DestinationTableName = tableName }) diff --git a/src/Umbraco.Core/Persistence/Querying/IQueryFactory.cs b/src/Umbraco.Core/Persistence/Querying/IQueryFactory.cs deleted file mode 100644 index e044425e57..0000000000 --- a/src/Umbraco.Core/Persistence/Querying/IQueryFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Persistence.SqlSyntax; - -namespace Umbraco.Core.Persistence.Querying -{ - public interface IQueryFactory - { - IMapperCollection Mappers { get; } - ISqlSyntaxProvider SqlSyntax { get; } - IQuery Create(); - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Querying/Query.cs b/src/Umbraco.Core/Persistence/Querying/Query.cs index 690c5a110e..529a11e5a3 100644 --- a/src/Umbraco.Core/Persistence/Querying/Query.cs +++ b/src/Umbraco.Core/Persistence/Querying/Query.cs @@ -23,6 +23,12 @@ namespace Umbraco.Core.Persistence.Querying _mappers = mappers; } + public Query(SqlContext sqlContext) + { + _sqlSyntax = sqlContext.SqlSyntax; + _mappers = sqlContext.Mappers; + } + /// /// Adds a where clause to the query /// diff --git a/src/Umbraco.Core/Persistence/Querying/QueryFactory.cs b/src/Umbraco.Core/Persistence/Querying/QueryFactory.cs deleted file mode 100644 index a16355f9d7..0000000000 --- a/src/Umbraco.Core/Persistence/Querying/QueryFactory.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Persistence.SqlSyntax; - -namespace Umbraco.Core.Persistence.Querying -{ - public class QueryFactory : IQueryFactory - { - public ISqlSyntaxProvider SqlSyntax { get; } - public IMapperCollection Mappers { get; } - - public QueryFactory(ISqlSyntaxProvider sqlSyntax, IMapperCollection mappers) - { - SqlSyntax = sqlSyntax; - Mappers = mappers; - } - - public IQuery Create() - { - return new Query(SqlSyntax, Mappers); - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 1ea88d2d75..9ab2e0b525 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -43,7 +43,7 @@ namespace Umbraco.Core.Persistence.Repositories _tagRepository = tagRepository; _cacheHelper = cacheHelper; - _publishedQuery = work.DatabaseContext.Query().Where(x => x.Published); + _publishedQuery = work.Query().Where(x => x.Published); EnsureUniqueNaming = true; } diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepositoryBase.cs index e64a05165f..7f2e3329e7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepositoryBase.cs @@ -15,7 +15,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; -using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; @@ -630,7 +629,7 @@ AND umbracoNode.id <> @id", } public static IEnumerable GetMediaTypes( - Database db, ISqlSyntaxProvider sqlSyntax, + IDatabase db, ISqlSyntaxProvider sqlSyntax, TRepo contentTypeRepository) where TRepo : IReadRepository { @@ -644,7 +643,7 @@ AND umbracoNode.id <> @id", } public static IEnumerable GetContentTypes( - Database db, ISqlSyntaxProvider sqlSyntax, + IDatabase db, ISqlSyntaxProvider sqlSyntax, TRepo contentTypeRepository, ITemplateRepository templateRepository) where TRepo : IReadRepository @@ -667,7 +666,7 @@ AND umbracoNode.id <> @id", } internal static void MapContentTypeChildren(IContentTypeComposition[] contentTypes, - Database db, ISqlSyntaxProvider sqlSyntax, + IDatabase db, ISqlSyntaxProvider sqlSyntax, TRepo contentTypeRepository, IDictionary> allParentContentTypeIds) where TRepo : IReadRepository @@ -721,7 +720,7 @@ AND umbracoNode.id <> @id", } internal static void MapContentTypeTemplates(IContentType[] contentTypes, - Database db, + IDatabase db, TRepo contentTypeRepository, ITemplateRepository templateRepository, IDictionary> associatedTemplates) @@ -756,7 +755,7 @@ AND umbracoNode.id <> @id", } - internal static IEnumerable MapMediaTypes(Database db, ISqlSyntaxProvider sqlSyntax, + internal static IEnumerable MapMediaTypes(IDatabase db, ISqlSyntaxProvider sqlSyntax, out IDictionary> parentMediaTypeIds) { Mandate.ParameterNotNull(db, "db"); @@ -894,7 +893,7 @@ AND umbracoNode.id <> @id", return mediaType; } - internal static IEnumerable MapContentTypes(Database db, ISqlSyntaxProvider sqlSyntax, + internal static IEnumerable MapContentTypes(IDatabase db, ISqlSyntaxProvider sqlSyntax, out IDictionary> associatedTemplates, out IDictionary> parentContentTypeIds) { @@ -1081,7 +1080,7 @@ AND umbracoNode.id <> @id", return contentType; } - internal static void MapGroupsAndProperties(int[] contentTypeIds, Database db, ISqlSyntaxProvider sqlSyntax, + internal static void MapGroupsAndProperties(int[] contentTypeIds, IDatabase db, ISqlSyntaxProvider sqlSyntax, out IDictionary allPropertyTypeCollection, out IDictionary allPropertyGroupCollection) { diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index 3354fc3f96..5d3de6fc4b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -31,9 +31,9 @@ namespace Umbraco.Core.Persistence.Repositories #region Query Methods - public IQuery Query => UnitOfWork.DatabaseContext.Query(); + public IQuery Query => UnitOfWork.Query(); - public Sql Sql() { return UnitOfWork.Database.Sql();} + public Sql Sql() => UnitOfWork.Sql(); public IUmbracoEntity GetByKey(Guid key) { diff --git a/src/Umbraco.Core/Persistence/Repositories/NPocoRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/NPocoRepositoryBase.cs index 2c28ab294f..a16b9ea576 100644 --- a/src/Umbraco.Core/Persistence/Repositories/NPocoRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/NPocoRepositoryBase.cs @@ -36,23 +36,23 @@ namespace Umbraco.Core.Persistence.Repositories /// /// Gets the repository's database. /// - protected UmbracoDatabase Database => UnitOfWork.Database; + protected IUmbracoDatabase Database => UnitOfWork.Database; /// /// Gets the repository's database sql syntax. /// - public ISqlSyntaxProvider SqlSyntax => UnitOfWork.DatabaseContext.SqlSyntax; + public ISqlSyntaxProvider SqlSyntax => UnitOfWork.SqlSyntax; /// /// Creates a new query. /// - public override IQuery Query() => UnitOfWork.DatabaseContext.Query(); + public override IQuery Query() => UnitOfWork.Query(); /// /// Creates a new Sql statement. /// /// A new Sql statement. - protected Sql Sql() => UnitOfWork.DatabaseContext.Sql(); + protected Sql Sql() => UnitOfWork.Sql(); #region Abstract Methods diff --git a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs index 2a7ef57442..8d57d96438 100644 --- a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs @@ -23,7 +23,7 @@ namespace Umbraco.Core.Persistence.Repositories public IEnumerable GetUsersNotifications(IEnumerable userIds, string action, IEnumerable nodeIds, Guid objectType) { var nodeIdsA = nodeIds.ToArray(); - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .Select("DISTINCT umbracoNode.id nodeId, umbracoUser.id userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin().On(left => left.NodeId, right => right.NodeId) @@ -42,7 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories public IEnumerable GetUserNotifications(IUser user) { - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .Select("DISTINCT umbracoNode.id, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin() @@ -63,7 +63,7 @@ namespace Umbraco.Core.Persistence.Repositories public IEnumerable GetEntityNotifications(IEntity entity) { - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .Select("DISTINCT umbracoNode.id, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin() @@ -94,7 +94,7 @@ namespace Umbraco.Core.Persistence.Repositories public Notification CreateNotification(IUser user, IEntity entity, string action) { - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .Select("DISTINCT nodeObjectType") .From() .Where(nodeDto => nodeDto.NodeId == entity.Id); diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index 3fb3d51609..e83c65c592 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -32,7 +32,7 @@ namespace Umbraco.Core.Persistence.Repositories _runtimeCache = cache.IsolatedRuntimeCache.GetOrCreateCache(); } - private ISqlSyntaxProvider SqlSyntax => _unitOfWork.Database.SqlSyntax; + private ISqlSyntaxProvider SqlSyntax => _unitOfWork.SqlSyntax; /// /// Returns permissions for a given user for any number of nodes @@ -75,7 +75,7 @@ namespace Umbraco.Core.Persistence.Repositories whereBuilder.Append(")"); } - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .SelectAll() .From() .Where(whereBuilder.ToString()); @@ -100,7 +100,7 @@ namespace Umbraco.Core.Persistence.Repositories /// public IEnumerable GetPermissionsForEntity(int entityId) { - var sql = _unitOfWork.Database.Sql() + var sql = _unitOfWork.Sql() .SelectAll() .From() .Where(dto => dto.NodeId == entityId) diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index 51907016eb..0872650e54 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -5,6 +5,7 @@ using System.Linq.Expressions; using NPoco; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.DI; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; @@ -26,12 +27,14 @@ namespace Umbraco.Core.Persistence.Repositories { private readonly IUserTypeRepository _userTypeRepository; private readonly CacheHelper _cacheHelper; + private readonly IMapperCollection _mapperCollection; private PermissionRepository _permissionRepository; - public UserRepository(IDatabaseUnitOfWork work, CacheHelper cacheHelper, ILogger logger, IUserTypeRepository userTypeRepository) + public UserRepository(IDatabaseUnitOfWork work, CacheHelper cacheHelper, ILogger logger, IUserTypeRepository userTypeRepository, IMapperCollection mapperCollection) : base(work, cacheHelper, logger) { _userTypeRepository = userTypeRepository; + _mapperCollection = mapperCollection; _cacheHelper = cacheHelper; } @@ -332,9 +335,8 @@ namespace Umbraco.Core.Persistence.Repositories if (orderBy == null) throw new ArgumentNullException(nameof(orderBy)); // get the referenced column name and find the corresp mapped column name - var queryFactory = UnitOfWork.DatabaseContext.QueryFactory; var expressionMember = ExpressionHelper.GetMemberInfo(orderBy); - var mapper = queryFactory.Mappers[typeof(IUser)]; + var mapper = _mapperCollection[typeof(IUser)]; var mappedField = mapper.Map(SqlSyntax, expressionMember.Name); if (mappedField.IsNullOrWhiteSpace()) diff --git a/src/Umbraco.Core/Persistence/SqlContext.cs b/src/Umbraco.Core/Persistence/SqlContext.cs index f0d8dd8326..93f2f41da7 100644 --- a/src/Umbraco.Core/Persistence/SqlContext.cs +++ b/src/Umbraco.Core/Persistence/SqlContext.cs @@ -1,28 +1,26 @@ using System; +using System.Linq; using NPoco; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence { public class SqlContext { - public SqlContext(ISqlSyntaxProvider sqlSyntax, IPocoDataFactory pocoDataFactory, DatabaseType databaseType) + public SqlContext(ISqlSyntaxProvider sqlSyntax, IPocoDataFactory pocoDataFactory, DatabaseType databaseType, IMapperCollection mappers = null) { if (sqlSyntax == null) throw new ArgumentNullException(nameof(sqlSyntax)); if (pocoDataFactory == null) throw new ArgumentNullException(nameof(pocoDataFactory)); if (databaseType == null) throw new ArgumentNullException(nameof(databaseType)); + + // for tests + if (mappers == null) mappers = new Mappers.MapperCollection(Enumerable.Empty()); SqlSyntax = sqlSyntax; PocoDataFactory = pocoDataFactory; DatabaseType = databaseType; - } - - public SqlContext(IUmbracoDatabaseConfig database) - { - if (database == null) throw new ArgumentNullException(nameof(database)); - SqlSyntax = database.SqlSyntax; - PocoDataFactory = database.PocoDataFactory; - DatabaseType = database.DatabaseType; + Mappers = mappers; } public ISqlSyntaxProvider SqlSyntax { get; } @@ -30,5 +28,7 @@ namespace Umbraco.Core.Persistence public IPocoDataFactory PocoDataFactory { get; } public DatabaseType DatabaseType { get; } + + public IMapperCollection Mappers { get; } } } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 80559f9ce4..21db2d32f0 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax string GetQuotedTableName(string tableName); string GetQuotedColumnName(string columnName); string GetQuotedName(string name); - bool DoesTableExist(Database db, string tableName); + bool DoesTableExist(IDatabase db, string tableName); string GetIndexType(IndexTypes indexTypes); string GetSpecialDbType(SpecialDbTypes dbTypes); string CreateTable { get; } @@ -68,20 +68,21 @@ namespace Umbraco.Core.Persistence.SqlSyntax string Format(ForeignKeyDefinition foreignKey); string FormatColumnRename(string tableName, string oldName, string newName); string FormatTableRename(string oldName, string newName); + Sql SelectTop(Sql sql, int top); + bool SupportsClustered(); bool SupportsIdentityInsert(); - bool? SupportsCaseInsensitiveQueries(Database db); + bool? SupportsCaseInsensitiveQueries(IDatabase db); string ConvertIntegerToOrderableString { get; } string ConvertDateToOrderableString { get; } string ConvertDecimalToOrderableString { get; } - IEnumerable GetTablesInSchema(Database db); - IEnumerable GetColumnsInSchema(Database db); - IEnumerable> GetConstraintsPerTable(Database db); - IEnumerable> GetConstraintsPerColumn(Database db); - - IEnumerable> GetDefinedIndexes(Database db); + IEnumerable GetTablesInSchema(IDatabase db); + IEnumerable GetColumnsInSchema(IDatabase db); + IEnumerable> GetConstraintsPerTable(IDatabase db); + IEnumerable> GetConstraintsPerColumn(IDatabase db); + IEnumerable> GetDefinedIndexes(IDatabase db); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs index adedbf2680..6b9207eba7 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs @@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax InitColumnTypeMap(); } - public override IEnumerable GetTablesInSchema(Database db) + public override IEnumerable GetTablesInSchema(IDatabase db) { List list; try @@ -54,7 +54,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return list; } - public override IEnumerable GetColumnsInSchema(Database db) + public override IEnumerable GetColumnsInSchema(IDatabase db) { List list; try @@ -79,7 +79,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return list; } - public override IEnumerable> GetConstraintsPerTable(Database db) + public override IEnumerable> GetConstraintsPerTable(IDatabase db) { List> list; try @@ -101,7 +101,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return list; } - public override IEnumerable> GetConstraintsPerColumn(Database db) + public override IEnumerable> GetConstraintsPerColumn(IDatabase db) { List> list; try @@ -127,7 +127,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return list; } - public override IEnumerable> GetDefinedIndexes(Database db) + public override IEnumerable> GetDefinedIndexes(IDatabase db) { List> list; try @@ -156,7 +156,7 @@ ORDER BY TABLE_NAME, INDEX_NAME", return list; } - public override bool DoesTableExist(Database db, string tableName) + public override bool DoesTableExist(IDatabase db, string tableName) { long result; try @@ -370,7 +370,7 @@ ORDER BY TABLE_NAME, INDEX_NAME", public override string ConvertDateToOrderableString { get { return "DATE_FORMAT({0}, '%Y%m%d')"; } } public override string ConvertDecimalToOrderableString { get { return "LPAD(FORMAT({0}, 9), 20, '0')"; } } - public override bool? SupportsCaseInsensitiveQueries(Database db) + public override bool? SupportsCaseInsensitiveQueries(IDatabase db) { bool? supportsCaseInsensitiveQueries = null; diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs index 84a4dfbd6d..5a74ff5193 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs @@ -106,13 +106,13 @@ namespace Umbraco.Core.Persistence.SqlSyntax columns); } - public override IEnumerable GetTablesInSchema(Database db) + public override IEnumerable GetTablesInSchema(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"); return items.Select(x => x.TABLE_NAME).Cast().ToList(); } - public override IEnumerable GetColumnsInSchema(Database db) + public override IEnumerable GetColumnsInSchema(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS"); return @@ -122,7 +122,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax item.IS_NULLABLE, item.DATA_TYPE)).ToList(); } - public override IEnumerable> GetConstraintsPerTable(Database db) + public override IEnumerable> GetConstraintsPerTable(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS"); var indexItems = db.Fetch("SELECT TABLE_NAME, INDEX_NAME FROM INFORMATION_SCHEMA.INDEXES"); @@ -134,7 +134,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax .ToList(); } - public override IEnumerable> GetConstraintsPerColumn(Database db) + public override IEnumerable> GetConstraintsPerColumn(IDatabase db) { var items = db.Fetch( @@ -150,7 +150,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax indexItem.INDEX_NAME))).ToList(); } - public override IEnumerable> GetDefinedIndexes(Database db) + public override IEnumerable> GetDefinedIndexes(IDatabase db) { var items = db.Fetch( @@ -162,7 +162,7 @@ ORDER BY TABLE_NAME, INDEX_NAME"); item => new Tuple(item.TABLE_NAME, item.INDEX_NAME, item.COLUMN_NAME, item.UNIQUE)); } - public override bool DoesTableExist(Database db, string tableName) + public override bool DoesTableExist(IDatabase db, string tableName) { var result = db.ExecuteScalar("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName", diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs index 7672860f2c..00e0a43f81 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs @@ -12,8 +12,8 @@ namespace Umbraco.Core.Persistence.SqlSyntax [SqlSyntaxProvider(Constants.DbProviderNames.SqlServer)] public class SqlServerSyntaxProvider : MicrosoftSqlSyntaxProviderBase { - // IDatabaseFactory to be lazily injected - public SqlServerSyntaxProvider(Lazy lazyFactory) + // IUmbracoDatabaseFactory to be lazily injected + public SqlServerSyntaxProvider(Lazy lazyFactory) { _serverVersion = new Lazy(() => { @@ -99,7 +99,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax } } - private static ServerVersionInfo DetermineVersion(IDatabaseFactory factory) + private static ServerVersionInfo DetermineVersion(IUmbracoDatabaseFactory factory) { // Edition: "Express Edition", "Windows Azure SQL Database..." // EngineEdition: 1/Desktop 2/Standard 3/Enterprise 4/Express 5/Azure @@ -136,19 +136,19 @@ namespace Umbraco.Core.Persistence.SqlSyntax /// server type that does this, therefore this method doesn't exist on any other syntax provider /// /// - public IEnumerable> GetDefaultConstraintsPerColumn(Database db) + public IEnumerable> GetDefaultConstraintsPerColumn(IDatabase db) { var items = db.Fetch("SELECT TableName = t.Name,ColumnName = c.Name,dc.Name,dc.[Definition] FROM sys.tables t INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id"); return items.Select(x => new Tuple(x.TableName, x.ColumnName, x.Name, x.Definition)); } - public override IEnumerable GetTablesInSchema(Database db) + public override IEnumerable GetTablesInSchema(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"); return items.Select(x => x.TABLE_NAME).Cast().ToList(); } - public override IEnumerable GetColumnsInSchema(Database db) + public override IEnumerable GetColumnsInSchema(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS"); return @@ -158,7 +158,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax item.IS_NULLABLE, item.DATA_TYPE)).ToList(); } - public override IEnumerable> GetConstraintsPerTable(Database db) + public override IEnumerable> GetConstraintsPerTable(IDatabase db) { var items = db.Fetch( @@ -166,7 +166,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return items.Select(item => new Tuple(item.TABLE_NAME, item.CONSTRAINT_NAME)).ToList(); } - public override IEnumerable> GetConstraintsPerColumn(Database db) + public override IEnumerable> GetConstraintsPerColumn(IDatabase db) { var items = db.Fetch( @@ -174,7 +174,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax return items.Select(item => new Tuple(item.TABLE_NAME, item.COLUMN_NAME, item.CONSTRAINT_NAME)).ToList(); } - public override IEnumerable> GetDefinedIndexes(Database db) + public override IEnumerable> GetDefinedIndexes(IDatabase db) { var items = db.Fetch( @@ -190,7 +190,7 @@ order by T.name, I.name"); } - public override bool DoesTableExist(Database db, string tableName) + public override bool DoesTableExist(IDatabase db, string tableName) { var result = db.ExecuteScalar("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName", diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index b3834fc819..b72aa332df 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -226,34 +226,34 @@ namespace Umbraco.Core.Persistence.SqlSyntax return "NVARCHAR"; } - public virtual bool? SupportsCaseInsensitiveQueries(Database db) + public virtual bool? SupportsCaseInsensitiveQueries(IDatabase db) { return true; } - public virtual IEnumerable GetTablesInSchema(Database db) + public virtual IEnumerable GetTablesInSchema(IDatabase db) { return new List(); } - public virtual IEnumerable GetColumnsInSchema(Database db) + public virtual IEnumerable GetColumnsInSchema(IDatabase db) { return new List(); } - public virtual IEnumerable> GetConstraintsPerTable(Database db) + public virtual IEnumerable> GetConstraintsPerTable(IDatabase db) { return new List>(); } - public virtual IEnumerable> GetConstraintsPerColumn(Database db) + public virtual IEnumerable> GetConstraintsPerColumn(IDatabase db) { return new List>(); } - public abstract IEnumerable> GetDefinedIndexes(Database db); + public abstract IEnumerable> GetDefinedIndexes(IDatabase db); - public virtual bool DoesTableExist(Database db, string tableName) + public virtual bool DoesTableExist(IDatabase db, string tableName) { return false; } diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs index 4a5b77e4bf..ab43b2d9f5 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs @@ -6,6 +6,7 @@ using NPoco; using StackExchange.Profiling; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.FaultHandling; +using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence @@ -17,18 +18,16 @@ namespace Umbraco.Core.Persistence /// Is used everywhere in place of the original NPoco Database object, and provides additional features /// such as profiling, retry policies, logging, etc. /// Is never created directly but obtained from the . - /// It implements IDisposeOnRequestEnd which means it will be disposed when the request ends, which - /// automatically closes the connection - as implemented by NPoco Database.Dispose(). /// - public class UmbracoDatabase : Database, IDisposeOnRequestEnd, IUmbracoDatabaseConfig + public class UmbracoDatabase : Database, IUmbracoDatabase { // Umbraco's default isolation level is RepeatableRead private const IsolationLevel DefaultIsolationLevel = IsolationLevel.RepeatableRead; - private readonly ILogger _logger; - private readonly SqlContext _sqlContext; + private readonly ILogger _logger; private readonly RetryPolicy _connectionRetryPolicy; private readonly RetryPolicy _commandRetryPolicy; + private readonly Guid _instanceGuid = Guid.NewGuid(); #region Ctor @@ -42,7 +41,7 @@ namespace Umbraco.Core.Persistence public UmbracoDatabase(string connectionString, SqlContext sqlContext, DbProviderFactory provider, ILogger logger, RetryPolicy connectionRetryPolicy = null, RetryPolicy commandRetryPolicy = null) : base(connectionString, sqlContext.DatabaseType, provider, DefaultIsolationLevel) { - _sqlContext = sqlContext; + SqlContext = sqlContext; _logger = logger; _connectionRetryPolicy = connectionRetryPolicy; @@ -58,7 +57,7 @@ namespace Umbraco.Core.Persistence internal UmbracoDatabase(DbConnection connection, SqlContext sqlContext, ILogger logger) : base(connection, sqlContext.DatabaseType, DefaultIsolationLevel) { - _sqlContext = sqlContext; + SqlContext = sqlContext; _logger = logger; EnableSqlTrace = EnableSqlTraceDefault; @@ -66,26 +65,17 @@ namespace Umbraco.Core.Persistence #endregion - /// - /// Gets the database Sql syntax. - /// - public ISqlSyntaxProvider SqlSyntax => _sqlContext.SqlSyntax; + /// + public SqlContext SqlContext { get; } - /// - /// Creates a Sql statement. - /// - public Sql Sql() - { - return NPoco.Sql.BuilderFor(_sqlContext); - } + /// + public ISqlSyntaxProvider SqlSyntax => SqlContext.SqlSyntax; + + public Sql Sql() => new Sql(SqlContext); - /// - /// Creates a Sql statement. - /// - public Sql Sql(string sql, params object[] args) - { - return Sql().Append(sql, args); - } + public Sql Sql(string sql, params object[] args) => Sql().Append(sql, args); + + public IQuery Query() => new Query(SqlContext); #region Testing, Debugging and Troubleshooting @@ -95,25 +85,19 @@ namespace Umbraco.Core.Persistence private int _spid = -1; private const bool EnableSqlTraceDefault = true; #else - private string _sid; + private string _instanceId; private const bool EnableSqlTraceDefault = false; #endif - /// - /// Gets this instance's unique identifier. - /// - public Guid InstanceId { get; } = Guid.NewGuid(); - - /// - /// Gets this instance's string identifier. - /// - public string InstanceSid { + /// + public string InstanceId + { get { #if DEBUG_DATABASES - return InstanceId.ToString("N").Substring(0, 8) + ':' + _spid; + return _instanceGuid.ToString("N").Substring(0, 8) + ':' + _spid; #else - return _sid ?? (_sid = InstanceId.ToString("N").Substring(0, 8)); + return _instanceId ?? (_instanceId = _instanceGuid.ToString("N").Substring(0, 8)); #endif } } @@ -196,7 +180,7 @@ namespace Umbraco.Core.Persistence protected override void OnException(Exception x) { - _logger.Error("Exception (" + InstanceSid + ").", x); + _logger.Error("Exception (" + InstanceId + ").", x); base.OnException(x); } @@ -210,7 +194,7 @@ namespace Umbraco.Core.Persistence { var sb = new StringBuilder(); #if DEBUG_DATABASES - sb.Append(InstanceSid); + sb.Append(InstanceId); sb.Append(": "); #endif sb.Append(cmd.CommandText); @@ -225,7 +209,7 @@ namespace Umbraco.Core.Persistence #if DEBUG_DATABASES // detects whether the command is already in use (eg still has an open reader...) - DatabaseDebugHelper.SetCommand(cmd, InstanceSid + " [T" + Thread.CurrentThread.ManagedThreadId + "]"); + DatabaseDebugHelper.SetCommand(cmd, InstanceId + " [T" + Thread.CurrentThread.ManagedThreadId + "]"); var refsobj = DatabaseDebugHelper.GetReferencedObjects(cmd.Connection); if (refsobj != null) _logger.Debug("Oops!" + Environment.NewLine + refsobj); #endif @@ -242,16 +226,5 @@ namespace Umbraco.Core.Persistence } #endregion - - // at the moment, NPoco does not support overriding Dispose - /* - public override void Dispose(bool disposing) - { -#if DEBUG_DATABASES - LogHelper.Debug("Dispose (" + InstanceSid + ")."); -#endif - base.Dispose(); - } - */ } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabaseExtensions.cs b/src/Umbraco.Core/Persistence/UmbracoDatabaseExtensions.cs new file mode 100644 index 0000000000..c1ca19e9f6 --- /dev/null +++ b/src/Umbraco.Core/Persistence/UmbracoDatabaseExtensions.cs @@ -0,0 +1,14 @@ +using System; + +namespace Umbraco.Core.Persistence +{ + internal static class UmbracoDatabaseExtensions + { + public static UmbracoDatabase AsUmbracoDatabase(this IUmbracoDatabase database) + { + var asDatabase = database as UmbracoDatabase; + if (asDatabase == null) throw new Exception("oops: database."); + return asDatabase; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs b/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs index fd417505b3..c252ce2608 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs @@ -17,18 +17,17 @@ using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence { /// - /// Default implementation of . + /// Default implementation of . /// /// /// This factory implementation creates and manages an "ambient" database connection. When running /// within an Http context, "ambient" means "associated with that context". Otherwise, it means "static to /// the current thread". In this latter case, note that the database connection object is not thread safe. - /// It wraps an NPoco DatabaseFactory which is initializes with a proper IPocoDataFactory to ensure + /// It wraps an NPoco UmbracoDatabaseFactory which is initializes with a proper IPocoDataFactory to ensure /// that NPoco's plumbing is cached appropriately for the whole application. /// - internal class UmbracoDatabaseFactory : DisposableObject, IDatabaseFactory + internal class UmbracoDatabaseFactory : DisposableObject, IUmbracoDatabaseFactory { - //private readonly IUmbracoDatabaseAccessor _umbracoDatabaseAccessor; private readonly IDatabaseScopeAccessor _databaseScopeAccessor; private readonly ISqlSyntaxProvider[] _sqlSyntaxProviders; private readonly IMapperCollection _mappers; @@ -41,7 +40,6 @@ namespace Umbraco.Core.Persistence private DbProviderFactory _dbProviderFactory; private DatabaseType _databaseType; private ISqlSyntaxProvider _sqlSyntax; - private IQueryFactory _queryFactory; private SqlContext _sqlContext; private RetryPolicy _connectionRetryPolicy; private RetryPolicy _commandRetryPolicy; @@ -121,20 +119,15 @@ namespace Umbraco.Core.Persistence #endregion - /// - /// Gets a value indicating whether the database is configured (no connect test). - /// - /// + /// public bool Configured { get; private set; } - /// - /// Gets a value indicating whether it is possible to connect to the database. - /// + /// public bool CanConnect => Configured && DbConnectionExtensions.IsConnectionAvailable(_connectionString, _providerName); - /// - /// Gets the database sql syntax provider. - /// + #region IDatabaseContext + + /// public ISqlSyntaxProvider SqlSyntax { get @@ -144,20 +137,28 @@ namespace Umbraco.Core.Persistence } } - /// - /// Gets the database query factory. - /// - public IQueryFactory QueryFactory { - get - { - EnsureConfigured(); - return _queryFactory; - } + public IQuery Query() + { + EnsureConfigured(); + return new Query(_sqlSyntax, _mappers); } - public Sql Sql() => NPoco.Sql.BuilderFor(_sqlContext); + /// + public Sql Sql() + { + EnsureConfigured(); + return NPoco.Sql.BuilderFor(_sqlContext); + } - // will be configured by the database context + /// + public Sql Sql(string sql, params object[] args) + { + return Sql().Append(sql, args); + } + + #endregion + + /// public void Configure(string connectionString, string providerName) { using (new WriteLock(_lock)) @@ -194,23 +195,47 @@ namespace Umbraco.Core.Persistence var config = new FluentConfig(xmappers => factory); // create the database factory - _npocoDatabaseFactory = DatabaseFactory.Config(x => x + _npocoDatabaseFactory = NPoco.DatabaseFactory.Config(x => x .UsingDatabase(CreateDatabaseInstance) // creating UmbracoDatabase instances .WithFluentConfig(config)); // with proper configuration - if (_npocoDatabaseFactory == null) throw new NullReferenceException("The call to DatabaseFactory.Config yielded a null DatabaseFactory instance."); + if (_npocoDatabaseFactory == null) throw new NullReferenceException("The call to UmbracoDatabaseFactory.Config yielded a null UmbracoDatabaseFactory instance."); // these are created here because it is the UmbracoDatabaseFactory that determines // the sql syntax, poco data factory, and database type - so it "owns" the context // and the query factory - _sqlContext = new SqlContext(_sqlSyntax, _pocoDataFactory, _databaseType); - _queryFactory = new QueryFactory(_sqlSyntax, _mappers); + _sqlContext = new SqlContext(_sqlSyntax, _pocoDataFactory, _databaseType, _mappers); _logger.Debug("Configured."); Configured = true; } } + /// + public IUmbracoDatabase Database => GetDatabase(); + + /// + public IUmbracoDatabase GetDatabase() + { + EnsureConfigured(); + + var scope = _databaseScopeAccessor.Scope; + if (scope == null) throw new InvalidOperationException("Out of scope."); + return scope.Database; + } + + /// + public IUmbracoDatabase CreateDatabase() + { + return (IUmbracoDatabase) _npocoDatabaseFactory.GetDatabase(); + } + + /// + public IDatabaseScope CreateScope(IUmbracoDatabase database = null) + { + return new DatabaseScope(_databaseScopeAccessor, this, database); + } + // gets the sql syntax provider that corresponds, from attribute private ISqlSyntaxProvider GetSqlSyntaxProvider(string providerName) { @@ -227,6 +252,7 @@ namespace Umbraco.Core.Persistence //provider = _syntaxProviders.FirstOrDefault(x => x.GetType() == typeof(SqlServerSyntaxProvider)); } + // ensures that the database is configured, else throws private void EnsureConfigured() { using (new ReadLock(_lock)) @@ -236,44 +262,12 @@ namespace Umbraco.Core.Persistence } } - // method used by NPoco's DatabaseFactory to actually create the database instance + // method used by NPoco's UmbracoDatabaseFactory to actually create the database instance private UmbracoDatabase CreateDatabaseInstance() { return new UmbracoDatabase(_connectionString, _sqlContext, _dbProviderFactory, _logger, _connectionRetryPolicy, _commandRetryPolicy); } - // fixme temp? - public UmbracoDatabase Database => GetDatabase(); - - /// - /// Gets (creates or retrieves) the ambient database connection. - /// - /// The ambient database connection. - public UmbracoDatabase GetDatabase() - { - EnsureConfigured(); - - var scope = _databaseScopeAccessor.Scope; - if (scope == null) throw new InvalidOperationException("Out of scope."); - return scope.Database; - - //// check if it's in scope - //var db = _umbracoDatabaseAccessor.UmbracoDatabase; - //if (db != null) return db; - //db = (UmbracoDatabase) _npocoDatabaseFactory.GetDatabase(); - //_umbracoDatabaseAccessor.UmbracoDatabase = db; - //return db; - } - - /// - /// Creates a new database instance. - /// - /// The database instance is not part of any scope and must be disposed after being used. - public UmbracoDatabase CreateDatabase() - { - return (UmbracoDatabase) _npocoDatabaseFactory.GetDatabase(); - } - protected override void DisposeResources() { // this is weird, because hybrid accessors store different databases per @@ -297,84 +291,5 @@ namespace Umbraco.Core.Persistence //db?.Dispose(); _databaseScopeAccessor.Scope = null; } - - //public bool HasAmbient => _umbracoDatabaseAccessor.UmbracoDatabase != null; - - //public UmbracoDatabase DetachAmbient() - //{ - // var database = _umbracoDatabaseAccessor.UmbracoDatabase; - // _umbracoDatabaseAccessor.UmbracoDatabase = null; - // return database; - //} - - //public void AttachAmbient(UmbracoDatabase database) - //{ - // var tmp = _umbracoDatabaseAccessor.UmbracoDatabase; - // _umbracoDatabaseAccessor.UmbracoDatabase = database; - // tmp?.Dispose(); - - // // fixme - what shall we do with tmp? - // // fixme - what about using "disposing" of the database to remove it from "ambient"?! - //} - - //public IDisposable CreateScope(bool force = false) // fixme - why would we ever force? - //{ - // if (HasAmbient) - // { - // return force - // ? new DatabaseScope(this, DetachAmbient(), GetDatabase()) - // : new DatabaseScope(this, null, null); - // } - - // // create a new, temp, database (will be disposed with DatabaseScope) - // return new DatabaseScope(this, null, GetDatabase()); - //} - - public IDisposable CreateScope() - { - return new DatabaseScope(_databaseScopeAccessor, this); - } - - /* - private class DatabaseScope : IDisposable - { - private readonly UmbracoDatabaseFactory _factory; - private readonly UmbracoDatabase _orig; - private readonly UmbracoDatabase _temp; - - // orig is the original database that was ambient when the scope was created - // if not null, it has been detached in order to be replaced by temp, which cannot be null - // if null, either there was no ambient database, or we don't want to replace it - // temp is the scope database that is created for the scope - // if not null, it has been attached and is not the ambient database, - // and when the scope is disposed it will be detached, disposed, and replaced by orig - // if null, the scope is nested and reusing the ambient database, without touching anything - - public DatabaseScope(UmbracoDatabaseFactory factory, UmbracoDatabase orig, UmbracoDatabase temp) - { - if (factory == null) throw new ArgumentNullException(nameof(factory)); - _factory = factory; - - _orig = orig; - _temp = temp; - } - - public void Dispose() - { - if (_temp != null) // if the scope had its own database - { - // detach and ensure consistency, then dispose - var temp = _factory.DetachAmbient(); - if (temp != _temp) throw new Exception("bam!"); - temp.Dispose(); - - // re-instate original database if any - if (_orig != null) - _factory.AttachAmbient(_orig); - } - GC.SuppressFinalize(this); - } - } - */ } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs index 67b81ef34a..ecffdd7abd 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs @@ -1,19 +1,16 @@ +using NPoco; + namespace Umbraco.Core.Persistence.UnitOfWork { /// /// Represents a persistence unit of work for working with a database. /// - public interface IDatabaseUnitOfWork : IUnitOfWork + public interface IDatabaseUnitOfWork : IUnitOfWork, IDatabaseContext { /// - /// Gets the database context. + /// Gets the database. /// - DatabaseContext DatabaseContext { get; } - - /// - /// Gets the current database instance. - /// - UmbracoDatabase Database { get; } + IUmbracoDatabase Database { get; } /// /// Read-locks some lock objects. diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs index 0daf0d229c..1385d7fe53 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs @@ -6,9 +6,9 @@ namespace Umbraco.Core.Persistence.UnitOfWork public interface IDatabaseUnitOfWorkProvider { /// - /// Gets the database context. + /// Gets the database factory. /// - DatabaseContext DatabaseContext { get; } + IUmbracoDatabaseFactory DatabaseFactory { get; } /// /// Creates a unit of work. diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs index adff6ff4ae..dfe189b5ae 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs @@ -1,6 +1,8 @@ using System; using System.Data; using NPoco; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.UnitOfWork { @@ -14,20 +16,33 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// /// Initializes a new instance of the class with a database and a repository factory. /// - /// The database context. + /// The database. /// A repository factory. /// This should be used by the NPocoUnitOfWorkProvider exclusively. - internal NPocoUnitOfWork(DatabaseContext databaseContext, RepositoryFactory repositoryFactory) + internal NPocoUnitOfWork(IUmbracoDatabase database, RepositoryFactory repositoryFactory) : base(repositoryFactory) { - DatabaseContext = databaseContext; + Database = database; } /// - public DatabaseContext DatabaseContext { get; } + public IUmbracoDatabase Database { get; } + + #region IDatabaseContext /// - public UmbracoDatabase Database => DatabaseContext.Database; + public ISqlSyntaxProvider SqlSyntax => Database.SqlSyntax; + + /// + public Sql Sql() => new Sql(Database.SqlContext); + + /// + public Sql Sql(string sql, params object[] args) => new Sql(Database.SqlContext, sql, args); + + /// + public IQuery Query() => new Query(Database.SqlContext); + + #endregion /// public override TRepository CreateRepository(string name = null) diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs index ce2c4557fa..b852855489 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs @@ -6,30 +6,30 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// Represents a provider that creates instances. /// public class NPocoUnitOfWorkProvider : IDatabaseUnitOfWorkProvider - { + { private readonly RepositoryFactory _repositoryFactory; /// /// Initializes a new instance of the class with a database factory and a repository factory. /// - /// A database context. + /// A database factory. /// A repository factory. - public NPocoUnitOfWorkProvider(DatabaseContext databaseContext, RepositoryFactory repositoryFactory) + public NPocoUnitOfWorkProvider(IUmbracoDatabaseFactory databaseFactory, RepositoryFactory repositoryFactory) { - if (databaseContext == null) throw new ArgumentNullException(nameof(databaseContext)); + if (databaseFactory == null) throw new ArgumentNullException(nameof(databaseFactory)); if (repositoryFactory == null) throw new ArgumentNullException(nameof(repositoryFactory)); - DatabaseContext = databaseContext; + DatabaseFactory = databaseFactory; _repositoryFactory = repositoryFactory; } /// - public DatabaseContext DatabaseContext { get; } + public IUmbracoDatabaseFactory DatabaseFactory { get; } /// public IDatabaseUnitOfWork CreateUnitOfWork() { - return new NPocoUnitOfWork(DatabaseContext, _repositoryFactory); + return new NPocoUnitOfWork(DatabaseFactory.Database, _repositoryFactory); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 6cb09a5308..78fccb0905 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -41,7 +41,7 @@ namespace Umbraco.Core.Services // lazy-constructed because when the ctor runs, the query factory may not be ready - private IQuery QueryNotTrashed => _queryNotTrashed ?? (_queryNotTrashed = UowProvider.DatabaseContext.Query().Where(x => x.Trashed == false)); + private IQuery QueryNotTrashed => _queryNotTrashed ?? (_queryNotTrashed = UowProvider.DatabaseFactory.Query().Where(x => x.Trashed == false)); #endregion diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index dffe6a60fe..eab2664019 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -70,7 +70,7 @@ namespace Umbraco.Core.Services // lazy-constructed because when the ctor runs, the query factory may not be ready - private IQuery QueryRootEntity => _queryRootEntity ?? (_queryRootEntity = UowProvider.DatabaseContext.Query().Where(x => x.ParentId == -1)); + private IQuery QueryRootEntity => _queryRootEntity ?? (_queryRootEntity = UowProvider.DatabaseFactory.Query().Where(x => x.ParentId == -1)); #endregion @@ -99,7 +99,7 @@ namespace Umbraco.Core.Services case UmbracoObjectTypes.DataType: case UmbracoObjectTypes.DocumentTypeContainer: id = uow.Database.ExecuteScalar( - uow.DatabaseContext.Sql() + uow.Sql() .Select("id") .From() .Where(dto => dto.UniqueId == key)); @@ -145,7 +145,7 @@ namespace Umbraco.Core.Services case UmbracoObjectTypes.Member: case UmbracoObjectTypes.DataType: guid = uow.Database.ExecuteScalar( - uow.DatabaseContext.Sql() + uow.Sql() .Select("uniqueID") .From() .Where(dto => dto.NodeId == id)); @@ -548,7 +548,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { - var sql = uow.DatabaseContext.Sql() + var sql = uow.Sql() .Select("nodeObjectType") .From() .Where(x => x.NodeId == id); @@ -569,7 +569,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.CreateUnitOfWork()) { - var sql = uow.DatabaseContext.Sql() + var sql = uow.Sql() .Select("nodeObjectType") .From() .Where(x => x.UniqueId == key); diff --git a/src/Umbraco.Core/Services/RepositoryService.cs b/src/Umbraco.Core/Services/RepositoryService.cs index 8656e52ea7..0038ed46f8 100644 --- a/src/Umbraco.Core/Services/RepositoryService.cs +++ b/src/Umbraco.Core/Services/RepositoryService.cs @@ -25,6 +25,6 @@ namespace Umbraco.Core.Services UowProvider = provider; } - protected IQuery Query() => UowProvider.DatabaseContext.Query(); + protected IQuery Query() => UowProvider.DatabaseFactory.Query(); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs index 8798754c11..a4e637a687 100644 --- a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs +++ b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs @@ -64,7 +64,7 @@ namespace Umbraco.Core.Sync protected DatabaseContext DatabaseContext { get; } - protected UmbracoDatabase Database => DatabaseContext.Database; + protected IUmbracoDatabase Database => DatabaseContext.Database; protected Sql Sql() => DatabaseContext.Sql(); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 57e3c17fd6..75dcd690fa 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -297,10 +297,13 @@ + + + @@ -308,6 +311,7 @@ + @@ -356,14 +360,12 @@ Component - + - - @@ -401,7 +403,7 @@ - + @@ -842,7 +844,7 @@ - + diff --git a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs b/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs index ef0b99d4d3..20ffa3a278 100644 --- a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs +++ b/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs @@ -44,10 +44,10 @@ namespace Umbraco.Tests.Benchmarks // fixme - should run on LocalDb same as NPoco tests! - private UmbracoDatabase GetSqlServerDatabase(ILogger logger) + private IUmbracoDatabase GetSqlServerDatabase(ILogger logger) { - IDatabaseFactory f = null; - var l = new Lazy(() => f); + IUmbracoDatabaseFactory f = null; + var l = new Lazy(() => f); var p = new SqlServerSyntaxProvider(l); f = new UmbracoDatabaseFactory( "server=.\\SQLExpress;database=YOURDB;user id=YOURUSER;password=YOURPASS", @@ -59,7 +59,7 @@ namespace Umbraco.Tests.Benchmarks return f.GetDatabase(); } - private UmbracoDatabase GetSqlCeDatabase(string cstr, ILogger logger) + private IUmbracoDatabase GetSqlCeDatabase(string cstr, ILogger logger) { var f = new UmbracoDatabaseFactory( cstr, @@ -167,8 +167,8 @@ namespace Umbraco.Tests.Benchmarks } private string _dbFile; - private UmbracoDatabase _dbSqlCe; - private UmbracoDatabase _dbSqlServer; + private IUmbracoDatabase _dbSqlCe; + private IUmbracoDatabase _dbSqlServer; /// /// Tests updating the existing XML way diff --git a/src/Umbraco.Tests/Components/ComponentTests.cs b/src/Umbraco.Tests/Components/ComponentTests.cs index d87ab19ba2..52af4a9deb 100644 --- a/src/Umbraco.Tests/Components/ComponentTests.cs +++ b/src/Umbraco.Tests/Components/ComponentTests.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Components private static IServiceContainer MockContainer(Action> setup = null) { - // fixme use IDatabaseFactory vs UmbracoDatabaseFactory, clean it all up! + // fixme use IUmbracoDatabaseFactory vs UmbracoDatabaseFactory, clean it all up! var testObjects = new TestObjects(null); var logger = Mock.Of(); diff --git a/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs b/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs index 9cc5d7d8f2..ab4a9f0c7b 100644 --- a/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs @@ -19,7 +19,7 @@ namespace Umbraco.Tests.Migrations { private ILogger _logger; private ISqlSyntaxProvider _sqlSyntax; - private UmbracoDatabase _database; + private IUmbracoDatabase _database; [SetUp] public void Setup() diff --git a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs index fe1daab1e8..f2cbf41ed2 100644 --- a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs @@ -20,7 +20,7 @@ namespace Umbraco.Tests.Migrations { private ILogger _logger; private ISqlSyntaxProvider _sqlSyntax; - private UmbracoDatabase _database; + private IUmbracoDatabase _database; private MigrationContext _migrationContext; [SetUp] diff --git a/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs index 51e58d09ca..bd6d37eb65 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/BaseUpgradeTest.cs @@ -110,7 +110,7 @@ namespace Umbraco.Tests.Migrations.Upgrades public string Path { get; set; } public abstract void DatabaseSpecificSetUp(); public abstract void DatabaseSpecificTearDown(); - public abstract UmbracoDatabase GetConfiguredDatabase(); + public abstract IUmbracoDatabase GetConfiguredDatabase(); public abstract string GetDatabaseSpecificSqlScript(); } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Migrations/Upgrades/MySqlUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/MySqlUpgradeTest.cs index d1f9c81750..d0730e7878 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/MySqlUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/MySqlUpgradeTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Migrations.Upgrades //TODO Remove created database here } - public override UmbracoDatabase GetConfiguredDatabase() + public override IUmbracoDatabase GetConfiguredDatabase() { var dbProviderFactory = DbProviderFactories.GetFactory(Constants.DbProviderNames.MySql); var sqlContext = new SqlContext(new MySqlSyntaxProvider(Mock.Of()), Mock.Of(), DatabaseType.MySQL); diff --git a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeDataUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeDataUpgradeTest.cs index 63a688c9de..e17dec6209 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeDataUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeDataUpgradeTest.cs @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Migrations.Upgrades SqlCeContextGuardian.CloseBackgroundConnection(); } - public override UmbracoDatabase GetConfiguredDatabase() + public override IUmbracoDatabase GetConfiguredDatabase() { var dbProviderFactory = DbProviderFactories.GetFactory(Constants.DbProviderNames.SqlCe); var sqlContext = new SqlContext(new SqlCeSyntaxProvider(), Mock.Of(), DatabaseType.SQLCe); diff --git a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs index 380a9bea5c..dbbcfd5df6 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Migrations.Upgrades TestHelper.ClearDatabase(); } - public override UmbracoDatabase GetConfiguredDatabase() + public override IUmbracoDatabase GetConfiguredDatabase() { var dbProviderFactory = DbProviderFactories.GetFactory(Constants.DbProviderNames.SqlCe); var sqlContext = new SqlContext(new SqlCeSyntaxProvider(), Mock.Of(), DatabaseType.SQLCe); diff --git a/src/Umbraco.Tests/Migrations/Upgrades/SqlServerUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/SqlServerUpgradeTest.cs index 968e4bb133..7a53679423 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/SqlServerUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/SqlServerUpgradeTest.cs @@ -21,10 +21,10 @@ namespace Umbraco.Tests.Migrations.Upgrades { } - public override UmbracoDatabase GetConfiguredDatabase() + public override IUmbracoDatabase GetConfiguredDatabase() { var dbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient"); - var sqlContext = new SqlContext(new SqlServerSyntaxProvider(new Lazy(() => null)), Mock.Of(), DatabaseType.SqlServer2008); + var sqlContext = new SqlContext(new SqlServerSyntaxProvider(new Lazy(() => null)), Mock.Of(), DatabaseType.SqlServer2008); return new UmbracoDatabase(@"server=.\SQLEXPRESS;database=EmptyForTest;user id=umbraco;password=umbraco", sqlContext, dbProviderFactory, Mock.Of()); } diff --git a/src/Umbraco.Tests/Migrations/Upgrades/ValidateOlderSchemaTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/ValidateOlderSchemaTest.cs index a4dd99f510..3372e9173f 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/ValidateOlderSchemaTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/ValidateOlderSchemaTest.cs @@ -97,7 +97,7 @@ namespace Umbraco.Tests.Migrations.Upgrades public string Path { get; set; } - public UmbracoDatabase GetConfiguredDatabase() + public IUmbracoDatabase GetConfiguredDatabase() { var dbProviderFactory = DbProviderFactories.GetFactory(Constants.DbProviderNames.SqlCe); var sqlContext = new SqlContext(new SqlCeSyntaxProvider(), Mock.Of(), DatabaseType.SQLCe); diff --git a/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7UpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7UpgradeTest.cs index f8f7adeade..509661140d 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7UpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/ValidateV7UpgradeTest.cs @@ -17,7 +17,7 @@ namespace Umbraco.Tests.Migrations.Upgrades { private ILogger _logger; private ISqlSyntaxProvider _sqlSyntax; - private UmbracoDatabase _database; + private IUmbracoDatabase _database; [SetUp] public void Setup() diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index b7d5b96345..2278de5c93 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -62,7 +62,7 @@ namespace Umbraco.Tests.Persistence [Test] public void SingleDatabaseInstancePerScope() { - UmbracoDatabase db1, db2; + IUmbracoDatabase db1, db2; using (_dbContext.CreateDatabaseScope()) { @@ -76,7 +76,7 @@ namespace Umbraco.Tests.Persistence [Test] public void DifferentDatabaseInstancePerScope() { - UmbracoDatabase db1, db2; + IUmbracoDatabase db1, db2; using (_dbContext.CreateDatabaseScope()) { diff --git a/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs b/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs index ae1e0f8808..b9bc6fa838 100644 --- a/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs +++ b/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Persistence.FaultHandling // Arrange const string connectionString = @"server=.\SQLEXPRESS;database=EmptyForTest;user id=x;password=umbraco"; const string providerName = Constants.DbProviderNames.SqlServer; - var sqlSyntax = new[] { new SqlServerSyntaxProvider(new Lazy(() => null)) }; + var sqlSyntax = new[] { new SqlServerSyntaxProvider(new Lazy(() => null)) }; var factory = new UmbracoDatabaseFactory(connectionString, providerName, sqlSyntax, Mock.Of(), new TestDatabaseScopeAccessor(), Mock.Of()); var database = factory.GetDatabase(); @@ -37,7 +37,7 @@ namespace Umbraco.Tests.Persistence.FaultHandling // Arrange const string connectionString = @"server=.\SQLEXPRESS;database=EmptyForTest;user id=umbraco;password=umbraco"; const string providerName = Constants.DbProviderNames.SqlServer; - var sqlSyntax = new[] { new SqlServerSyntaxProvider(new Lazy(() => null)) }; + var sqlSyntax = new[] { new SqlServerSyntaxProvider(new Lazy(() => null)) }; var factory = new UmbracoDatabaseFactory(connectionString, providerName, sqlSyntax, Mock.Of(), new TestDatabaseScopeAccessor(), Mock.Of()); var database = factory.GetDatabase(); diff --git a/src/Umbraco.Tests/Persistence/LocksTests.cs b/src/Umbraco.Tests/Persistence/LocksTests.cs index d38e3085de..b8cb685897 100644 --- a/src/Umbraco.Tests/Persistence/LocksTests.cs +++ b/src/Umbraco.Tests/Persistence/LocksTests.cs @@ -28,7 +28,7 @@ namespace Umbraco.Tests.Persistence // cannot use the default TestUmbracoDatabaseAccessor which only handles one instance at a time // works with... - //Container.RegisterSingleton(); + //Container.RegisterSingleton(); // but it should work with... Container.RegisterSingleton(); @@ -109,7 +109,7 @@ namespace Umbraco.Tests.Persistence // in a thread, must create a scope using (DatabaseContext.CreateDatabaseScope()) { - UmbracoDatabase database; + IUmbracoDatabase database; try { database = DatabaseContext.Database; @@ -175,7 +175,7 @@ namespace Umbraco.Tests.Persistence // in a thread, must create a scope using (DatabaseContext.CreateDatabaseScope()) { - UmbracoDatabase database; + IUmbracoDatabase database; try { database = DatabaseContext.Database; @@ -242,7 +242,7 @@ namespace Umbraco.Tests.Persistence // in a thread, must create a scope using (DatabaseContext.CreateDatabaseScope()) { - UmbracoDatabase database; + IUmbracoDatabase database; try { database = DatabaseContext.Database; diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 6a43386617..9bb3cff20b 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -456,7 +456,7 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void RegexAliasTest() { - var regex = VersionableRepositoryBaseAliasRegex.For(new SqlServerSyntaxProvider(new Lazy(() => null))); + var regex = VersionableRepositoryBaseAliasRegex.For(new SqlServerSyntaxProvider(new Lazy(() => null))); Assert.AreEqual(@"(\[\w+]\.\[\w+])\s+AS\s+(\[\w+])", regex.ToString()); const string sql = "SELECT [table].[column1] AS [alias1], [table].[column2] AS [alias2] FROM [table];"; var matches = regex.Matches(sql); @@ -482,8 +482,8 @@ namespace Umbraco.Tests.Persistence.Repositories try { - DatabaseContext.Database.EnableSqlTrace = true; - DatabaseContext.Database.EnableSqlCount = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = true; var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "title", Direction.Ascending, false); @@ -496,8 +496,8 @@ namespace Umbraco.Tests.Persistence.Repositories } finally { - DatabaseContext.Database.EnableSqlTrace = false; - DatabaseContext.Database.EnableSqlCount = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = false; } } } @@ -517,8 +517,8 @@ namespace Umbraco.Tests.Persistence.Repositories try { - DatabaseContext.Database.EnableSqlTrace = true; - DatabaseContext.Database.EnableSqlCount = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = true; var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true); // Assert @@ -528,8 +528,8 @@ namespace Umbraco.Tests.Persistence.Repositories } finally { - DatabaseContext.Database.EnableSqlTrace = false; - DatabaseContext.Database.EnableSqlCount = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = false; } } } @@ -611,7 +611,7 @@ namespace Umbraco.Tests.Persistence.Repositories long totalRecords; - var filterQuery = QueryFactory.Create().Where(x => x.Name.Contains("Page 2")); + var filterQuery = unitOfWork.Query().Where(x => x.Name.Contains("Page 2")); var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true, filterQuery); // Assert @@ -635,7 +635,7 @@ namespace Umbraco.Tests.Persistence.Repositories long totalRecords; - var filterQuery = QueryFactory.Create().Where(x => x.Name.Contains("text")); + var filterQuery = unitOfWork.Query().Where(x => x.Name.Contains("text")); var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true, filterQuery); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs index a556989a72..aa38afc39c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DataTypeDefinitionRepositoryTest.cs @@ -310,7 +310,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.PropertyEditorAlias == Constants.PropertyEditors.RadioButtonListAlias); + var query = unitOfWork.Query().Where(x => x.PropertyEditorAlias == Constants.PropertyEditors.RadioButtonListAlias); var result = repository.GetByQuery(query); // Assert @@ -330,7 +330,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Name.StartsWith("D")); + var query = unitOfWork.Query().Where(x => x.Name.StartsWith("D")); int count = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs index 6fefb092c5..71855b4977 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DictionaryRepositoryTest.cs @@ -206,7 +206,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.ItemKey == "Article"); + var query = unitOfWork.Query().Where(x => x.ItemKey == "Article"); var result = repository.GetByQuery(query); // Assert @@ -226,7 +226,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.ItemKey.StartsWith("Read")); + var query = unitOfWork.Query().Where(x => x.ItemKey.StartsWith("Read")); var result = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs index d95342c8f2..dd2b07aa5a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/LanguageRepositoryTest.cs @@ -41,7 +41,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); using (var unitOfWork = provider.CreateUnitOfWork()) { - unitOfWork.Database.EnableSqlTrace = true; + unitOfWork.Database.AsUmbracoDatabase().EnableSqlTrace = true; var repository = CreateRepository(unitOfWork); // Act @@ -176,7 +176,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.IsoCode == "da-DK"); + var query = unitOfWork.Query().Where(x => x.IsoCode == "da-DK"); var result = repository.GetByQuery(query); // Assert @@ -196,7 +196,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.IsoCode.StartsWith("D")); + var query = unitOfWork.Query().Where(x => x.IsoCode.StartsWith("D")); int count = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs index f7701914d9..2eaa620b19 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs @@ -134,7 +134,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of()); // Act - var query = QueryFactory.Create().Where(x => x.Alias.ToUpper() == "TEST1"); + var query = unitOfWork.Query().Where(x => x.Alias.ToUpper() == "TEST1"); var result = repository.GetByQuery(query); // Assert @@ -152,7 +152,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of()); // Act - var query = QueryFactory.Create().Where(x => x.Name.StartsWith("Test")); + var query = unitOfWork.Query().Where(x => x.Name.StartsWith("Test")); int count = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index a640805dd8..e566a01b96 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -233,7 +233,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); var result = repository.GetByQuery(query); // Assert @@ -252,7 +252,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true); @@ -274,7 +274,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending, true); @@ -296,7 +296,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "SortOrder", Direction.Ascending, true); @@ -318,7 +318,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Descending, true); @@ -340,7 +340,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true); @@ -362,10 +362,10 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; - var filter = QueryFactory.Create().Where(x => x.Name.Contains("File")); + var filter = unitOfWork.Query().Where(x => x.Name.Contains("File")); var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true, filter); @@ -387,10 +387,10 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out mediaTypeRepository); // Act - var query = QueryFactory.Create().Where(x => x.Level == 2); + var query = unitOfWork.Query().Where(x => x.Level == 2); long totalRecords; - var filter = QueryFactory.Create().Where(x => x.Name.Contains("Test")); + var filter = unitOfWork.Query().Where(x => x.Name.Contains("Test")); var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true, filter); @@ -475,7 +475,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act int level = 2; - var query = QueryFactory.Create().Where(x => x.Level == level); + var query = unitOfWork.Query().Where(x => x.Level == level); var result = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index 621269a035..3481e68296 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -116,7 +116,7 @@ namespace Umbraco.Tests.Persistence.Repositories var member = CreateTestMember(key: key); // Act - var query = QueryFactory.Create().Where(x => x.Key == key); + var query = unitOfWork.Query().Where(x => x.Key == key); var result = repository.GetByQuery(query); // Assert @@ -249,7 +249,9 @@ namespace Umbraco.Tests.Persistence.Repositories [Test] public void Can_Create_Correct_Subquery() { - var query = QueryFactory.Create().Where(x => + var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); + + var query = provider.DatabaseFactory.Query().Where(x => ((Member) x).LongStringPropertyValue.Contains("1095") && ((Member) x).PropertyTypeAlias == "headshot"); @@ -309,7 +311,7 @@ namespace Umbraco.Tests.Persistence.Repositories { if (isCount) { - var sqlCount = DatabaseContext.Database.Sql() + var sqlCount = DatabaseContext.Sql() .SelectCount() .From() .InnerJoin().On(left => left.NodeId, right => right.NodeId) @@ -320,7 +322,7 @@ namespace Umbraco.Tests.Persistence.Repositories return sqlCount; } - var sql = DatabaseContext.Database.Sql(); + var sql = DatabaseContext.Sql(); sql.Select("umbracoNode.*", "cmsContent.contentType", "cmsContentType.alias AS ContentTypeAlias", "cmsContentVersion.VersionId", "cmsContentVersion.VersionDate", "cmsMember.Email", "cmsMember.LoginName", "cmsMember.Password", "cmsPropertyData.id AS PropertyDataId", "cmsPropertyData.propertytypeid", @@ -344,7 +346,7 @@ namespace Umbraco.Tests.Persistence.Repositories private Sql GetSubquery() { - var sql = DatabaseContext.Database.Sql(); + var sql = DatabaseContext.Sql(); sql.Select("umbracoNode.id") .From() .InnerJoin().On(left => left.NodeId, right => right.NodeId) diff --git a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs index 636653d5c6..04b4005afb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs @@ -8,6 +8,7 @@ using NUnit.Framework; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Models; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Tests.TestHelpers; @@ -58,7 +59,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); using (var unitOfWork = provider.CreateUnitOfWork()) { - unitOfWork.Database.EnableSqlTrace = true; + unitOfWork.Database.AsUmbracoDatabase().EnableSqlTrace = true; var repo = new PublicAccessRepository(unitOfWork, CacheHelper, Logger); var entry = new PublicAccessEntry(content[0], content[1], content[2], new[] @@ -98,7 +99,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetDatabaseUnitOfWorkProvider(Logger); using (var unitOfWork = provider.CreateUnitOfWork()) { - unitOfWork.Database.EnableSqlTrace = true; + unitOfWork.Database.AsUmbracoDatabase().EnableSqlTrace = true; var repo = new PublicAccessRepository(unitOfWork, CacheHelper, Logger); var entry = new PublicAccessEntry(content[0], content[1], content[2], new[] diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index be929cbb7c..d98d8dfe82 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -200,7 +200,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out repositoryType); // Act - var query = QueryFactory.Create().Where(x => x.ParentId == NodeDto.NodeIdSeed + 1); + var query = unitOfWork.Query().Where(x => x.ParentId == NodeDto.NodeIdSeed + 1); int count = repository.Count(query); // Assert @@ -219,7 +219,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork, out repositoryType); // Act - var query = QueryFactory.Create().Where(x => x.RelationTypeId == RelationTypeDto.NodeIdSeed); + var query = unitOfWork.Query().Where(x => x.RelationTypeId == RelationTypeDto.NodeIdSeed); var relations = repository.GetByQuery(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs index 617109eb01..70149e0065 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs @@ -193,7 +193,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository(unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Alias.StartsWith("relate")); + var query = unitOfWork.Query().Where(x => x.Alias.StartsWith("relate")); int count = repository.Count(query); // Assert @@ -212,7 +212,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var childObjType = new Guid(Constants.ObjectTypes.DocumentType); - var query = QueryFactory.Create().Where(x => x.ChildObjectType == childObjType); + var query = unitOfWork.Query().Where(x => x.ChildObjectType == childObjType); var result = repository.GetByQuery(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 18e9bdcb30..743b8321d1 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; - +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -25,7 +25,7 @@ namespace Umbraco.Tests.Persistence.Repositories private UserRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out UserTypeRepository userTypeRepository) { userTypeRepository = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of()); - var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), userTypeRepository); + var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of(), userTypeRepository, Mock.Of()); return repository; } @@ -168,7 +168,7 @@ namespace Umbraco.Tests.Persistence.Repositories var id = user.Id; var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger); - var repository2 = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, utRepo); + var repository2 = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, utRepo, Mock.Of()); repository2.Delete(user); unitOfWork.Flush(); @@ -245,7 +245,7 @@ namespace Umbraco.Tests.Persistence.Repositories CreateAndCommitMultipleUsers(repository, unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Username == "TestUser1"); + var query = unitOfWork.Query().Where(x => x.Username == "TestUser1"); var result = repository.GetByQuery(query); // Assert @@ -330,7 +330,7 @@ namespace Umbraco.Tests.Persistence.Repositories var users = CreateAndCommitMultipleUsers(repository, unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Username == "TestUser1" || x.Username == "TestUser2"); + var query = unitOfWork.Query().Where(x => x.Username == "TestUser1" || x.Username == "TestUser2"); var result = repository.Count(query); // Assert @@ -486,7 +486,7 @@ namespace Umbraco.Tests.Persistence.Repositories using (var unitOfWork = provider.CreateUnitOfWork()) { var utRepo = new UserTypeRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger); - var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, utRepo); + var repository = new UserRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Logger, utRepo, Mock.Of()); // Act var user1 = MockedUser.CreateUser(CreateAndCommitUserType(), "1", "test", "media"); diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs index a19f15efa9..d9a39cf342 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserTypeRepositoryTest.cs @@ -184,7 +184,7 @@ namespace Umbraco.Tests.Persistence.Repositories CreateAndCommitMultipleUserTypes(repository, unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Alias == "testUserType1"); + var query = unitOfWork.Query().Where(x => x.Alias == "testUserType1"); var result = repository.GetByQuery(query); // Assert @@ -265,7 +265,7 @@ namespace Umbraco.Tests.Persistence.Repositories var userTypes = CreateAndCommitMultipleUserTypes(repository, unitOfWork); // Act - var query = QueryFactory.Create().Where(x => x.Alias == "testUserType1" || x.Alias == "testUserType2"); + var query = unitOfWork.Query().Where(x => x.Alias == "testUserType1" || x.Alias == "testUserType2"); var result = repository.Count(query); // Assert diff --git a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs index 767069da8c..f7bd1d8d54 100644 --- a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs +++ b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs @@ -75,7 +75,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void Format_SqlServer_NonClusteredIndexDefinition_AddsNonClusteredDirective() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var indexDefinition = CreateIndexDefinition(); indexDefinition.IndexType = IndexTypes.NonClustered; @@ -87,7 +87,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void Format_SqlServer_NonClusteredIndexDefinition_UsingIsClusteredFalse_AddsClusteredDirective() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var indexDefinition = CreateIndexDefinition(); indexDefinition.IsClustered = false; @@ -99,7 +99,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_NonClustered_CreatesNonClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); var db = TestObjects.GetUmbracoSqlServerDatabase(logger); var context = new MigrationContext(db, logger); @@ -115,7 +115,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); var db = TestObjects.GetUmbracoSqlServerDatabase(logger); var context = new MigrationContext(db, logger); @@ -131,7 +131,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_Clustered_CreatesClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); var db = TestObjects.GetUmbracoSqlServerDatabase(logger); var context = new MigrationContext(db, logger); diff --git a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs index 8cea123893..cf9de5462f 100644 --- a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs +++ b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs @@ -17,7 +17,7 @@ using UmbracoExamine; namespace Umbraco.Tests.Runtimes { [TestFixture] - [Ignore("cannot work until we refactor IDatabaseFactory vs UmbracoDatabaseFactory")] + [Ignore("cannot work until we refactor IUmbracoDatabaseFactory vs UmbracoDatabaseFactory")] public class CoreRuntimeTests { [SetUp] @@ -98,17 +98,17 @@ namespace Umbraco.Tests.Runtimes // must override the database factory // else BootFailedException because U cannot connect to the configured db - private static IDatabaseFactory GetDatabaseFactory() + private static IUmbracoDatabaseFactory GetDatabaseFactory() { - var mock = new Mock(); + var mock = new Mock(); mock.Setup(x => x.Configured).Returns(true); mock.Setup(x => x.CanConnect).Returns(true); return mock.Object; } // pretend we have the proper migration - // else BootFailedException because our mock IDatabaseFactory does not provide databases - protected override bool EnsureMigration(IDatabaseFactory databaseFactory, SemVersion codeVersion) + // else BootFailedException because our mock IUmbracoDatabaseFactory does not provide databases + protected override bool EnsureMigration(IUmbracoDatabaseFactory databaseFactory, SemVersion codeVersion) { return true; } @@ -163,7 +163,7 @@ namespace Umbraco.Tests.Runtimes base.Compose(composition); composition.Container.Register(factory => SettingsForTests.GetDefault()); - composition.Container.Register(factory => new DatabaseContext(factory.GetInstance()), new PerContainerLifetime()); + composition.Container.Register(factory => new DatabaseContext(factory.GetInstance()), new PerContainerLifetime()); composition.Container.RegisterSingleton(); Composed = true; diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index a894f40720..c2ff3f8d8d 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -1468,8 +1468,7 @@ namespace Umbraco.Tests.Services new TestDatabaseScopeAccessor(), Mappers); var repositoryFactory = MockRepositoryFactory(); - var databaseContext = new DatabaseContext(databaseFactory); - var provider = new NPocoUnitOfWorkProvider(databaseContext, repositoryFactory); + var provider = new NPocoUnitOfWorkProvider(databaseFactory, repositoryFactory); var contentType = ServiceContext.ContentTypeService.Get("umbTextpage"); var root = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 1); @@ -1477,7 +1476,7 @@ namespace Umbraco.Tests.Services var c2 = new Lazy(() => MockedContent.CreateSimpleContent(contentType, "Hierarchy Simple Text Subpage", c.Value.Id)); var list = new List> {c, c2}; - using (databaseContext.CreateDatabaseScope()) + using (databaseFactory.CreateScope()) using (var unitOfWork = provider.CreateUnitOfWork()) { ContentTypeRepository contentTypeRepository; diff --git a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs index 94d89351d2..1e89feb741 100644 --- a/src/Umbraco.Tests/Services/LocalizationServiceTests.cs +++ b/src/Umbraco.Tests/Services/LocalizationServiceTests.cs @@ -7,6 +7,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; +using Umbraco.Core.Persistence; namespace Umbraco.Tests.Services { @@ -129,22 +130,22 @@ namespace Umbraco.Tests.Services currParentId = desc1.Key; } - DatabaseContext.Database.EnableSqlTrace = true; - DatabaseContext.Database.EnableSqlCount = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = true; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = true; var items = ServiceContext.LocalizationService.GetDictionaryItemDescendants(_parentItemGuidId) .ToArray(); - Debug.WriteLine("SQL CALLS: " + DatabaseContext.Database.SqlCount); + Debug.WriteLine("SQL CALLS: " + DatabaseContext.Database.AsUmbracoDatabase().SqlCount); Assert.AreEqual(51, items.Length); //there's a call or two to get languages, so apart from that there should only be one call per level - Assert.Less(DatabaseContext.Database.SqlCount, 30); + Assert.Less(DatabaseContext.Database.AsUmbracoDatabase().SqlCount, 30); } finally { - DatabaseContext.Database.EnableSqlTrace = false; - DatabaseContext.Database.EnableSqlCount = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlTrace = false; + DatabaseContext.Database.AsUmbracoDatabase().EnableSqlCount = false; } } diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index b092d6fd98..b6d51c12da 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -1036,7 +1036,7 @@ namespace Umbraco.Tests.Services result.LastLoginDate.TruncateTo(DateTimeExtensions.DateTruncate.Second)); //now ensure the col is correct - var sql = DatabaseContext.Database.Sql().Select("cmsPropertyData.*") + var sql = DatabaseContext.Sql().Select("cmsPropertyData.*") .From() .InnerJoin() .On(dto => dto.PropertyTypeId, dto => dto.Id) diff --git a/src/Umbraco.Tests/Services/PerformanceTests.cs b/src/Umbraco.Tests/Services/PerformanceTests.cs index d6ca6893d8..9fee816566 100644 --- a/src/Umbraco.Tests/Services/PerformanceTests.cs +++ b/src/Umbraco.Tests/Services/PerformanceTests.cs @@ -294,7 +294,7 @@ namespace Umbraco.Tests.Services DatabaseContext.Database.BulkInsertRecordsWithTransaction(nodes); //re-get the nodes with ids - var sql = DatabaseContext.Database.Sql(); + var sql = DatabaseContext.Sql(); sql.SelectAll().From().Where(x => x.NodeObjectType == customObjectType); nodes = DatabaseContext.Database.Fetch(sql); diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index 8bb2f89199..1a1eaef823 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -186,11 +186,11 @@ namespace Umbraco.Tests.Services } /// - /// A special implementation of that mimics the UmbracoDatabaseFactory + /// A special implementation of that mimics the UmbracoDatabaseFactory /// (one db per HttpContext) by providing one db per thread, as required for multi-threaded /// tests. /// - internal class PerThreadSqlCeDatabaseFactory : DisposableObject, IDatabaseFactory + internal class PerThreadSqlCeDatabaseFactory : DisposableObject, IUmbracoDatabaseFactory { // the UmbracoDatabaseFactory uses thread-static databases where there is no http context, // so it would need to be disposed in each thread in order for each database to be disposed, @@ -199,7 +199,6 @@ namespace Umbraco.Tests.Services private readonly ILogger _logger; private readonly IMapperCollection _mappers; - private IQueryFactory _queryFactory; private readonly DbProviderFactory _dbProviderFactory = DbProviderFactories.GetFactory(Constants.DbProviderNames.SqlCe); @@ -219,9 +218,14 @@ namespace Umbraco.Tests.Services throw new NotImplementedException(); } - public IQueryFactory QueryFactory => _queryFactory ?? (_queryFactory = new QueryFactory(SqlSyntax, _mappers)); + public Sql Sql(string sql, params object[] args) + { + throw new NotImplementedException(); + } - public DatabaseType DatabaseType => DatabaseType.SQLCe; + public IQuery Query() => new Query(SqlSyntax, _mappers); + + public DatabaseType DatabaseType => DatabaseType.SQLCe; public PerThreadSqlCeDatabaseFactory(ILogger logger, IMapperCollection mappers) { @@ -229,9 +233,11 @@ namespace Umbraco.Tests.Services _mappers = mappers; } - private readonly ConcurrentDictionary _databases = new ConcurrentDictionary(); + private readonly ConcurrentDictionary _databases = new ConcurrentDictionary(); - public UmbracoDatabase GetDatabase() + public IUmbracoDatabase Database => GetDatabase(); + + public IUmbracoDatabase GetDatabase() { var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; var sqlContext = new SqlContext(SqlSyntax, Mock.Of(), DatabaseType); @@ -239,6 +245,16 @@ namespace Umbraco.Tests.Services i => new UmbracoDatabase(settings.ConnectionString, sqlContext, _dbProviderFactory, _logger)); } + public IUmbracoDatabase CreateDatabase() + { + throw new NotImplementedException(); + } + + public IDatabaseScope CreateScope(IUmbracoDatabase database = null) + { + throw new NotImplementedException(); + } + protected override void DisposeResources() { // dispose the databases diff --git a/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs b/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs index cd1b00f072..766fa35117 100644 --- a/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs +++ b/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs @@ -34,11 +34,6 @@ namespace Umbraco.Tests.Templates var database = TestObjects.GetUmbracoSqlCeDatabase(logger); unitOfWorkMock.Setup(x => x.Database).Returns(database); - var databaseFactoryMock = new Mock(); - databaseFactoryMock.Setup(x => x.QueryFactory).Returns(Mock.Of()); - var databaseContext = new DatabaseContext(databaseFactoryMock.Object); - unitOfWorkMock.Setup(x => x.DatabaseContext).Returns(databaseContext); - _templateRepository = new TemplateRepository(unitOfWorkMock.Object, _cacheMock.Object, logger, _masterpageFileSystemMock.Object, _viewFileSystemMock.Object, _templateConfigMock.Object); } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index ac86ffe529..d74acf192f 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -23,15 +23,15 @@ namespace Umbraco.Tests.TestHelpers internal partial class TestObjects { /// - /// Gets a mocked IDatabaseFactory. + /// Gets a mocked IUmbracoDatabaseFactory. /// - /// An IDatabaseFactory. + /// An IUmbracoDatabaseFactory. /// A value indicating whether the factory is configured. /// A value indicating whether the factory can connect to the database. /// This is just a void factory that has no actual database. - public IDatabaseFactory GetDatabaseFactoryMock(bool configured = true, bool canConnect = true) + public IUmbracoDatabaseFactory GetDatabaseFactoryMock(bool configured = true, bool canConnect = true) { - var databaseFactoryMock = new Mock(); + var databaseFactoryMock = new Mock(); databaseFactoryMock.Setup(x => x.Configured).Returns(configured); databaseFactoryMock.Setup(x => x.CanConnect).Returns(canConnect); diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 32df3534e2..0351ede6a8 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -42,13 +42,13 @@ namespace Umbraco.Tests.TestHelpers /// A logger. /// A (lazy) database factory. /// The default ISqlSyntaxProvider objects. - public IEnumerable GetDefaultSqlSyntaxProviders(ILogger logger, Lazy lazyFactory = null) + public IEnumerable GetDefaultSqlSyntaxProviders(ILogger logger, Lazy lazyFactory = null) { return new ISqlSyntaxProvider[] { new MySqlSyntaxProvider(logger), new SqlCeSyntaxProvider(), - new SqlServerSyntaxProvider(lazyFactory ?? new Lazy(() => null)) + new SqlServerSyntaxProvider(lazyFactory ?? new Lazy(() => null)) }; } @@ -76,7 +76,7 @@ namespace Umbraco.Tests.TestHelpers /// that can begin a transaction. public UmbracoDatabase GetUmbracoSqlServerDatabase(ILogger logger) { - var syntax = new SqlServerSyntaxProvider(new Lazy(() => null)); // do NOT try to get the server's version! + var syntax = new SqlServerSyntaxProvider(new Lazy(() => null)); // do NOT try to get the server's version! var connection = GetDbConnection(); var sqlContext = new SqlContext(syntax, Mock.Of(), DatabaseType.SqlServer2008); return new UmbracoDatabase(connection, sqlContext, logger); @@ -105,7 +105,6 @@ namespace Umbraco.Tests.TestHelpers CacheHelper cache, ILogger logger, IEventMessagesFactory eventMessagesFactory, - IQueryFactory queryFactory, IEnumerable urlSegmentProviders, IServiceFactory container = null) { @@ -224,7 +223,7 @@ namespace Umbraco.Tests.TestHelpers return new Lazy(() => container?.TryGetInstance() ?? ctor()); } - public IDatabaseUnitOfWorkProvider GetDatabaseUnitOfWorkProvider(ILogger logger, IDatabaseFactory databaseFactory = null, RepositoryFactory repositoryFactory = null) + public IDatabaseUnitOfWorkProvider GetDatabaseUnitOfWorkProvider(ILogger logger, IUmbracoDatabaseFactory databaseFactory = null, RepositoryFactory repositoryFactory = null) { if (databaseFactory == null) { @@ -236,7 +235,7 @@ namespace Umbraco.Tests.TestHelpers databaseFactory = new UmbracoDatabaseFactory(GlobalSettings.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger, accessor, mappers); } repositoryFactory = repositoryFactory ?? new RepositoryFactory(Mock.Of()); - return new NPocoUnitOfWorkProvider(new DatabaseContext(databaseFactory), repositoryFactory); + return new NPocoUnitOfWorkProvider(databaseFactory, repositoryFactory); } } } diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 388fe1ce43..3e46e456eb 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -299,7 +299,7 @@ namespace Umbraco.Tests.TestHelpers } } - private void CloseDbConnections(UmbracoDatabase database) + private void CloseDbConnections(IUmbracoDatabase database) { //Ensure that any database connections from a previous test is disposed. //This is really just double safety as its also done in the TearDown. @@ -307,7 +307,7 @@ namespace Umbraco.Tests.TestHelpers SqlCeContextGuardian.CloseBackgroundConnection(); } - private void RemoveDatabaseFile(UmbracoDatabase database, Action onFail = null) + private void RemoveDatabaseFile(IUmbracoDatabase database, Action onFail = null) { if (database != null) CloseDbConnections(database); var path = TestHelper.CurrentAssemblyDirectory; diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 813dea3d02..9d96bb241f 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -94,8 +94,6 @@ namespace Umbraco.Tests.Testing protected IMapperCollection Mappers => Container.GetInstance(); - protected IQueryFactory QueryFactory => Container.GetInstance().QueryFactory; - #endregion #region Setup @@ -257,16 +255,16 @@ namespace Umbraco.Tests.Testing Container.RegisterSingleton(); var sqlSyntaxProviders = TestObjects.GetDefaultSqlSyntaxProviders(Logger); Container.RegisterSingleton(_ => sqlSyntaxProviders.OfType().First()); - Container.RegisterSingleton(f => new UmbracoDatabaseFactory( + Container.RegisterSingleton(f => new UmbracoDatabaseFactory( Core.Configuration.GlobalSettings.UmbracoConnectionName, sqlSyntaxProviders, Logger, f.GetInstance(), Mock.Of())); - Container.RegisterSingleton(f => new DatabaseContext(f.GetInstance())); + Container.RegisterSingleton(f => new DatabaseContext(f.GetInstance())); Container.RegisterCollectionBuilder(); // empty Container.Register(factory - => TestObjects.GetDatabaseUnitOfWorkProvider(factory.GetInstance(), factory.TryGetInstance(), factory.TryGetInstance())); + => TestObjects.GetDatabaseUnitOfWorkProvider(factory.GetInstance(), factory.TryGetInstance(), factory.TryGetInstance())); Container.RegisterFrom(); // composition root is doing weird things, fix diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs index 7c6e2e24d3..193fedf912 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs @@ -179,13 +179,7 @@ namespace Umbraco.Tests.UmbracoExamine userService, new[] {new DefaultUrlSegmentProvider()}, new UmbracoContentValueSetValidator(options, Mock.Of()), - options, - //TODO: This should be rewritten without the Mock fluent syntax so it can be read better, - // but I'll do that some other time, for this now just mocks the GetWhereClauses to return the - // correct clauses that are expected - Mock.Of( - factory => factory.Create() == Mock.Of>( - query => query.GetWhereClauses() == new List> {new Tuple("cmsDocument.published", new object[] {1})}))); + options); i.IndexingError += IndexingError; diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index 499e2acd48..29d31771c5 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -418,7 +418,7 @@ namespace Umbraco.Tests.Web.Mvc // new ProfilingLogger(logger, Mock.Of())) { /*IsReady = true*/ }; var cache = new NullCacheProvider(); - var provider = new NPocoUnitOfWorkProvider(new DatabaseContext(databaseFactory), new RepositoryFactory(Mock.Of())); + var provider = new NPocoUnitOfWorkProvider(databaseFactory, new RepositoryFactory(Mock.Of())); _service = new FacadeService(svcCtx, provider, cache, Enumerable.Empty(), null, Current.Logger, null, true, false); // no events var http = GetHttpContextFactory(url, routeData).HttpContext; diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Web/Install/InstallHelper.cs index 29ec330947..6bd199a346 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Web/Install/InstallHelper.cs @@ -151,7 +151,7 @@ namespace Umbraco.Web.Install //dbProvider = ApplicationContext.Current.DatabaseContext.DatabaseProvider.ToString(); // // doing it differently - var syntax = context.Database.SqlSyntax; + var syntax = context.SqlSyntax; if (syntax is SqlCeSyntaxProvider) dbProvider = "SqlServerCE"; else if (syntax is MySqlSyntaxProvider) diff --git a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs index eec84c4f0d..54a3db3aee 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs @@ -111,7 +111,7 @@ nuDraft.data DraftData, docPub.text PubName, docPub.versionId PubVersion, docPub.updateDate PubVersionDate, docPub.documentUser PubWriterId, docPub.templateId PubTemplateId, nuPub.data PubData FROM umbracoNode n -JOIN umbracoNode x ON (n.id=x.id OR n.path LIKE " + uow.Database.SqlSyntax.GetConcat("x.path", "',%'") + @") +JOIN umbracoNode x ON (n.id=x.id OR n.path LIKE " + uow.SqlSyntax.GetConcat("x.path", "',%'") + @") JOIN cmsContent ON (cmsContent.nodeId=n.id) LEFT JOIN cmsDocument docDraft ON (docDraft.nodeId=n.id AND docDraft.newest=1 AND docDraft.published=0) LEFT JOIN cmsDocument docPub ON (docPub.nodeId=n.id AND docPub.published=1) @@ -134,7 +134,7 @@ n.createDate CreateDate, n.nodeUser CreatorId, n.text PubName, ver.versionId PubVersion, ver.versionDate PubVersionDate, nuPub.data PubData FROM umbracoNode n -JOIN umbracoNode x ON (n.id=x.id OR n.path LIKE " + uow.Database.SqlSyntax.GetConcat("x.path", "',%'") + @") +JOIN umbracoNode x ON (n.id=x.id OR n.path LIKE " + uow.SqlSyntax.GetConcat("x.path", "',%'") + @") JOIN cmsContent ON (cmsContent.nodeId=n.id) JOIN cmsContentVersion ver ON (ver.contentId=n.id) LEFT JOIN cmsContentNu nuPub ON (nuPub.nodeId=n.id AND nuPub.published=1) diff --git a/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs b/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs index 6db5202fa2..23f24b0a3b 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/FacadeService.cs @@ -998,7 +998,7 @@ namespace Umbraco.Web.PublishedCache.NuCache OnRemovedEntity(args.UnitOfWork.Database, args.Entity); } - private void OnRemovedEntity(UmbracoDatabase db, IContentBase item) + private void OnRemovedEntity(IUmbracoDatabase db, IContentBase item) { db.Execute("DELETE FROM cmsContentNu WHERE nodeId=@id", new { id = item.Id }); } @@ -1076,7 +1076,7 @@ namespace Umbraco.Web.PublishedCache.NuCache OnRepositoryRefreshed(db, member, true); } - private void OnRepositoryRefreshed(UmbracoDatabase db, IContentBase content, bool published) + private void OnRepositoryRefreshed(IUmbracoDatabase db, IContentBase content, bool published) { // use a custom SQL to update row version on each update //db.InsertOrUpdate(dto); @@ -1222,7 +1222,7 @@ WHERE cmsContentNu.nodeId IN ( // insert back - if anything fails the transaction will rollback var repository = uow.CreateRepository(); ((ContentRepository) repository).SetNoCachePolicy(); - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) @@ -1292,7 +1292,7 @@ WHERE cmsContentNu.nodeId IN ( // insert back - if anything fails the transaction will rollback var repository = uow.CreateRepository(); ((MediaRepository)repository).SetNoCachePolicy(); - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) @@ -1352,7 +1352,7 @@ WHERE cmsContentNu.nodeId IN ( // insert back - if anything fails the transaction will rollback var repository = uow.CreateRepository(); ((MemberRepository)repository).SetNoCachePolicy(); - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs index 3358c27212..cd39d51931 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlStore.cs @@ -563,7 +563,7 @@ AND (umbracoNode.id=@id)"; using (var uow = _uowProvider.CreateUnitOfWork()) { uow.ReadLock(Constants.Locks.ContentTree); - var sqlSyntax = uow.Database.SqlSyntax; + var sqlSyntax = uow.SqlSyntax; var sql = ReadCmsPreviewXmlSql1; sql += " @path LIKE " + sqlSyntax.GetConcat("umbracoNode.Path", "',%"); // concat(umbracoNode.path, ',%') @@ -1548,7 +1548,7 @@ ORDER BY umbracoNode.level, umbracoNode.sortOrder"; OnRemovedEntity(args.UnitOfWork.Database, args.Entity); } - private void OnRemovedEntity(UmbracoDatabase db, IContentBase item) + private void OnRemovedEntity(IUmbracoDatabase db, IContentBase item) { var parms = new { id = item.Id }; db.Execute("DELETE FROM cmsContentXml WHERE nodeId=@id", parms); @@ -1572,7 +1572,7 @@ ORDER BY umbracoNode.level, umbracoNode.sortOrder"; OnRemovedVersion(args.UnitOfWork.Database, args.EntityId, args.VersionId); } - private void OnRemovedVersion(UmbracoDatabase db, int entityId, Guid versionId) + private void OnRemovedVersion(IUmbracoDatabase db, int entityId, Guid versionId) { // we do not version cmsPreviewXml anymore - nothing to do here } @@ -1668,7 +1668,7 @@ ORDER BY umbracoNode.level, umbracoNode.sortOrder"; OnRepositoryRefreshed(db, dto1); } - private void OnRepositoryRefreshed(UmbracoDatabase db, ContentXmlDto dto) + private void OnRepositoryRefreshed(IUmbracoDatabase db, ContentXmlDto dto) { // use a custom SQL to update row version on each update //db.InsertOrUpdate(dto); @@ -1682,7 +1682,7 @@ ORDER BY umbracoNode.level, umbracoNode.sortOrder"; }); } - private void OnRepositoryRefreshed(UmbracoDatabase db, PreviewXmlDto dto) + private void OnRepositoryRefreshed(IUmbracoDatabase db, PreviewXmlDto dto) { // cannot simply update because of PetaPoco handling of the composite key ;-( // read http://stackoverflow.com/questions/11169144/how-to-modify-petapoco-class-to-work-with-composite-key-comprising-of-non-numeri @@ -1812,7 +1812,7 @@ WHERE cmsContentXml.nodeId IN ( } // insert back - if anything fails the transaction will rollback - var query = _uowProvider.DatabaseContext.Query().Where(x => x.Published); + var query = _uowProvider.DatabaseFactory.Query().Where(x => x.Published); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) @@ -1884,7 +1884,7 @@ WHERE cmsPreviewXml.nodeId IN ( } // insert back - if anything fails the transaction will rollback - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) @@ -1960,7 +1960,7 @@ WHERE cmsContentXml.nodeId IN ( } // insert back - if anything fails the transaction will rollback - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) @@ -2030,7 +2030,7 @@ WHERE cmsContentXml.nodeId IN ( } // insert back - if anything fails the transaction will rollback - var query = _uowProvider.DatabaseContext.Query(); + var query = _uowProvider.DatabaseFactory.Query(); if (contentTypeIds != null && contentTypeIdsA.Length > 0) query = query.WhereIn(x => x.ContentTypeId, contentTypeIdsA); // assume number of ctypes won't blow IN(...) diff --git a/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs b/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs index d13147dc22..f89a883e95 100644 --- a/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs +++ b/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs @@ -35,7 +35,7 @@ namespace Umbraco.Web.Strategies.Migrations //This query is structured to work with MySql, SQLCE and SqlServer: // http://issues.umbraco.org/issue/U4-3876 - var syntax = args.MigrationContext.Database.SqlSyntax; + var syntax = args.MigrationContext.SqlSyntax; var sql = @"DELETE FROM cmsContentXml WHERE nodeId IN (SELECT nodeId FROM (SELECT DISTINCT cmsContentXml.nodeId FROM cmsContentXml diff --git a/src/Umbraco.Web/Strategies/Migrations/EnsureListViewDataTypeIsCreated.cs b/src/Umbraco.Web/Strategies/Migrations/EnsureListViewDataTypeIsCreated.cs index 63353ae0cd..cc196968c2 100644 --- a/src/Umbraco.Web/Strategies/Migrations/EnsureListViewDataTypeIsCreated.cs +++ b/src/Umbraco.Web/Strategies/Migrations/EnsureListViewDataTypeIsCreated.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.Strategies.Migrations private void EnsureListViewDataTypeCreated(MigrationEventArgs e) { - var syntax = e.MigrationContext.Database.SqlSyntax; + var syntax = e.MigrationContext.SqlSyntax; using (var transaction = e.MigrationContext.Database.GetTransaction()) { diff --git a/src/Umbraco.Web/Strategies/Migrations/PublishAfterUpgradeToVersionSixth.cs b/src/Umbraco.Web/Strategies/Migrations/PublishAfterUpgradeToVersionSixth.cs index 5a80c4458a..46dc0eb128 100644 --- a/src/Umbraco.Web/Strategies/Migrations/PublishAfterUpgradeToVersionSixth.cs +++ b/src/Umbraco.Web/Strategies/Migrations/PublishAfterUpgradeToVersionSixth.cs @@ -23,7 +23,7 @@ namespace Umbraco.Web.Strategies.Migrations var target = new Version(6, 0, 0); if (args.ConfiguredVersion < target) { - var sql = args.MigrationContext.Database.Sql() + var sql = args.MigrationContext.Sql() .SelectAll() .From() .InnerJoin() diff --git a/src/UmbracoExamine/UmbracoContentIndexer.cs b/src/UmbracoExamine/UmbracoContentIndexer.cs index 67033e42f7..7a23a820eb 100644 --- a/src/UmbracoExamine/UmbracoContentIndexer.cs +++ b/src/UmbracoExamine/UmbracoContentIndexer.cs @@ -33,7 +33,7 @@ namespace UmbracoExamine protected IUserService UserService { get; } private readonly IEnumerable _urlSegmentProviders; - private readonly IQueryFactory _queryFactory; + private readonly DatabaseContext _databaseContext; private int? _parentId; #region Constructors @@ -47,7 +47,7 @@ namespace UmbracoExamine UserService = Current.Services.UserService; _urlSegmentProviders = Current.UrlSegmentProviders; - _queryFactory = Current.DatabaseContext.QueryFactory; + _databaseContext = Current.DatabaseContext; InitializeQueries(); } @@ -64,7 +64,6 @@ namespace UmbracoExamine IEnumerable urlSegmentProviders, IValueSetValidator validator, UmbracoContentIndexerOptions options, - IQueryFactory queryFactory, FacetConfiguration facetConfiguration = null, IDictionary> indexValueTypes = null) : base(fieldDefinitions, luceneDirectory, defaultAnalyzer, profilingLogger, validator, facetConfiguration, indexValueTypes) @@ -75,7 +74,6 @@ namespace UmbracoExamine if (urlSegmentProviders == null) throw new ArgumentNullException(nameof(urlSegmentProviders)); if (validator == null) throw new ArgumentNullException(nameof(validator)); if (options == null) throw new ArgumentNullException(nameof(options)); - if (queryFactory == null) throw new ArgumentNullException(nameof(queryFactory)); SupportProtectedContent = options.SupportProtectedContent; SupportUnpublishedContent = options.SupportUnpublishedContent; @@ -89,7 +87,6 @@ namespace UmbracoExamine MediaService = mediaService; UserService = userService; _urlSegmentProviders = urlSegmentProviders; - _queryFactory = queryFactory; InitializeQueries(); } @@ -97,7 +94,7 @@ namespace UmbracoExamine private void InitializeQueries() { if (_publishedQuery == null) - _publishedQuery = _queryFactory.Create().Where(x => x.Published); + _publishedQuery = _databaseContext.Query().Where(x => x.Published); } #endregion diff --git a/src/umbraco.cms/businesslogic/Content.cs b/src/umbraco.cms/businesslogic/Content.cs index b2f225f0d2..d5b93b8f22 100644 --- a/src/umbraco.cms/businesslogic/Content.cs +++ b/src/umbraco.cms/businesslogic/Content.cs @@ -337,14 +337,14 @@ namespace umbraco.cms.businesslogic internal protected class ContentDeleteEventArgs : EventArgs { - public ContentDeleteEventArgs(UmbracoDatabase database, int id) + public ContentDeleteEventArgs(IUmbracoDatabase database, int id) { Database = database; Id = id; } public int Id { get; private set; } - public UmbracoDatabase Database { get; private set; } + public IUmbracoDatabase Database { get; private set; } } internal static event TypedEventHandler DeletedContent;