From 8066b2d4edb2675c844a416831308fcaccc517a9 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 20 Dec 2017 11:18:17 +0100 Subject: [PATCH] Migrations refactoring - WIP - immediate --- .../Expressions/AlterColumnExpression.cs | 6 +- .../AlterDefaultConstraintExpression.cs | 3 - .../Alter/Expressions/AlterTableExpression.cs | 4 - .../Alter/Table/AlterTableBuilder.cs | 16 +- .../Table/IAlterTableColumnOptionBuilder.cs | 3 +- .../Expressions/Common/ExecutableBuilder.cs | 15 + .../Expressions/CreateColumnExpression.cs | 3 - .../Expressions/CreateForeignKeyExpression.cs | 3 - .../Expressions/CreateIndexExpression.cs | 3 - .../Expressions/Common/IExecutableBuilder.cs | 10 + .../Create/Column/CreateColumnBuilder.cs | 62 +- .../Column/ICreateColumnOnTableBuilder.cs | 12 + .../Column/ICreateColumnOnTableSyntax.cs | 9 - .../Column/ICreateColumnOptionBuilder.cs | 8 + ...ateColumnOptionForeignKeyCascadeBuilder.cs | 8 + ...eateColumnOptionForeignKeyCascadeSyntax.cs | 10 - .../Column/ICreateColumnOptionSyntax.cs | 9 - ...eSyntax.cs => ICreateColumnTypeBuilder.cs} | 6 +- .../Constraint/CreateConstraintBuilder.cs | 20 +- .../ICreateConstraintColumnsBuilder.cs | 15 +- .../ICreateConstraintOnTableBuilder.cs | 3 + .../Expressions/Create/CreateBuilder.cs | 51 +- .../Expressions/CreateConstraintExpression.cs | 2 +- .../Expressions/CreateTableExpression.cs | 2 +- .../ForeignKey/CreateForeignKeyBuilder.cs | 32 +- .../ICreateForeignKeyCascadeBuilder.cs | 5 +- .../Expressions/Create/ICreateBuilder.cs | 9 +- .../Create/Index/CreateIndexBuilder.cs | 26 +- .../Index/ICreateIndexOnColumnBuilder.cs | 13 +- .../CreateKeysAndIndexesBuilder.cs | 41 + .../Create/Table/CreateTableBuilder.cs | 49 +- .../Create/Table/CreateTableOfDtoBuilder.cs | 47 ++ .../Table/ICreateTableColumnAsTypeBuilder.cs | 7 + .../Table/ICreateTableColumnAsTypeSyntax.cs | 9 - .../Table/ICreateTableColumnOptionBuilder.cs | 4 +- ...bleColumnOptionForeignKeyCascadeBuilder.cs | 4 +- .../Table/ICreateTableWithColumnBuilder.cs | 8 +- .../Delete/Column/DeleteColumnBuilder.cs | 13 +- .../Delete/Column/IDeleteColumnBuilder.cs | 8 +- .../Constraint/DeleteConstraintBuilder.cs | 13 +- .../Constraint/IDeleteConstraintBuilder.cs | 8 +- .../Delete/Data/DeleteDataBuilder.cs | 16 +- .../Delete/Data/IDeleteDataBuilder.cs | 21 +- .../DeleteDefaultConstraintBuilder.cs | 7 +- ...IDeleteDefaultConstraintOnColumnBuilder.cs | 10 +- .../IDeleteDefaultConstraintOnTableBuilder.cs | 2 +- .../Expressions/Delete/DeleteBuilder.cs | 42 +- .../Expressions/DeleteColumnExpression.cs | 3 - .../Expressions/DeleteConstraintExpression.cs | 3 - .../Expressions/DeleteDataExpression.cs | 3 - .../DeleteDefaultConstraintExpression.cs | 3 - .../Expressions/DeleteForeignKeyExpression.cs | 3 - .../Expressions/DeleteIndexExpression.cs | 3 - .../Expressions/DeleteTableExpression.cs | 2 +- .../ForeignKey/DeleteForeignKeyBuilder.cs | 14 +- .../IDeleteForeignKeyForeignColumnBuilder.cs | 2 +- .../IDeleteForeignKeyFromTableBuilder.cs | 2 +- .../IDeleteForeignKeyOnTableBuilder.cs | 10 +- .../IDeleteForeignKeyPrimaryColumnBuilder.cs | 14 +- .../IDeleteForeignKeyToTableBuilder.cs | 2 +- .../Expressions/Delete/IDeleteBuilder.cs | 11 +- .../Delete/Index/DeleteIndexBuilder.cs | 19 +- .../Index/IDeleteIndexForTableBuilder.cs | 2 +- .../Index/IDeleteIndexOnColumnBuilder.cs | 13 +- .../DeleteKeysAndIndexesBuilder.cs | 56 ++ .../Delete/Table/DeleteTableBuilder.cs | 16 - .../Expressions/Execute/ExecuteBuilder.cs | 33 +- .../ExecuteCodeStatementExpression.cs | 19 - .../ExecuteSqlStatementExpression.cs | 3 - .../Expressions/Execute/IExecuteBuilder.cs | 9 +- .../Expressions/InsertDataExpression.cs | 3 - .../Expressions/Insert/IInsertBuilder.cs | 2 +- .../Expressions/Insert/IInsertIntoBuilder.cs | 11 +- .../Expressions/Insert/InsertIntoBuilder.cs | 12 +- .../Rename/Column/IRenameColumnToBuilder.cs | 8 +- .../Rename/Column/RenameColumnBuilder.cs | 19 +- .../Expressions/RenameColumnExpression.cs | 3 - .../Expressions/RenameTableExpression.cs | 3 - .../Expressions/Rename/IRenameBuilder.cs | 4 +- .../Expressions/Rename/RenameBuilder.cs | 3 - .../Rename/Table/IRenameTableBuilder.cs | 8 +- .../Rename/Table/RenameTableBuilder.cs | 16 +- .../Expressions/UpdateDataExpression.cs | 3 - .../Expressions/Update/IUpdateBuilder.cs | 2 +- .../Expressions/Update/IUpdateTableBuilder.cs | 2 +- .../Expressions/Update/IUpdateWhereBuilder.cs | 14 +- .../Expressions/Update/UpdateBuilder.cs | 3 - .../Expressions/Update/UpdateDataBuilder.cs | 19 +- .../Migrations/ILocalMigration.cs | 18 - .../Migrations/IMigrationContext.cs | 7 +- src/Umbraco.Core/Migrations/LocalMigration.cs | 41 - .../Migrations/MigrationContext.cs | 7 - .../Migrations/MigrationExpressionBase.cs | 10 + .../Migrations/MigrationRunner.cs | 98 +-- .../TargetVersionEight/AddContentNuTable.cs | 9 +- .../TargetVersionEight/AddLockObjects.cs | 18 +- .../TargetVersionEight/AddLockTable.cs | 3 +- .../TargetVersionEight/AddRedirectUrlTable.cs | 30 +- .../TargetVersionEight/RefactorXmlColumns.cs | 21 +- .../TargetVersionEight/VariantsMigration.cs | 63 +- .../AddLockObjects.cs | 18 +- .../AddLockTable.cs | 3 +- .../UpdateAllowedMediaTypesAtRoot.cs | 2 +- .../RemoveStylesheetDataAndTablesAgain.cs | 22 +- .../UpdateUniqueIndexOnPropertyData.cs | 9 +- .../AddIndexToDictionaryKeyColumn.cs | 52 +- .../AddUserGroupTables.cs | 90 +-- .../AddUserStartNodeTable.cs | 10 +- .../EnsureContentTemplatePermissions.cs | 34 +- .../ReduceDictionaryKeyColumnsSize.cs | 44 +- .../UpdateUserTables.cs | 14 +- .../AddIndexToCmsMemberLoginName.cs | 59 +- .../AddIndexToUmbracoNodePath.cs | 5 +- .../AddIndexToUser2NodePermission.cs | 5 +- .../AddIndexesToUmbracoRelationTables.cs | 57 +- .../AddLockObjects.cs | 18 +- .../TargetVersionSevenSixZero/AddLockTable.cs | 3 +- .../AddMacroUniqueIdColumn.cs | 30 +- .../AddRelationTypeUniqueIdColumn.cs | 15 +- .../NormalizeTemplateGuids.cs | 11 +- .../ReduceLoginNameColumnsSize.cs | 50 +- .../RemovePropertyDataIdIndex.cs | 2 +- .../RemoveUmbracoDeployTables.cs | 4 +- src/Umbraco.Core/Umbraco.Core.csproj | 19 +- .../Migrations/AdvancedMigrationTests.cs | 2 +- .../Migrations/AlterMigrationTests.cs | 31 +- .../Migrations/FindingMigrationsTest.cs | 23 +- .../Migrations/MigrationRunnerTests.cs | 24 +- .../SqlCeSyntaxProviderTests.cs | 61 +- src/Umbraco.Tests/Testing/TestDatabase.cs | 720 ++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 131 files changed, 1732 insertions(+), 1088 deletions(-) create mode 100644 src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionSyntax.cs rename src/Umbraco.Core/Migrations/Expressions/Create/Column/{ICreateColumnTypeSyntax.cs => ICreateColumnTypeBuilder.cs} (52%) create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs create mode 100644 src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs delete mode 100644 src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs delete mode 100644 src/Umbraco.Core/Migrations/ILocalMigration.cs delete mode 100644 src/Umbraco.Core/Migrations/LocalMigration.cs create mode 100644 src/Umbraco.Tests/Testing/TestDatabase.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs index 04b06c46aa..a1f29c936b 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs @@ -12,20 +12,16 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions Column = new ColumnDefinition { ModificationType = ModificationType.Alter }; } - - - public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } public virtual ColumnDefinition Column { get; set; } - public override string ToString() + protected override string GetSql() { return string.Format(SqlSyntax.AlterColumn, SqlSyntax.GetQuotedTableName(TableName), SqlSyntax.Format(Column)); - } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs index f9ef2c377d..6caabfad39 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs @@ -16,9 +16,6 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions public virtual object DefaultValue { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { //NOTE Should probably investigate if Deleting a Default Constraint is different from deleting a 'regular' constraint diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs index fa3190e72b..1f8e07e39c 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs @@ -8,12 +8,8 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions : base(context, supportedDatabaseTypes) { } - public virtual string TableName { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { return $"ALTER TABLE {TableName}"; diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs index 18d3538320..8e5bee85ae 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs @@ -20,6 +20,8 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table _supportedDatabaseTypes = supportedDatabaseTypes; } + public void Do() => Expression.Execute(); + public ColumnDefinition CurrentColumn { get; set; } public ForeignKeyDefinition CurrentForeignKey { get; set; } @@ -46,7 +48,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table DefaultValue = value }; - _context.Expressions.Add(dc); + Expression.Expressions.Add(dc); } CurrentColumn.DefaultValue = value; @@ -79,7 +81,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table Name = CurrentColumn.Name }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } @@ -130,7 +132,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table Name = CurrentColumn.Name }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } @@ -162,7 +164,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); fk.ForeignKey.ForeignColumns.Add(CurrentColumn.Name); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } @@ -198,7 +200,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table fk.ForeignKey.PrimaryColumns.Add(CurrentColumn.Name); fk.ForeignKey.ForeignColumns.Add(foreignColumnName); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } @@ -214,7 +216,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table CurrentColumn = column; - _context.Expressions.Add(createColumn); + Expression.Expressions.Add(createColumn); return this; } @@ -229,7 +231,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table CurrentColumn = column; - _context.Expressions.Add(alterColumn); + Expression.Expressions.Add(alterColumn); return this; } diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs index c1ce8f7e72..0c323b0699 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs @@ -2,6 +2,7 @@ namespace Umbraco.Core.Migrations.Expressions.Alter.Table { - public interface IAlterTableColumnOptionBuilder : IColumnOptionBuilder, IAlterTableBuilder + public interface IAlterTableColumnOptionBuilder : IColumnOptionBuilder, + IAlterTableBuilder, IExecutableBuilder { } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs new file mode 100644 index 0000000000..6e93d7bcc1 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs @@ -0,0 +1,15 @@ +namespace Umbraco.Core.Migrations.Expressions.Common +{ + public class ExecutableBuilder : IExecutableBuilder + { + private readonly IMigrationExpression _expression; + + public ExecutableBuilder(IMigrationExpression expression) + { + _expression = expression; + } + + /// + public void Do() => _expression.Execute(); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs index 2883dbe669..c468b49b44 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs @@ -14,9 +14,6 @@ namespace Umbraco.Core.Migrations.Expressions.Common.Expressions public string TableName { get; set; } public ColumnDefinition Column { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs index 3821f44bae..4930392632 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs @@ -19,9 +19,6 @@ namespace Umbraco.Core.Migrations.Expressions.Common.Expressions public ForeignKeyDefinition ForeignKey { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs index 4471632c2f..44abfa480c 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs @@ -20,9 +20,6 @@ namespace Umbraco.Core.Migrations.Expressions.Common.Expressions public IndexDefinition Index { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { return SqlSyntax.Format(Index); diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs new file mode 100644 index 0000000000..b56ff776cb --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs @@ -0,0 +1,10 @@ +namespace Umbraco.Core.Migrations.Expressions.Common +{ + public interface IExecutableBuilder + { + /// + /// Executes. + /// + void Do(); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs index 239f35f75c..3504fcfafa 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs @@ -5,10 +5,10 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Migrations.Expressions.Create.Column { - public class CreateColumnBuilder : ExpressionBuilderBase, - ICreateColumnOnTableSyntax, - ICreateColumnTypeSyntax, - ICreateColumnOptionForeignKeyCascadeSyntax + public class CreateColumnBuilder : ExpressionBuilderBase, + ICreateColumnOnTableBuilder, + ICreateColumnTypeBuilder, + ICreateColumnOptionForeignKeyCascadeBuilder { private readonly IMigrationContext _context; private readonly DatabaseType[] _supportedDatabaseTypes; @@ -20,6 +20,8 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column _supportedDatabaseTypes = supportedDatabaseTypes; } + public void Do() => Expression.Execute(); + public ForeignKeyDefinition CurrentForeignKey { get; set; } public override ColumnDefinition GetColumnForType() @@ -27,35 +29,35 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column return Expression.Column; } - public ICreateColumnTypeSyntax OnTable(string name) + public ICreateColumnTypeBuilder OnTable(string name) { Expression.TableName = name; return this; } - public ICreateColumnOptionSyntax WithDefault(SystemMethods method) + public ICreateColumnOptionBuilder WithDefault(SystemMethods method) { Expression.Column.DefaultValue = method; return this; } - public ICreateColumnOptionSyntax WithDefaultValue(object value) + public ICreateColumnOptionBuilder WithDefaultValue(object value) { Expression.Column.DefaultValue = value; return this; } - public ICreateColumnOptionSyntax Identity() + public ICreateColumnOptionBuilder Identity() { return Indexed(null); } - public ICreateColumnOptionSyntax Indexed() + public ICreateColumnOptionBuilder Indexed() { return Indexed(null); } - public ICreateColumnOptionSyntax Indexed(string indexName) + public ICreateColumnOptionBuilder Indexed(string indexName) { Expression.Column.IsIndexed = true; @@ -70,42 +72,42 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column Name = Expression.Column.Name }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } - public ICreateColumnOptionSyntax PrimaryKey() + public ICreateColumnOptionBuilder PrimaryKey() { Expression.Column.IsPrimaryKey = true; return this; } - public ICreateColumnOptionSyntax PrimaryKey(string primaryKeyName) + public ICreateColumnOptionBuilder PrimaryKey(string primaryKeyName) { Expression.Column.IsPrimaryKey = true; Expression.Column.PrimaryKeyName = primaryKeyName; return this; } - public ICreateColumnOptionSyntax Nullable() + public ICreateColumnOptionBuilder Nullable() { Expression.Column.IsNullable = true; return this; } - public ICreateColumnOptionSyntax NotNullable() + public ICreateColumnOptionBuilder NotNullable() { Expression.Column.IsNullable = false; return this; } - public ICreateColumnOptionSyntax Unique() + public ICreateColumnOptionBuilder Unique() { return Unique(null); } - public ICreateColumnOptionSyntax Unique(string indexName) + public ICreateColumnOptionBuilder Unique(string indexName) { Expression.Column.IsUnique = true; @@ -121,23 +123,23 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column Name = Expression.Column.Name }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } - public ICreateColumnOptionForeignKeyCascadeSyntax ForeignKey(string primaryTableName, string primaryColumnName) + public ICreateColumnOptionForeignKeyCascadeBuilder ForeignKey(string primaryTableName, string primaryColumnName) { return ForeignKey(null, null, primaryTableName, primaryColumnName); } - public ICreateColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableName, + public ICreateColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableName, string primaryColumnName) { return ForeignKey(foreignKeyName, null, primaryTableName, primaryColumnName); } - public ICreateColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableSchema, + public ICreateColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableSchema, string primaryTableName, string primaryColumnName) { Expression.Column.IsForeignKey = true; @@ -153,29 +155,29 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); fk.ForeignKey.ForeignColumns.Add(Expression.Column.Name); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } - public ICreateColumnOptionForeignKeyCascadeSyntax ForeignKey() + public ICreateColumnOptionForeignKeyCascadeBuilder ForeignKey() { Expression.Column.IsForeignKey = true; return this; } - public ICreateColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignTableName, string foreignColumnName) + public ICreateColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignTableName, string foreignColumnName) { return ReferencedBy(null, null, foreignTableName, foreignColumnName); } - public ICreateColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableName, + public ICreateColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableName, string foreignColumnName) { return ReferencedBy(foreignKeyName, null, foreignTableName, foreignColumnName); } - public ICreateColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableSchema, + public ICreateColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableSchema, string foreignTableName, string foreignColumnName) { var fk = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes, new ForeignKeyDefinition @@ -189,24 +191,24 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column fk.ForeignKey.PrimaryColumns.Add(Expression.Column.Name); fk.ForeignKey.ForeignColumns.Add(foreignColumnName); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } - public ICreateColumnOptionForeignKeyCascadeSyntax OnDelete(Rule rule) + public ICreateColumnOptionForeignKeyCascadeBuilder OnDelete(Rule rule) { CurrentForeignKey.OnDelete = rule; return this; } - public ICreateColumnOptionForeignKeyCascadeSyntax OnUpdate(Rule rule) + public ICreateColumnOptionForeignKeyCascadeBuilder OnUpdate(Rule rule) { CurrentForeignKey.OnUpdate = rule; return this; } - public ICreateColumnOptionSyntax OnDeleteOrUpdate(Rule rule) + public ICreateColumnOptionBuilder OnDeleteOrUpdate(Rule rule) { OnDelete(rule); OnUpdate(rule); diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs new file mode 100644 index 0000000000..fbd7387cda --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs @@ -0,0 +1,12 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Column +{ + public interface ICreateColumnOnTableBuilder : IColumnTypeBuilder + { + /// + /// Specifies the name of the table. + /// + ICreateColumnTypeBuilder OnTable(string name); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs deleted file mode 100644 index 819485b40f..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Common; - -namespace Umbraco.Core.Migrations.Expressions.Create.Column -{ - public interface ICreateColumnOnTableSyntax : IColumnTypeBuilder - { - ICreateColumnTypeSyntax OnTable(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs new file mode 100644 index 0000000000..eccaf26d89 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs @@ -0,0 +1,8 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Column +{ + public interface ICreateColumnOptionBuilder : IColumnOptionBuilder + , IExecutableBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs new file mode 100644 index 0000000000..59e714e73c --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs @@ -0,0 +1,8 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Column +{ + public interface ICreateColumnOptionForeignKeyCascadeBuilder : ICreateColumnOptionBuilder, + IForeignKeyCascadeBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs deleted file mode 100644 index 89381b16a2..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Common; - -namespace Umbraco.Core.Migrations.Expressions.Create.Column -{ - public interface ICreateColumnOptionForeignKeyCascadeSyntax : ICreateColumnOptionSyntax, - IForeignKeyCascadeBuilder - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionSyntax.cs deleted file mode 100644 index 8d0d5c8239..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Common; - -namespace Umbraco.Core.Migrations.Expressions.Create.Column -{ - public interface ICreateColumnOptionSyntax : IColumnOptionBuilder - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs similarity index 52% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeSyntax.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs index 8c2f34ab24..f9c077e838 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeSyntax.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs @@ -2,8 +2,6 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Column { - public interface ICreateColumnTypeSyntax : IColumnTypeBuilder - { - - } + public interface ICreateColumnTypeBuilder : IColumnTypeBuilder + { } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs index 6dfa1b994c..48690f4aa6 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Migrations.Expressions.Create.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Create.Expressions; namespace Umbraco.Core.Migrations.Expressions.Create.Constraint { @@ -6,27 +7,30 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Constraint ICreateConstraintOnTableBuilder, ICreateConstraintColumnsBuilder { - public CreateConstraintBuilder(CreateConstraintExpression expression) : base(expression) - { - } + public CreateConstraintBuilder(CreateConstraintExpression expression) + : base(expression) + { } + /// public ICreateConstraintColumnsBuilder OnTable(string tableName) { Expression.Constraint.TableName = tableName; return this; } - public void Column(string columnName) + /// + public IExecutableBuilder Column(string columnName) { Expression.Constraint.Columns.Add(columnName); + return new ExecutableBuilder(Expression); } - public void Columns(string[] columnNames) + /// + public IExecutableBuilder Columns(string[] columnNames) { foreach (var columnName in columnNames) - { Expression.Constraint.Columns.Add(columnName); - } + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs index f7e6f10652..fc2d2116e1 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs @@ -1,8 +1,17 @@ -namespace Umbraco.Core.Migrations.Expressions.Create.Constraint +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Constraint { public interface ICreateConstraintColumnsBuilder : IFluentBuilder { - void Column(string columnName); - void Columns(string[] columnNames); + /// + /// Specifies the constraint column. + /// + IExecutableBuilder Column(string columnName); + + /// + /// Specifies the constraint columns. + /// + IExecutableBuilder Columns(string[] columnNames); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs index b8385b7332..d6a6c9b2a8 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs @@ -2,6 +2,9 @@ { public interface ICreateConstraintOnTableBuilder : IFluentBuilder { + /// + /// Specifies the table name. + /// ICreateConstraintColumnsBuilder OnTable(string tableName); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs index 4ef90faa99..ef846052c6 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs @@ -1,21 +1,18 @@ using System; using NPoco; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Common.Expressions; using Umbraco.Core.Migrations.Expressions.Create.Column; using Umbraco.Core.Migrations.Expressions.Create.Constraint; using Umbraco.Core.Migrations.Expressions.Create.Expressions; using Umbraco.Core.Migrations.Expressions.Create.ForeignKey; using Umbraco.Core.Migrations.Expressions.Create.Index; +using Umbraco.Core.Migrations.Expressions.Create.KeysAndIndexes; using Umbraco.Core.Migrations.Expressions.Create.Table; -using Umbraco.Core.Migrations.Expressions.Execute.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Migrations.Expressions.Create { - /// - /// Implements . - /// public class CreateBuilder : ICreateBuilder { private readonly IMigrationContext _context; @@ -27,52 +24,22 @@ namespace Umbraco.Core.Migrations.Expressions.Create _supportedDatabaseTypes = supportedDatabaseTypes; } - private ISqlSyntaxProvider SqlSyntax => _context.Database.SqlContext.SqlSyntax; - /// - public void Table(bool withoutKeysAndIndexes = false) + public IExecutableBuilder Table(bool withoutKeysAndIndexes = false) { - var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(TDto), SqlSyntax); - - ExecuteSql(SqlSyntax.Format(tableDefinition)); - if (withoutKeysAndIndexes) - return; - - ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); - foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - ExecuteSql(sql); - foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - ExecuteSql(sql); + return new CreateTableOfDtoBuilder(_context, _supportedDatabaseTypes) { TypeOfDto = typeof(TDto), WithoutKeysAndIndexes = withoutKeysAndIndexes }; } /// - public void KeysAndIndexes() + public IExecutableBuilder KeysAndIndexes() { - var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(TDto), SqlSyntax); - - ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); - foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - ExecuteSql(sql); - foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - ExecuteSql(sql); + return new CreateKeysAndIndexesBuilder(_context, _supportedDatabaseTypes) { TypeOfDto = typeof(TDto) }; } /// - public void KeysAndIndexes(Type typeOfDto) + public IExecutableBuilder KeysAndIndexes(Type typeOfDto) { - var tableDefinition = DefinitionFactory.GetTableDefinition(typeOfDto, SqlSyntax); - - ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); - foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - ExecuteSql(sql); - foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - ExecuteSql(sql); - } - - private void ExecuteSql(string sql) - { - var expression = new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) { SqlStatement = sql }; - expression.Execute(); + return new CreateKeysAndIndexesBuilder(_context, _supportedDatabaseTypes) { TypeOfDto = typeOfDto }; } /// @@ -83,7 +50,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create } /// - public ICreateColumnOnTableSyntax Column(string columnName) + public ICreateColumnOnTableBuilder Column(string columnName) { var expression = new CreateColumnExpression(_context, _supportedDatabaseTypes) { Column = { Name = columnName } }; return new CreateColumnBuilder(_context, _supportedDatabaseTypes, expression); diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs index c7dd54a815..a6fb3b0e65 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Expressions public ConstraintDefinition Constraint { get; private set; } - public override string ToString() + protected override string GetSql() { var constraintType = (Constraint.IsPrimaryKeyConstraint) ? "PRIMARY KEY" : "UNIQUE"; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs index 7bc669632a..50ecc38194 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Expressions public virtual string TableName { get; set; } public virtual IList Columns { get; set; } - public override string ToString() + protected override string GetSql() { var table = new TableDefinition { Name = TableName, SchemaName = SchemaName, Columns = Columns }; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs index d7e3bc62e4..3529e12187 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs @@ -1,31 +1,38 @@ using System.Data; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Common.Expressions; namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey { public class CreateForeignKeyBuilder : ExpressionBuilderBase, - ICreateForeignKeyFromTableBuilder, - ICreateForeignKeyForeignColumnBuilder, - ICreateForeignKeyToTableBuilder, - ICreateForeignKeyPrimaryColumnBuilder, - ICreateForeignKeyCascadeBuilder + ICreateForeignKeyFromTableBuilder, + ICreateForeignKeyForeignColumnBuilder, + ICreateForeignKeyToTableBuilder, + ICreateForeignKeyPrimaryColumnBuilder, + ICreateForeignKeyCascadeBuilder { - public CreateForeignKeyBuilder(CreateForeignKeyExpression expression) : base(expression) - { - } + public CreateForeignKeyBuilder(CreateForeignKeyExpression expression) + : base(expression) + { } + /// + public void Do() => Expression.Execute(); + + /// public ICreateForeignKeyForeignColumnBuilder FromTable(string table) { Expression.ForeignKey.ForeignTable = table; return this; } + /// public ICreateForeignKeyToTableBuilder ForeignColumn(string column) { Expression.ForeignKey.ForeignColumns.Add(column); return this; } + /// public ICreateForeignKeyToTableBuilder ForeignColumns(params string[] columns) { foreach (var column in columns) @@ -33,18 +40,21 @@ namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey return this; } + /// public ICreateForeignKeyPrimaryColumnBuilder ToTable(string table) { Expression.ForeignKey.PrimaryTable = table; return this; } + /// public ICreateForeignKeyCascadeBuilder PrimaryColumn(string column) { Expression.ForeignKey.PrimaryColumns.Add(column); return this; } + /// public ICreateForeignKeyCascadeBuilder PrimaryColumns(params string[] columns) { foreach (var column in columns) @@ -52,22 +62,26 @@ namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey return this; } + /// public ICreateForeignKeyCascadeBuilder OnDelete(Rule rule) { Expression.ForeignKey.OnDelete = rule; return this; } + /// public ICreateForeignKeyCascadeBuilder OnUpdate(Rule rule) { Expression.ForeignKey.OnUpdate = rule; return this; } - public void OnDeleteOrUpdate(Rule rule) + /// + public IExecutableBuilder OnDeleteOrUpdate(Rule rule) { Expression.ForeignKey.OnDelete = rule; Expression.ForeignKey.OnUpdate = rule; + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs index ef5a2980ee..bb4d8fa248 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs @@ -1,11 +1,12 @@ using System.Data; +using Umbraco.Core.Migrations.Expressions.Common; namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey { - public interface ICreateForeignKeyCascadeBuilder : IFluentBuilder + public interface ICreateForeignKeyCascadeBuilder : IFluentBuilder, IExecutableBuilder { ICreateForeignKeyCascadeBuilder OnDelete(Rule rule); ICreateForeignKeyCascadeBuilder OnUpdate(Rule rule); - void OnDeleteOrUpdate(Rule rule); + IExecutableBuilder OnDeleteOrUpdate(Rule rule); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs index 6166cb6cda..ee4361d745 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Create.Column; using Umbraco.Core.Migrations.Expressions.Create.Constraint; using Umbraco.Core.Migrations.Expressions.Create.ForeignKey; @@ -15,17 +16,17 @@ namespace Umbraco.Core.Migrations.Expressions.Create /// /// Builds a Create Table expresion, and executes. /// - void Table(bool withoutKeysAndIndexes = false); + IExecutableBuilder Table(bool withoutKeysAndIndexes = false); /// /// Builds a Create Keys and Indexes expresion, and executes. /// - void KeysAndIndexes(); + IExecutableBuilder KeysAndIndexes(); /// /// Builds a Create Keys and Indexes expresion, and executes. /// - void KeysAndIndexes(Type typeOfDto); + IExecutableBuilder KeysAndIndexes(Type typeOfDto); /// /// Builds a Create Table expression. @@ -35,7 +36,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create /// /// Builds a Create Column expression. /// - ICreateColumnOnTableSyntax Column(string columnName); + ICreateColumnOnTableBuilder Column(string columnName); /// /// Builds a Create Foreign Key expression. diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs index 4b5cac634d..ad8ac7f22d 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs @@ -5,23 +5,28 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Migrations.Expressions.Create.Index { public class CreateIndexBuilder : ExpressionBuilderBase, - ICreateIndexForTableBuilder, - ICreateIndexOnColumnBuilder, - ICreateIndexColumnOptionsBuilder, - ICreateIndexOptionsBuilder + ICreateIndexForTableBuilder, + ICreateIndexOnColumnBuilder, + ICreateIndexColumnOptionsBuilder, + ICreateIndexOptionsBuilder { - public CreateIndexBuilder(CreateIndexExpression expression) : base(expression) - { - } + public CreateIndexBuilder(CreateIndexExpression expression) + : base(expression) + { } + + /// + public void Do() => Expression.Execute(); public IndexColumnDefinition CurrentColumn { get; set; } + /// public ICreateIndexOnColumnBuilder OnTable(string tableName) { Expression.Index.TableName = tableName; return this; } + /// public ICreateIndexColumnOptionsBuilder OnColumn(string columnName) { CurrentColumn = new IndexColumnDefinition { Name = columnName }; @@ -29,23 +34,27 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Index return this; } + /// public ICreateIndexOptionsBuilder WithOptions() { return this; } + /// public ICreateIndexOnColumnBuilder Ascending() { CurrentColumn.Direction = Direction.Ascending; return this; } + /// public ICreateIndexOnColumnBuilder Descending() { CurrentColumn.Direction = Direction.Descending; return this; } + /// ICreateIndexOnColumnBuilder ICreateIndexColumnOptionsBuilder.Unique() { Expression.Index.IsUnique = true; @@ -55,6 +64,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Index return this; } + /// public ICreateIndexOnColumnBuilder NonClustered() { Expression.Index.IndexType = IndexTypes.NonClustered; @@ -64,6 +74,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Index return this; } + /// public ICreateIndexOnColumnBuilder Clustered() { Expression.Index.IndexType = IndexTypes.Clustered; @@ -75,6 +86,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Index return this; } + /// ICreateIndexOnColumnBuilder ICreateIndexOptionsBuilder.Unique() { Expression.Index.IndexType = IndexTypes.UniqueNonClustered; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs index 3fee162b4e..b904632cc5 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs @@ -1,8 +1,17 @@ -namespace Umbraco.Core.Migrations.Expressions.Create.Index +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Index { - public interface ICreateIndexOnColumnBuilder : IFluentBuilder + public interface ICreateIndexOnColumnBuilder : IFluentBuilder, IExecutableBuilder { + /// + /// Specifies the index column. + /// ICreateIndexColumnOptionsBuilder OnColumn(string columnName); + + /// + /// Specifies options. + /// ICreateIndexOptionsBuilder WithOptions(); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs new file mode 100644 index 0000000000..3537eef11e --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs @@ -0,0 +1,41 @@ +using System; +using NPoco; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Execute.Expressions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Create.KeysAndIndexes +{ + public class CreateKeysAndIndexesBuilder : IExecutableBuilder + { + private readonly IMigrationContext _context; + private readonly DatabaseType[] _supportedDatabaseTypes; + + public CreateKeysAndIndexesBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) + { + _context = context; + _supportedDatabaseTypes = supportedDatabaseTypes; + } + + public Type TypeOfDto { get; set; } + + /// + public void Do() + { + var syntax = _context.SqlContext.SqlSyntax; + var tableDefinition = DefinitionFactory.GetTableDefinition(TypeOfDto, syntax); + + ExecuteSql(syntax.FormatPrimaryKey(tableDefinition)); + foreach (var sql in syntax.Format(tableDefinition.Indexes)) + ExecuteSql(sql); + foreach (var sql in syntax.Format(tableDefinition.ForeignKeys)) + ExecuteSql(sql); + } + + private void ExecuteSql(string sql) + { + new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) { SqlStatement = sql } + .Execute(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs index 8f73ed820a..f700230d32 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs @@ -8,9 +8,8 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Migrations.Expressions.Create.Table { public class CreateTableBuilder : ExpressionBuilderBase, - ICreateTableWithColumnBuilder, - ICreateTableColumnAsTypeSyntax, - ICreateTableColumnOptionForeignKeyCascadeBuilder + ICreateTableColumnAsTypeBuilder, + ICreateTableColumnOptionForeignKeyCascadeBuilder { private readonly IMigrationContext _context; private readonly DatabaseType[] _supportedDatabaseTypes; @@ -22,6 +21,9 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table _supportedDatabaseTypes = supportedDatabaseTypes; } + /// + public void Do() => Expression.Execute(); + public ColumnDefinition CurrentColumn { get; set; } public ForeignKeyDefinition CurrentForeignKey { get; set; } @@ -31,7 +33,8 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table return CurrentColumn; } - public ICreateTableColumnAsTypeSyntax WithColumn(string name) + /// + public ICreateTableColumnAsTypeBuilder WithColumn(string name) { var column = new ColumnDefinition { Name = name, TableName = Expression.TableName, ModificationType = ModificationType.Create }; Expression.Columns.Add(column); @@ -39,6 +42,7 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table return this; } + /// public ICreateTableColumnOptionBuilder WithDefault(SystemMethods method) { CurrentColumn.DefaultValue = method; @@ -51,17 +55,20 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table return this; } + /// public ICreateTableColumnOptionBuilder Identity() { CurrentColumn.IsIdentity = true; return this; } + /// public ICreateTableColumnOptionBuilder Indexed() { return Indexed(null); } + /// public ICreateTableColumnOptionBuilder Indexed(string indexName) { CurrentColumn.IsIndexed = true; @@ -74,15 +81,16 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table }); index.Index.Columns.Add(new IndexColumnDefinition - { - Name = CurrentColumn.Name - }); + { + Name = CurrentColumn.Name + }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } + /// public ICreateTableColumnOptionBuilder PrimaryKey() { CurrentColumn.IsPrimaryKey = true; @@ -104,12 +112,13 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table Columns = new[] { CurrentColumn.Name } } }; - _context.Expressions.Add(expression); + Expression.Expressions.Add(expression); } return this; } + /// public ICreateTableColumnOptionBuilder PrimaryKey(string primaryKeyName) { CurrentColumn.IsPrimaryKey = true; @@ -134,29 +143,33 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table Columns = new[] { CurrentColumn.Name } } }; - _context.Expressions.Add(expression); + Expression.Expressions.Add(expression); } return this; } + /// public ICreateTableColumnOptionBuilder Nullable() { CurrentColumn.IsNullable = true; return this; } + /// public ICreateTableColumnOptionBuilder NotNullable() { CurrentColumn.IsNullable = false; return this; } + /// public ICreateTableColumnOptionBuilder Unique() { return Unique(null); } + /// public ICreateTableColumnOptionBuilder Unique(string indexName) { CurrentColumn.IsUnique = true; @@ -174,22 +187,25 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table Name = CurrentColumn.Name }); - _context.Expressions.Add(index); + Expression.Expressions.Add(index); return this; } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string primaryTableName, string primaryColumnName) { return ForeignKey(null, null, primaryTableName, primaryColumnName); } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableName, string primaryColumnName) { return ForeignKey(foreignKeyName, null, primaryTableName, primaryColumnName); } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableSchema, string primaryTableName, string primaryColumnName) { @@ -207,28 +223,32 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); fk.ForeignKey.ForeignColumns.Add(CurrentColumn.Name); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey() { CurrentColumn.IsForeignKey = true; return this; } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignTableName, string foreignColumnName) { return ReferencedBy(null, null, foreignTableName, foreignColumnName); } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableName, string foreignColumnName) { return ReferencedBy(foreignKeyName, null, foreignTableName, foreignColumnName); } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableSchema, string foreignTableName, string foreignColumnName) { @@ -244,23 +264,26 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table fk.ForeignKey.PrimaryColumns.Add(CurrentColumn.Name); fk.ForeignKey.ForeignColumns.Add(foreignColumnName); - _context.Expressions.Add(fk); + Expression.Expressions.Add(fk); CurrentForeignKey = fk.ForeignKey; return this; } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder OnDelete(Rule rule) { CurrentForeignKey.OnDelete = rule; return this; } + /// public ICreateTableColumnOptionForeignKeyCascadeBuilder OnUpdate(Rule rule) { CurrentForeignKey.OnUpdate = rule; return this; } + /// public ICreateTableColumnOptionBuilder OnDeleteOrUpdate(Rule rule) { OnDelete(rule); diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs new file mode 100644 index 0000000000..98fec2e619 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs @@ -0,0 +1,47 @@ +using System; +using NPoco; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Execute.Expressions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Create.Table +{ + public class CreateTableOfDtoBuilder : IExecutableBuilder + { + private readonly IMigrationContext _context; + private readonly DatabaseType[] _supportedDatabaseTypes; + + public CreateTableOfDtoBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) + { + _context = context; + _supportedDatabaseTypes = supportedDatabaseTypes; + } + + public Type TypeOfDto { get; set; } + + public bool WithoutKeysAndIndexes { get; set; } + + /// + public void Do() + { + var syntax = _context.SqlContext.SqlSyntax; + var tableDefinition = DefinitionFactory.GetTableDefinition(TypeOfDto, syntax); + + ExecuteSql(syntax.Format(tableDefinition)); + if (WithoutKeysAndIndexes) + return; + + ExecuteSql(syntax.FormatPrimaryKey(tableDefinition)); + foreach (var sql in syntax.Format(tableDefinition.ForeignKeys)) + ExecuteSql(sql); + foreach (var sql in syntax.Format(tableDefinition.Indexes)) + ExecuteSql(sql); + } + + private void ExecuteSql(string sql) + { + new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) { SqlStatement = sql } + .Execute(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs new file mode 100644 index 0000000000..31511ddbb9 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs @@ -0,0 +1,7 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Table +{ + public interface ICreateTableColumnAsTypeBuilder : IColumnTypeBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs deleted file mode 100644 index d47a2ff363..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Common; - -namespace Umbraco.Core.Migrations.Expressions.Create.Table -{ - public interface ICreateTableColumnAsTypeSyntax : IColumnTypeBuilder - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs index 3d6f4cb3d2..542c08c978 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs @@ -5,7 +5,5 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table public interface ICreateTableColumnOptionBuilder : IColumnOptionBuilder, ICreateTableWithColumnBuilder - { - - } + { } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs index e59d4d9457..e2b7a18b68 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs @@ -5,7 +5,5 @@ namespace Umbraco.Core.Migrations.Expressions.Create.Table public interface ICreateTableColumnOptionForeignKeyCascadeBuilder : ICreateTableColumnOptionBuilder, IForeignKeyCascadeBuilder - { - - } + { } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs index 18dc02b726..0292028f2a 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs @@ -1,7 +1,9 @@ -namespace Umbraco.Core.Migrations.Expressions.Create.Table +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Table { - public interface ICreateTableWithColumnBuilder : IFluentBuilder + public interface ICreateTableWithColumnBuilder : IFluentBuilder, IExecutableBuilder { - ICreateTableColumnAsTypeSyntax WithColumn(string name); + ICreateTableColumnAsTypeBuilder WithColumn(string name); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs index b4b8a61716..696cda1506 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs @@ -1,21 +1,20 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; namespace Umbraco.Core.Migrations.Expressions.Delete.Column { - /// - /// Implements . - /// - public class DeleteColumnBuilder : ExpressionBuilderBase, IDeleteColumnBuilder + public class DeleteColumnBuilder : ExpressionBuilderBase, + IDeleteColumnBuilder { public DeleteColumnBuilder(DeleteColumnExpression expression) : base(expression) { } /// - public void FromTable(string tableName) + public IExecutableBuilder FromTable(string tableName) { Expression.TableName = tableName; - Expression.Execute(); + return new ExecutableBuilder(Expression); } /// diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs index aa872026a5..76da05f524 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.Column +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Column { /// /// Builds a Delete Column expression. @@ -6,9 +8,9 @@ public interface IDeleteColumnBuilder : IFluentBuilder { /// - /// Specifies the table of the column to delete, and execute. + /// Specifies the table of the column to delete. /// - void FromTable(string tableName); + IExecutableBuilder FromTable(string tableName); /// /// Specifies the column to delete. diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs index 640c977747..af0b0e5498 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs @@ -1,21 +1,20 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; namespace Umbraco.Core.Migrations.Expressions.Delete.Constraint { - /// - /// Implements . - /// - public class DeleteConstraintBuilder : ExpressionBuilderBase, IDeleteConstraintBuilder + public class DeleteConstraintBuilder : ExpressionBuilderBase, + IDeleteConstraintBuilder { public DeleteConstraintBuilder(DeleteConstraintExpression expression) : base(expression) { } /// - public void FromTable(string tableName) + public IExecutableBuilder FromTable(string tableName) { Expression.Constraint.TableName = tableName; - Expression.Execute(); + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs index babfd0362a..cdb107e1ab 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.Constraint +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Constraint { /// /// Builds a Delete Constraint expression. @@ -6,8 +8,8 @@ public interface IDeleteConstraintBuilder : IFluentBuilder { /// - /// Specifies the table of the constraint to delete, and executes. + /// Specifies the table of the constraint to delete. /// - void FromTable(string tableName); + IExecutableBuilder FromTable(string tableName); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs index 3893ec3812..635456b7a6 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs @@ -1,23 +1,23 @@ using System.Collections.Generic; using System.ComponentModel; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Delete.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Migrations.Expressions.Delete.Data { - /// - /// Implements . - /// - public class DeleteDataBuilder : ExpressionBuilderBase, IDeleteDataBuilder + public class DeleteDataBuilder : ExpressionBuilderBase, + IDeleteDataBuilder { public DeleteDataBuilder(DeleteDataExpression expression) : base(expression) { } /// - public void IsNull(string columnName) + public IExecutableBuilder IsNull(string columnName) { Expression.Rows.Add(new DeletionDataDefinition { new KeyValuePair(columnName, null) }); + return this; } /// @@ -28,14 +28,14 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Data } /// - public void AllRows() + public IExecutableBuilder AllRows() { Expression.IsAllRows = true; - Expression.Execute(); + return this; } /// - public void Execute() + public void Do() { Expression.Execute(); } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs index ba42dee997..043b900e75 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs @@ -1,9 +1,11 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.Data +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Data { /// - /// Builds a Delete Data expression. + /// Builds a Delete expression. /// - public interface IDeleteDataBuilder : IFluentBuilder + public interface IDeleteDataBuilder : IFluentBuilder, IExecutableBuilder { /// /// Specifies a row to be deleted. @@ -11,18 +13,13 @@ IDeleteDataBuilder Row(object dataAsAnonymousType); /// - /// Specifies that all rows must be deleted, and executes. + /// Specifies that all rows must be deleted. /// - void AllRows(); + IExecutableBuilder AllRows(); /// - /// Specifies that rows with a specified column being null must be deleted, and executes. + /// Specifies that rows with a specified column being null must be deleted. /// - void IsNull(string columnName); - - /// - /// Executes. - /// - void Execute(); + IExecutableBuilder IsNull(string columnName); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs index 299345cbb7..373b375fa8 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint { @@ -21,10 +22,10 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint } /// - public void OnColumn(string columnName) + public IExecutableBuilder OnColumn(string columnName) { Expression.ColumnName = columnName; - Expression.Execute(); + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs index d78583dcfb..2ab4a32185 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs @@ -1,13 +1,15 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint { /// - /// Builds a Delete Default Constraint On Column expression. + /// Builds a Delete expression. /// public interface IDeleteDefaultConstraintOnColumnBuilder : IFluentBuilder { /// - /// Specifies the column of the constraint to delete, and executes. + /// Specifies the column of the constraint to delete. /// - void OnColumn(string columnName); + IExecutableBuilder OnColumn(string columnName); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs index 95834bcea8..ff288cd6c8 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint { /// - /// Builds a Delete Default Constraint On Table expression. + /// Builds a Delete expression. /// public interface IDeleteDefaultConstraintOnTableBuilder : IFluentBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs index 1d4f89778a..0be9d5ace1 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs @@ -1,5 +1,5 @@ using NPoco; -using System.Linq; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Delete.Column; using Umbraco.Core.Migrations.Expressions.Delete.Constraint; using Umbraco.Core.Migrations.Expressions.Delete.Data; @@ -7,14 +7,11 @@ using Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint; using Umbraco.Core.Migrations.Expressions.Delete.Expressions; using Umbraco.Core.Migrations.Expressions.Delete.ForeignKey; using Umbraco.Core.Migrations.Expressions.Delete.Index; +using Umbraco.Core.Migrations.Expressions.Delete.KeysAndIndexes; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Migrations.Expressions.Delete { - /// - /// Implements . - /// public class DeleteBuilder : IDeleteBuilder { private readonly IMigrationContext _context; @@ -27,43 +24,16 @@ namespace Umbraco.Core.Migrations.Expressions.Delete } /// - public void Table(string tableName) + public IExecutableBuilder Table(string tableName) { var expression = new DeleteTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - expression.Execute(); + return new ExecutableBuilder(expression); } /// - public void KeysAndIndexes(string tableName = null) + public IExecutableBuilder KeysAndIndexes(string tableName = null) { - if (tableName == null) - { - // drop keys - var keys = _context.SqlContext.SqlSyntax.GetConstraintsPerTable(_context.Database).DistinctBy(x => x.Item2).ToArray(); - foreach (var key in keys.Where(x => x.Item2.StartsWith("FK_"))) - ForeignKey(key.Item2).OnTable(key.Item1); - foreach (var key in keys.Where(x => x.Item2.StartsWith("PK_"))) - PrimaryKey(key.Item2).FromTable(key.Item1); - - // drop indexes - var indexes = _context.SqlContext.SqlSyntax.GetDefinedIndexesDefinitions(_context.Database).DistinctBy(x => x.IndexName).ToArray(); - foreach (var index in indexes) - Index(index.IndexName).OnTable(index.TableName); - } - else - { - // drop keys - var keys = _context.SqlContext.SqlSyntax.GetConstraintsPerTable(_context.Database).DistinctBy(x => x.Item2).ToArray(); - foreach (var key in keys.Where(x => x.Item1 == tableName && x.Item2.StartsWith("FK_"))) - ForeignKey(key.Item2).OnTable(key.Item1); - foreach (var key in keys.Where(x => x.Item1 == tableName && x.Item2.StartsWith("PK_"))) - PrimaryKey(key.Item2).FromTable(key.Item1); - - // drop indexes - var indexes = _context.SqlContext.SqlSyntax.GetDefinedIndexesDefinitions(_context.Database).DistinctBy(x => x.IndexName).ToArray(); - foreach (var index in indexes.Where(x => x.TableName == tableName)) - Index(index.IndexName).OnTable(index.TableName); - } + return new DeleteKeysAndIndexesBuilder(_context, _supportedDatabaseTypes) { TableName = tableName }; } /// diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs index af0d687b25..0680bf54c3 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs @@ -15,9 +15,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public virtual string TableName { get; set; } public ICollection ColumnNames { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs index 594067098d..49c8f728fb 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs @@ -14,9 +14,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public ConstraintDefinition Constraint { get; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { return DatabaseType.IsMySql() diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs index 720613e110..8589a32a91 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs @@ -17,9 +17,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public List Rows { get; } = new List(); - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsAllRows) diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs index b46921c55f..9694ee5243 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs @@ -11,9 +11,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public virtual string TableName { get; set; } public virtual string ColumnName { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs index 1b306af3a7..3cd980489f 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs @@ -16,9 +16,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public ForeignKeyDefinition ForeignKey { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs index c12ea346bc..1eec61c871 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs @@ -19,9 +19,6 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public IndexDefinition Index { get; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { return string.Format(SqlSyntax.DropIndex, diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs index 915d829696..0afbba1371 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public virtual string TableName { get; set; } - public override string ToString() + protected override string GetSql() { return string.Format(SqlSyntax.DropTable, SqlSyntax.GetQuotedTableName(TableName)); diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs index 9a5f25217f..9850e914ea 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { @@ -47,24 +48,25 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey } /// - public void PrimaryColumn(string column) + public IExecutableBuilder PrimaryColumn(string column) { Expression.ForeignKey.PrimaryColumns.Add(column); - Expression.Execute(); + return new ExecutableBuilder(Expression); } /// - public void PrimaryColumns(params string[] columns) + public IExecutableBuilder PrimaryColumns(params string[] columns) { foreach (var column in columns) Expression.ForeignKey.PrimaryColumns.Add(column); - Expression.Execute(); + return new ExecutableBuilder(Expression); } /// - public void OnTable(string foreignTableName) + public IExecutableBuilder OnTable(string foreignTableName) { Expression.ForeignKey.ForeignTable = foreignTableName; + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs index 6f9e16f684..b682e68a8f 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { /// - /// Builds a Delete Foreign Key expression. + /// Builds a Delete expression. /// public interface IDeleteForeignKeyForeignColumnBuilder : IFluentBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs index 7bd16cefa2..581254a250 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { /// - /// Builds a Delete Foreign Key expression. + /// Builds a Delete expression. /// public interface IDeleteForeignKeyFromTableBuilder : IFluentBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs index 35095c6650..6a16dd9687 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs @@ -1,13 +1,15 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { /// - /// Builds a Delete Foreign Key expression. + /// Builds a Delete expression. /// public interface IDeleteForeignKeyOnTableBuilder : IFluentBuilder { /// - /// Specifies the table of the foreign key, and executes. + /// Specifies the table of the foreign key. /// - void OnTable(string foreignTableName); + IExecutableBuilder OnTable(string foreignTableName); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs index 1722c3b7f9..c579759871 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs @@ -1,18 +1,20 @@ -namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { /// - /// Builds a Delete Foreign Key expression. + /// Builds a Delete expression. /// public interface IDeleteForeignKeyPrimaryColumnBuilder : IFluentBuilder { /// - /// Specifies the target primary column, and executes. + /// Specifies the target primary column. /// - void PrimaryColumn(string column); + IExecutableBuilder PrimaryColumn(string column); /// - /// Specifies the target primary columns, and executes. + /// Specifies the target primary columns. /// - void PrimaryColumns(params string[] columns); + IExecutableBuilder PrimaryColumns(params string[] columns); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs index cd881042ee..8ae7a65f9a 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { /// - /// Builds a Delete Foreign Key expression. + /// Builds a Delete expression. /// public interface IDeleteForeignKeyToTableBuilder : IFluentBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs index 602114f14f..07faf5028e 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Column; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Delete.Column; using Umbraco.Core.Migrations.Expressions.Delete.Constraint; using Umbraco.Core.Migrations.Expressions.Delete.Data; using Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint; @@ -13,14 +14,14 @@ namespace Umbraco.Core.Migrations.Expressions.Delete public interface IDeleteBuilder : IFluentBuilder { /// - /// Specifies the table to delete, and executes. + /// Specifies the table to delete. /// - void Table(string tableName); + IExecutableBuilder Table(string tableName); /// - /// Specifies the table to delete keys and indexes for, and executes. + /// Specifies the table to delete keys and indexes for. /// - void KeysAndIndexes(string tableName = null); + IExecutableBuilder KeysAndIndexes(string tableName = null); /// /// Specifies the column to delete. diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs index 247664417f..b3cacb2f95 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs @@ -1,18 +1,19 @@ -using System; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Delete.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Migrations.Expressions.Delete.Index { - /// - /// Implements , . - /// - public class DeleteIndexBuilder : ExpressionBuilderBase, IDeleteIndexForTableBuilder, IDeleteIndexOnColumnBuilder + public class DeleteIndexBuilder : ExpressionBuilderBase, + IDeleteIndexForTableBuilder, IDeleteIndexOnColumnBuilder { public DeleteIndexBuilder(DeleteIndexExpression expression) : base(expression) { } + /// + public void Do() => Expression.Execute(); + public IndexColumnDefinition CurrentColumn { get; set; } public IDeleteIndexOnColumnBuilder OnTable(string tableName) @@ -22,19 +23,19 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Index } /// - public void OnColumn(string columnName) + public IExecutableBuilder OnColumn(string columnName) { var column = new IndexColumnDefinition { Name = columnName }; Expression.Index.Columns.Add(column); - Expression.Execute(); + return new ExecutableBuilder(Expression); } /// - public void OnColumns(params string[] columnNames) + public IExecutableBuilder OnColumns(params string[] columnNames) { foreach (string columnName in columnNames) Expression.Index.Columns.Add(new IndexColumnDefinition { Name = columnName }); - Expression.Execute(); + return new ExecutableBuilder(Expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs index 99b762a562..8501c6b02f 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Index { /// - /// Builds a Delete Index expression. + /// Builds a Delete expression. /// public interface IDeleteIndexForTableBuilder : IFluentBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs index b8eb588bed..3aa877bf8e 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs @@ -1,22 +1,23 @@ using System; +using Umbraco.Core.Migrations.Expressions.Common; namespace Umbraco.Core.Migrations.Expressions.Delete.Index { /// - /// Builds a Delete Index expression. + /// Builds a Delete expression. /// - public interface IDeleteIndexOnColumnBuilder : IFluentBuilder + public interface IDeleteIndexOnColumnBuilder : IFluentBuilder, IExecutableBuilder { /// - /// Specifies the column of the index, and executes. + /// Specifies the column of the index. /// [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] - void OnColumn(string columnName); + IExecutableBuilder OnColumn(string columnName); /// - /// Specifies the column of the index, and executes. + /// Specifies the column of the index. /// [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] - void OnColumns(params string[] columnNames); + IExecutableBuilder OnColumns(params string[] columnNames); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs new file mode 100644 index 0000000000..b77416fa14 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs @@ -0,0 +1,56 @@ +using System.Linq; +using NPoco; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Migrations.Expressions.Delete.KeysAndIndexes +{ + public class DeleteKeysAndIndexesBuilder : IExecutableBuilder + { + private readonly IMigrationContext _context; + private readonly DatabaseType[] _supportedDatabaseTypes; + + public DeleteKeysAndIndexesBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) + { + _context = context; + _supportedDatabaseTypes = supportedDatabaseTypes; + } + + public string TableName { get; set; } + + /// + public void Do() + { + if (TableName == null) + { + // drop keys + var keys = _context.SqlContext.SqlSyntax.GetConstraintsPerTable(_context.Database).DistinctBy(x => x.Item2).ToArray(); + foreach (var key in keys.Where(x => x.Item2.StartsWith("FK_"))) + Delete.ForeignKey(key.Item2).OnTable(key.Item1).Do(); + foreach (var key in keys.Where(x => x.Item2.StartsWith("PK_"))) + Delete.PrimaryKey(key.Item2).FromTable(key.Item1).Do(); + + // drop indexes + var indexes = _context.SqlContext.SqlSyntax.GetDefinedIndexesDefinitions(_context.Database).DistinctBy(x => x.IndexName).ToArray(); + foreach (var index in indexes) + Delete.Index(index.IndexName).OnTable(index.TableName).Do(); + } + else + { + // drop keys + var keys = _context.SqlContext.SqlSyntax.GetConstraintsPerTable(_context.Database).DistinctBy(x => x.Item2).ToArray(); + foreach (var key in keys.Where(x => x.Item1 == TableName && x.Item2.StartsWith("FK_"))) + Delete.ForeignKey(key.Item2).OnTable(key.Item1).Do(); + foreach (var key in keys.Where(x => x.Item1 == TableName && x.Item2.StartsWith("PK_"))) + Delete.PrimaryKey(key.Item2).FromTable(key.Item1).Do(); + + // drop indexes + var indexes = _context.SqlContext.SqlSyntax.GetDefinedIndexesDefinitions(_context.Database).DistinctBy(x => x.IndexName).ToArray(); + foreach (var index in indexes.Where(x => x.TableName == TableName)) + Delete.Index(index.IndexName).OnTable(index.TableName).Do(); + } + } + + private IDeleteBuilder Delete => new DeleteBuilder(_context, _supportedDatabaseTypes); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs deleted file mode 100644 index c21c4f9619..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Delete.Expressions; - -namespace Umbraco.Core.Migrations.Expressions.Delete.Table -{ - /// - /// Builds a Delete Table expression, and executes. - /// - public class DeleteTableBuilder : ExpressionBuilderBase - { - public DeleteTableBuilder(DeleteTableExpression expression) - : base(expression) - { - Expression.Execute(); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs index 87066ca085..7f1a01fa13 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs @@ -1,33 +1,24 @@ -using System; -using NPoco; +using NPoco; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Execute.Expressions; namespace Umbraco.Core.Migrations.Expressions.Execute { - /// - /// Implements . - /// - public class ExecuteBuilder : IExecuteBuilder + public class ExecuteBuilder : ExpressionBuilderBase, + IExecuteBuilder, IExecutableBuilder { - private readonly IMigrationContext _context; - private readonly DatabaseType[] _supportedDatabaseTypes; - public ExecuteBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) - { - _context = context; - _supportedDatabaseTypes = supportedDatabaseTypes; - } + : base(new ExecuteSqlStatementExpression(context, supportedDatabaseTypes)) + { } - public void Sql(string sqlStatement) - { - var expression = new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) {SqlStatement = sqlStatement}; - expression.Execute(); - } + /// + public void Do() => Expression.Execute(); - public void Code(Func codeStatement) + /// + public IExecutableBuilder Sql(string sqlStatement) { - var expression = new ExecuteCodeStatementExpression(_context, _supportedDatabaseTypes) { CodeStatement = codeStatement }; - _context.Expressions.Add(expression); + Expression.SqlStatement = sqlStatement; + return this; } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs deleted file mode 100644 index 1149cda9e9..0000000000 --- a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using NPoco; - -namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions -{ - public class ExecuteCodeStatementExpression : MigrationExpressionBase - { - public ExecuteCodeStatementExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public virtual Func CodeStatement { get; set; } - - public override string Process(IMigrationContext context) - { - return CodeStatement != null ? CodeStatement(context) : base.Process(context); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs index 74dfca3f37..e8ccea627f 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs @@ -10,9 +10,6 @@ namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions public virtual string SqlStatement { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs index d4dba5ced8..5747eb2c1a 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs @@ -1,4 +1,4 @@ -using System; +using Umbraco.Core.Migrations.Expressions.Common; namespace Umbraco.Core.Migrations.Expressions.Execute { @@ -9,11 +9,8 @@ namespace Umbraco.Core.Migrations.Expressions.Execute public interface IExecuteBuilder : IFluentBuilder { /// - /// Executes an Sql statement. + /// Specifies the Sql statement to execute. /// - void Sql(string sqlStatement); - - [Obsolete("kill.kill.kill")] - void Code(Func codeStatement); + IExecutableBuilder Sql(string sqlStatement); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs index 94a62c0c06..4218aeb104 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs @@ -18,9 +18,6 @@ namespace Umbraco.Core.Migrations.Expressions.Insert.Expressions public List Rows { get; } = new List(); - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs index 14dab6e0da..ad8adeb5c3 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs @@ -6,7 +6,7 @@ public interface IInsertBuilder : IFluentBuilder { /// - /// Builds an Insert Into expression. + /// Specifies the table to insert into. /// IInsertIntoBuilder IntoTable(string tableName); } diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs index 442023ea62..f1b901382e 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs @@ -1,9 +1,11 @@ -namespace Umbraco.Core.Migrations.Expressions.Insert +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Insert { /// /// Builds an Insert Into expression. /// - public interface IInsertIntoBuilder : IFluentBuilder + public interface IInsertIntoBuilder : IFluentBuilder, IExecutableBuilder { /// /// Enables identity insert. @@ -14,10 +16,5 @@ /// Specifies a row to be inserted. /// IInsertIntoBuilder Row(object dataAsAnonymousType); - - /// - /// Executes. - /// - void Execute(); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs index d17f7ff2d2..07524eac54 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs @@ -8,12 +8,16 @@ namespace Umbraco.Core.Migrations.Expressions.Insert /// /// Implements . /// - public class InsertIntoBuilder : ExpressionBuilderBase, IInsertIntoBuilder + public class InsertIntoBuilder : ExpressionBuilderBase, + IInsertIntoBuilder { public InsertIntoBuilder(InsertDataExpression expression) : base(expression) { } + /// + public void Do() => Expression.Execute(); + /// public IInsertIntoBuilder EnableIdentityInsert() { @@ -28,12 +32,6 @@ namespace Umbraco.Core.Migrations.Expressions.Insert return this; } - /// - public void Execute() - { - Expression.Execute(); - } - private static InsertionDataDefinition GetData(object dataAsAnonymousType) { var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs index 403132c222..630c813abc 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Migrations.Expressions.Rename.Column +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Column { /// /// Builds a Rename Column expression. @@ -6,8 +8,8 @@ public interface IRenameColumnToBuilder : IFluentBuilder { /// - /// Specifies the new name of the column and executes. + /// Specifies the new name of the column. /// - void To(string name); + IExecutableBuilder To(string name); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs index bf9e48017a..1f4e808e32 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs @@ -1,20 +1,23 @@ -using Umbraco.Core.Migrations.Expressions.Rename.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Rename.Expressions; namespace Umbraco.Core.Migrations.Expressions.Rename.Column { - /// - /// Implements , . - /// - public class RenameColumnBuilder : ExpressionBuilderBase, IRenameColumnToBuilder, IRenameColumnBuilder + public class RenameColumnBuilder : ExpressionBuilderBase, + IRenameColumnToBuilder, IRenameColumnBuilder, IExecutableBuilder { - public RenameColumnBuilder(RenameColumnExpression expression) : base(expression) + public RenameColumnBuilder(RenameColumnExpression expression) + : base(expression) { } /// - public void To(string name) + public void Do() => Expression.Execute(); + + /// + public IExecutableBuilder To(string name) { Expression.NewName = name; - Expression.Execute(); + return this; } /// diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs index 9ed4d97486..c56788346b 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs @@ -16,9 +16,6 @@ namespace Umbraco.Core.Migrations.Expressions.Rename.Expressions public override string Process(IMigrationContext context) => GetSql(); - public override string ToString() // fixme kill - => GetBaseSql(); - /// protected override string GetSql() { diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs index 573ac4e4b8..00763b1651 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs @@ -22,9 +22,6 @@ namespace Umbraco.Core.Migrations.Expressions.Rename.Expressions public virtual string NewName { get; set; } /// - public override string ToString() // fixme kill - => GetSql(); - /// protected override string GetSql() { diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs index 87bc85784b..ac93158508 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs @@ -9,12 +9,12 @@ namespace Umbraco.Core.Migrations.Expressions.Rename public interface IRenameBuilder : IFluentBuilder { /// - /// Builds a Rename Table expression. + /// Specifies the table to rename. /// IRenameTableBuilder Table(string oldName); /// - /// Builds a Rename Column expression. + /// Specifies the column to rename. /// IRenameColumnBuilder Column(string oldName); } diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs index dc500168ce..68a2b86aeb 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs @@ -5,9 +5,6 @@ using Umbraco.Core.Migrations.Expressions.Rename.Table; namespace Umbraco.Core.Migrations.Expressions.Rename { - /// - /// Implements . - /// public class RenameBuilder : IRenameBuilder { private readonly IMigrationContext _context; diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs index 207c447c85..6309dd0abf 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Migrations.Expressions.Rename.Table +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Table { /// /// Builds a Rename Table expression. @@ -6,8 +8,8 @@ public interface IRenameTableBuilder : IFluentBuilder { /// - /// Specifies the new name of the table and executes. + /// Specifies the new name of the table. /// - void To(string name); + IExecutableBuilder To(string name); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs index 89fa86622e..2a7f7a446a 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs @@ -1,21 +1,23 @@ -using Umbraco.Core.Migrations.Expressions.Rename.Expressions; +using Umbraco.Core.Migrations.Expressions.Common; +using Umbraco.Core.Migrations.Expressions.Rename.Expressions; namespace Umbraco.Core.Migrations.Expressions.Rename.Table { - /// - /// Implements . - /// - public class RenameTableBuilder : ExpressionBuilderBase, IRenameTableBuilder + public class RenameTableBuilder : ExpressionBuilderBase, + IRenameTableBuilder, IExecutableBuilder { public RenameTableBuilder(RenameTableExpression expression) : base(expression) { } /// - public void To(string name) + public void Do() => Expression.Execute(); + + /// + public IExecutableBuilder To(string name) { Expression.NewName = name; - Expression.Execute(); + return this; } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs index 6ce9fb7966..febdfdd34b 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs @@ -16,9 +16,6 @@ namespace Umbraco.Core.Migrations.Expressions.Update.Expressions public List> Where { get; set; } public bool IsAllRows { get; set; } - public override string ToString() // fixme kill - => GetSql(); - protected override string GetSql() { if (IsExpressionSupported() == false) diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs index cb045830cb..152dda4012 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs @@ -6,7 +6,7 @@ public interface IUpdateBuilder : IFluentBuilder { /// - /// Builds an Update Table expression. + /// Specifies the table to update. /// IUpdateTableBuilder Table(string tableName); } diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs index f0f5835356..023a62113c 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs @@ -1,7 +1,7 @@ namespace Umbraco.Core.Migrations.Expressions.Update { /// - /// Builds an Update Table expression. + /// Builds an Update expression. /// public interface IUpdateTableBuilder { diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs index 88c8936072..dc722f2f5a 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs @@ -1,18 +1,20 @@ -namespace Umbraco.Core.Migrations.Expressions.Update +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Update { /// - /// Builds an Update Table ... Where expression. + /// Builds an Update expression. /// public interface IUpdateWhereBuilder { /// - /// Specifies rows to update, and executes. + /// Specifies rows to update. /// - void Where(object dataAsAnonymousType); + IExecutableBuilder Where(object dataAsAnonymousType); /// - /// Specifies that all rows must be updated, and executes. + /// Specifies that all rows must be updated. /// - void AllRows(); + IExecutableBuilder AllRows(); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs index 9dec308a9e..eeccc05a38 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs @@ -3,9 +3,6 @@ using Umbraco.Core.Migrations.Expressions.Update.Expressions; namespace Umbraco.Core.Migrations.Expressions.Update { - /// - /// Implements . - /// public class UpdateBuilder : IUpdateBuilder { private readonly IMigrationContext _context; diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs index 501efb5056..7e327db2d7 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs @@ -1,19 +1,20 @@ using System.Collections.Generic; using System.ComponentModel; -using System.Linq; +using Umbraco.Core.Migrations.Expressions.Common; using Umbraco.Core.Migrations.Expressions.Update.Expressions; namespace Umbraco.Core.Migrations.Expressions.Update { - /// - /// Implements , / - /// - public class UpdateDataBuilder : ExpressionBuilderBase, IUpdateTableBuilder, IUpdateWhereBuilder + public class UpdateDataBuilder : ExpressionBuilderBase, + IUpdateTableBuilder, IUpdateWhereBuilder, IExecutableBuilder { public UpdateDataBuilder(UpdateDataExpression expression) : base(expression) { } + /// + public void Do() => Expression.Execute(); + /// public IUpdateWhereBuilder Set(object dataAsAnonymousType) { @@ -22,17 +23,17 @@ namespace Umbraco.Core.Migrations.Expressions.Update } /// - public void Where(object dataAsAnonymousType) + public IExecutableBuilder Where(object dataAsAnonymousType) { Expression.Where = GetData(dataAsAnonymousType); - Expression.Execute(); + return this; } /// - public void AllRows() + public IExecutableBuilder AllRows() { Expression.IsAllRows = true; - Expression.Execute(); + return this; } private static List> GetData(object dataAsAnonymousType) diff --git a/src/Umbraco.Core/Migrations/ILocalMigration.cs b/src/Umbraco.Core/Migrations/ILocalMigration.cs deleted file mode 100644 index 5822298150..0000000000 --- a/src/Umbraco.Core/Migrations/ILocalMigration.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Umbraco.Core.Migrations.Expressions.Alter; -using Umbraco.Core.Migrations.Expressions.Create; -using Umbraco.Core.Migrations.Expressions.Delete; -using Umbraco.Core.Migrations.Expressions.Execute; -using Umbraco.Core.Migrations.Expressions.Update; - -namespace Umbraco.Core.Migrations -{ - public interface ILocalMigration - { - IExecuteBuilder Execute { get; } - IDeleteBuilder Delete { get; } - IUpdateBuilder Update { get; } - IAlterBuilder Alter { get; } - ICreateBuilder Create { get; } - string GetSql(); - } -} diff --git a/src/Umbraco.Core/Migrations/IMigrationContext.cs b/src/Umbraco.Core/Migrations/IMigrationContext.cs index 335df94057..4db1b07b63 100644 --- a/src/Umbraco.Core/Migrations/IMigrationContext.cs +++ b/src/Umbraco.Core/Migrations/IMigrationContext.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Umbraco.Core.Logging; +using Umbraco.Core.Logging; using Umbraco.Core.Persistence; namespace Umbraco.Core.Migrations @@ -28,9 +27,5 @@ namespace Umbraco.Core.Migrations /// Gets the expression index. /// int Index { get; set; } - - ICollection Expressions { get; set; } // fixme kill - - ILocalMigration GetLocalMigration(); // fixme kill } } diff --git a/src/Umbraco.Core/Migrations/LocalMigration.cs b/src/Umbraco.Core/Migrations/LocalMigration.cs deleted file mode 100644 index 6e1ee1a713..0000000000 --- a/src/Umbraco.Core/Migrations/LocalMigration.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Linq; -using System.Text; -using Umbraco.Core.Logging; -using Umbraco.Core.Migrations.Expressions.Alter; -using Umbraco.Core.Migrations.Expressions.Create; -using Umbraco.Core.Migrations.Expressions.Delete; -using Umbraco.Core.Migrations.Expressions.Execute; -using Umbraco.Core.Migrations.Expressions.Update; -using Umbraco.Core.Persistence; - -namespace Umbraco.Core.Migrations -{ - internal class LocalMigration : MigrationContext, ILocalMigration - { - public LocalMigration(IUmbracoDatabase database, ILogger logger) - : base(database, logger) - { } - - public IExecuteBuilder Execute => new ExecuteBuilder(this); - - public IDeleteBuilder Delete => new DeleteBuilder(this); - - public IUpdateBuilder Update => new UpdateBuilder(this); - - public IAlterBuilder Alter => new AlterBuilder(this); - - public ICreateBuilder Create => new CreateBuilder(this); - - public string GetSql() - { - var sb = new StringBuilder(); - foreach (var sql in Expressions.Select(x => x.Process(this))) - { - sb.Append(sql); - sb.AppendLine(); - sb.AppendLine("GO"); - } - return sb.ToString(); - } - } -} diff --git a/src/Umbraco.Core/Migrations/MigrationContext.cs b/src/Umbraco.Core/Migrations/MigrationContext.cs index e996fe0410..d0802c813d 100644 --- a/src/Umbraco.Core/Migrations/MigrationContext.cs +++ b/src/Umbraco.Core/Migrations/MigrationContext.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; @@ -10,7 +8,6 @@ namespace Umbraco.Core.Migrations { public MigrationContext(IUmbracoDatabase database, ILogger logger) { - Expressions = new Collection(); Database = database ?? throw new ArgumentNullException(nameof(database)); Logger = logger ?? throw new ArgumentNullException(nameof(logger)); } @@ -22,9 +19,5 @@ namespace Umbraco.Core.Migrations public ISqlContext SqlContext => Database.SqlContext; public int Index { get; set; } - - public ICollection Expressions { get; set; } // fixme kill - - public ILocalMigration GetLocalMigration() => new LocalMigration(Database, Logger); // fixme kill } } diff --git a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs index 3addba1075..902c1e8ca4 100644 --- a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -15,6 +16,7 @@ namespace Umbraco.Core.Migrations public abstract class MigrationExpressionBase : IMigrationExpression { private bool _executed; + private List _expressions; protected MigrationExpressionBase(IMigrationContext context, DatabaseType[] supportedDatabaseTypes = null) { @@ -32,6 +34,8 @@ namespace Umbraco.Core.Migrations public DatabaseType DatabaseType => Context.Database.DatabaseType; + public List Expressions => _expressions ?? (_expressions = new List()); + public DatabaseType[] SupportedDatabaseTypes { get; } public bool IsExpressionSupported() // fixme - do we need this?! @@ -93,6 +97,12 @@ namespace Umbraco.Core.Migrations } Context.Index++; + + if (_expressions == null) + return; + + foreach (var expression in _expressions) + expression.Execute(); } private void ExecuteStatement(StringBuilder stmtBuilder) diff --git a/src/Umbraco.Core/Migrations/MigrationRunner.cs b/src/Umbraco.Core/Migrations/MigrationRunner.cs index f683747ac2..ff8f0314fc 100644 --- a/src/Umbraco.Core/Migrations/MigrationRunner.cs +++ b/src/Umbraco.Core/Migrations/MigrationRunner.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; using Semver; using Umbraco.Core.Events; using Umbraco.Core.Exceptions; @@ -63,12 +61,9 @@ namespace Umbraco.Core.Migrations return false; } - //Loop through migrations to generate sql - InitializeMigrations(migrations, isUpgrade); - try { - ExecuteMigrations(migrationContext); + ExecuteMigrations(migrationContext, migrations, isUpgrade); } catch (Exception ex) { @@ -152,96 +147,21 @@ namespace Umbraco.Core.Migrations return _migrations ?? _builder.CreateCollection(context).ToArray(); } - internal void InitializeMigrations( - List migrations, - bool isUpgrade = true) + internal void ExecuteMigrations(IMigrationContext context, IEnumerable migrations, bool isUp = true) { - foreach (var migration in migrations) + using (var transaction = context.Database.GetTransaction()) // fixme scope? { - if (isUpgrade) + foreach (var migration in migrations) { - migration.Up(); - _logger.Info($"Added UPGRADE migration '{migration.GetType().Name}' to context"); + if (isUp) migration.Up(); + else migration.Down(); } - else - { - migration.Down(); - _logger.Info($"Added DOWNGRADE migration '{migration.GetType().Name}' to context"); - } - } - } - - private void ExecuteMigrations(IMigrationContext context) - { - //Transactional execution of the sql that was generated from the found migrations - using (var transaction = context.Database.GetTransaction()) - { - int i = 1; - foreach (var expression in context.Expressions) - { - var sql = expression.Process(context); - if (string.IsNullOrEmpty(sql)) - { - i++; - continue; - } - - //TODO: We should output all of these SQL calls to files in a migration folder in App_Data/TEMP - // so if people want to executed them manually on another environment, they can. - - //The following ensures the multiple statement sare executed one at a time, this is a requirement - // of SQLCE, it's unfortunate but necessary. - // http://stackoverflow.com/questions/13665491/sql-ce-inconsistent-with-multiple-statements - var sb = new StringBuilder(); - using (var reader = new StringReader(sql)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - line = line.Trim(); - if (line.Equals("GO", StringComparison.OrdinalIgnoreCase)) - { - //Execute the SQL up to the point of a GO statement - var exeSql = sb.ToString(); - _logger.Info("Executing sql statement " + i + ": " + exeSql); - Console.WriteLine("EXEC: " + exeSql); - context.Database.Execute(exeSql); - - //restart the string builder - sb.Remove(0, sb.Length); - } - else - { - sb.AppendLine(line); - } - } - //execute anything remaining - if (sb.Length > 0) - { - var exeSql = sb.ToString(); - _logger.Info("Executing sql statement " + i + ": " + exeSql); - Console.WriteLine("EXEC: " + exeSql); - context.Database.Execute(exeSql); - } - } - - i++; - } + var exists = _migrationEntryService.FindEntry(_productName, _targetVersion); // fixme refactor + if (exists == null) + _migrationEntryService.CreateEntry(_productName, _targetVersion); transaction.Complete(); - - //Now that this is all complete, we need to add an entry to the migrations table flagging that migrations - // for this version have executed. - //NOTE: We CANNOT do this as part of the transaction!!! This is because when upgrading to 7.3, we cannot - // create the migrations table and then add data to it in the same transaction without issuing things like GO - // commands and since we need to support all Dbs, we need to just do this after the fact. - var exists = _migrationEntryService.FindEntry(_productName, _targetVersion); - if (exists == null) - { - _migrationEntryService.CreateEntry(_productName, _targetVersion); - } - } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddContentNuTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddContentNuTable.cs index d75fc70156..02ceb636ec 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddContentNuTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddContentNuTable.cs @@ -22,11 +22,13 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight .WithColumn("nodeId").AsInt32().NotNullable() .WithColumn("published").AsBoolean().NotNullable() .WithColumn("data").AsCustom(textType).NotNullable() - .WithColumn("rv").AsInt64().NotNullable().WithDefaultValue(0); + .WithColumn("rv").AsInt64().NotNullable().WithDefaultValue(0) + .Do(); Create.PrimaryKey("PK_cmsContentNu") .OnTable("cmsContentNu") - .Columns(new[] { "nodeId", "published" }); + .Columns(new[] { "nodeId", "published" }) + .Do(); Create.ForeignKey("FK_cmsContentNu_umbracoNode_id") .FromTable("cmsContentNu") @@ -34,7 +36,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight .ToTable("umbracoNode") .PrimaryColumn("id") .OnDelete(Rule.Cascade) - .OnUpdate(Rule.None); + .OnUpdate(Rule.None) + .Do(); } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockObjects.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockObjects.cs index fe35519e86..334d62aa4f 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockObjects.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockObjects.cs @@ -29,17 +29,13 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight private void EnsureLockObject(int id, string name) { - Execute.Code(context => - { - var db = context.Database; - var exists = db.Exists(id); - if (exists) return string.Empty; - // be safe: delete old umbracoNode lock objects if any - db.Execute($"DELETE FROM umbracoNode WHERE id={id};"); - // then create umbracoLock object - db.Execute($"INSERT umbracoLock (id, name, value) VALUES ({id}, '{name}', 1);"); - return string.Empty; - }); + var db = Database; + var exists = db.Exists(id); + if (exists) return; + // be safe: delete old umbracoNode lock objects if any + db.Execute($"DELETE FROM umbracoNode WHERE id={id};"); + // then create umbracoLock object + db.Execute($"INSERT umbracoLock (id, name, value) VALUES ({id}, '{name}', 1);"); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockTable.cs index f459de8c66..6a29b72543 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddLockTable.cs @@ -17,7 +17,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight Create.Table("umbracoLock") .WithColumn("id").AsInt32().PrimaryKey("PK_umbracoLock") .WithColumn("value").AsInt32().NotNullable() - .WithColumn("name").AsString(64).NotNullable(); + .WithColumn("name").AsString(64).NotNullable() + .Do(); } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddRedirectUrlTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddRedirectUrlTable.cs index 48b0aeffc2..52ac789493 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddRedirectUrlTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/AddRedirectUrlTable.cs @@ -11,15 +11,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight public override void Up() { - // defer, because we are making decisions based upon what's in the database - Execute.Code(MigrationCode); - } - - private string MigrationCode(IMigrationContext context) - { - var database = context.Database; + var database = Database; var umbracoRedirectUrlTableName = "umbracoRedirectUrl"; - var local = Context.GetLocalMigration(); var tables = SqlSyntax.GetTablesInSchema(database).ToArray(); @@ -27,31 +20,32 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight { var columns = SqlSyntax.GetColumnsInSchema(database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals(umbracoRedirectUrlTableName) && x.ColumnName.InvariantEquals("id") && x.DataType == "uniqueidentifier")) - return null; - local.Delete.Table(umbracoRedirectUrlTableName); + return; + Delete.Table(umbracoRedirectUrlTableName).Do(); } - local.Create.Table(umbracoRedirectUrlTableName) + 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(); + .WithColumn("urlHash").AsString(40).NotNullable() + .Do(); - local.Create.Index("IX_" + umbracoRedirectUrlTableName).OnTable(umbracoRedirectUrlTableName) + Create.Index("IX_" + umbracoRedirectUrlTableName).OnTable(umbracoRedirectUrlTableName) .OnColumn("urlHash") .Ascending() .OnColumn("contentKey") .Ascending() .OnColumn("createDateUtc") .Descending() - .WithOptions().NonClustered(); + .WithOptions().NonClustered() + .Do(); - local.Create.ForeignKey("FK_" + umbracoRedirectUrlTableName) + Create.ForeignKey("FK_" + umbracoRedirectUrlTableName) .FromTable(umbracoRedirectUrlTableName).ForeignColumn("contentKey") - .ToTable("umbracoNode").PrimaryColumn("uniqueID"); - - return local.GetSql(); + .ToTable("umbracoNode").PrimaryColumn("uniqueID") + .Do(); } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/RefactorXmlColumns.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/RefactorXmlColumns.cs index 1226c0c344..f0d1bf57c1 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/RefactorXmlColumns.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/RefactorXmlColumns.cs @@ -15,18 +15,19 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight public override void Up() { if (ColumnExists("cmsContentXml", "Rv") == false) - Alter.Table("cmsContentXml").AddColumn("Rv").AsInt64().NotNullable().WithDefaultValue(0); + Alter.Table("cmsContentXml").AddColumn("Rv").AsInt64().NotNullable().WithDefaultValue(0).Do(); if (ColumnExists("cmsPreviewXml", "Rv") == false) - Alter.Table("cmsPreviewXml").AddColumn("Rv").AsInt64().NotNullable().WithDefaultValue(0); + Alter.Table("cmsPreviewXml").AddColumn("Rv").AsInt64().NotNullable().WithDefaultValue(0).Do(); // remove the any PK_ and the FK_ to cmsContentVersion.VersionId if (DatabaseType.IsMySql()) { - Delete.PrimaryKey("PK_cmsPreviewXml").FromTable("cmsPreviewXml"); + Delete.PrimaryKey("PK_cmsPreviewXml").FromTable("cmsPreviewXml").Do(); Delete.ForeignKey().FromTable("cmsPreviewXml").ForeignColumn("VersionId") - .ToTable("cmsContentVersion").PrimaryColumn("VersionId"); + .ToTable("cmsContentVersion").PrimaryColumn("VersionId") + .Do(); } else { @@ -41,28 +42,30 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight continue; } dups.Add(keyName); - Delete.PrimaryKey(c.Item3).FromTable(c.Item1); + Delete.PrimaryKey(c.Item3).FromTable(c.Item1).Do(); } foreach (var c in constraints.Where(x => x.Item1.InvariantEquals("cmsPreviewXml") && x.Item3.InvariantStartsWith("FK_cmsPreviewXml_cmsContentVersion"))) { Delete.ForeignKey().FromTable("cmsPreviewXml").ForeignColumn("VersionId") - .ToTable("cmsContentVersion").PrimaryColumn("VersionId"); + .ToTable("cmsContentVersion").PrimaryColumn("VersionId") + .Do(); } } if (ColumnExists("cmsPreviewXml", "Timestamp")) - Delete.Column("Timestamp").FromTable("cmsPreviewXml"); + Delete.Column("Timestamp").FromTable("cmsPreviewXml").Do(); if (ColumnExists("cmsPreviewXml", "VersionId")) { RemoveDuplicates(); - Delete.Column("VersionId").FromTable("cmsPreviewXml"); + Delete.Column("VersionId").FromTable("cmsPreviewXml").Do(); } // re-create the primary key Create.PrimaryKey("PK_cmsPreviewXml") .OnTable("cmsPreviewXml") - .Columns(new[] { "nodeId" }); + .Columns(new[] { "nodeId" }) + .Do(); } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs index ceb4e2d486..3a6f04245b 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using Umbraco.Core.Migrations.Expressions.Execute; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; @@ -24,7 +23,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight public override void Up() { // delete *all* keys and indexes - because of FKs - Delete.KeysAndIndexes(); + Delete.KeysAndIndexes().Do(); MigratePropertyData(); MigrateContentAndPropertyTypes(); @@ -54,7 +53,7 @@ HAVING COUNT(v2.id) <> 1").Any()) // re-create *all* keys and indexes foreach (var x in DatabaseSchemaCreator.OrderedTables) - Create.KeysAndIndexes(x.Value); + Create.KeysAndIndexes(x.Value).Do(); } private void MigratePropertyData() @@ -84,21 +83,21 @@ HAVING COUNT(v2.id) <> 1").Any()) // transform column versionId from guid to integer (contentVersion.id) if (ColumnType(PreTables.PropertyData, "versionId") == "uniqueidentifier") { - Execute.Sql($"ALTER TABLE {PreTables.PropertyData} ADD COLUMN versionId2 INT NULL;"); + Database.Execute($"ALTER TABLE {PreTables.PropertyData} ADD COLUMN versionId2 INT NULL;"); // SQLCE does not support UPDATE...FROM var temp = Database.Fetch($"SELECT id, versionId FROM {PreTables.ContentVersion}"); foreach (var t in temp) Database.Execute($"UPDATE {PreTables.PropertyData} SET versionId2=@v2 WHERE versionId=@v1", new { v1 = t.versionId, v2 = t.id }); - Delete.Column("versionId").FromTable(PreTables.PropertyData); + Delete.Column("versionId").FromTable(PreTables.PropertyData).Do(); ReplaceColumn(PreTables.PropertyData, "versionId2", "versionId"); } // drop column if (ColumnExists(PreTables.PropertyData, "contentNodeId")) - Delete.Column("contentNodeId").FromTable(PreTables.PropertyData); + Delete.Column("contentNodeId").FromTable(PreTables.PropertyData).Do(); // rename table - Rename.Table(PreTables.PropertyData).To(Constants.DatabaseSchema.Tables.PropertyData); + Rename.Table(PreTables.PropertyData).To(Constants.DatabaseSchema.Tables.PropertyData).Do(); } private void MigrateContentAndPropertyTypes() @@ -121,10 +120,10 @@ HAVING COUNT(v2.id) <> 1").Any()) // drop columns if (ColumnExists(PreTables.Content, "pk")) - Delete.Column("pk").FromTable(PreTables.Content); + Delete.Column("pk").FromTable(PreTables.Content).Do(); // rename table - Rename.Table(PreTables.Content).To(Constants.DatabaseSchema.Tables.Content); + Rename.Table(PreTables.Content).To(Constants.DatabaseSchema.Tables.Content).Do(); } private void MigrateVersions() @@ -149,14 +148,14 @@ HAVING COUNT(v2.id) <> 1").Any()) if (!ColumnExists(PreTables.ContentVersion, "current")) { AddColumn(PreTables.ContentVersion, "current", out var sqls); - Execute.Sql($@"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET {SqlSyntax.GetQuotedColumnName("current")}=0"); - foreach (var sql in sqls) Execute.Sql(sql); + Database.Execute($@"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET {SqlSyntax.GetQuotedColumnName("current")}=0"); + foreach (var sql in sqls) Database.Execute(sql); } if (!ColumnExists(PreTables.ContentVersion, "userId")) { AddColumn(PreTables.ContentVersion, "userId", out var sqls); - Execute.Sql($@"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET userId=0"); - foreach (var sql in sqls) Execute.Sql(sql); + Database.Execute($@"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET userId=0"); + foreach (var sql in sqls) Database.Execute(sql); } // rename contentVersion contentId column @@ -182,10 +181,10 @@ WHERE cver.versionId NOT IN (SELECT versionId FROM {SqlSyntax.GetQuotedTableName new { text = t.text, versionId=t.versionId }); // create table - Create.Table(withoutKeysAndIndexes: true); + Create.Table(withoutKeysAndIndexes: true).Do(); // every document row becomes a document version - Execute.Sql($@"INSERT INTO {SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DocumentVersion)} (id, templateId, published) + Database.Execute($@"INSERT INTO {SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DocumentVersion)} (id, templateId, published) SELECT cver.id, doc.templateId, doc.published FROM {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} cver JOIN {SqlSyntax.GetQuotedTableName(PreTables.Document)} doc ON doc.nodeId=cver.nodeId AND doc.versionId=cver.versionId"); @@ -219,23 +218,23 @@ VALUES (@id, @templateId, 0)", new { id=id, templateId=t.templateId }); } // reduce document to 1 row per content - Execute.Sql($@"DELETE FROM {PreTables.Document} + Database.Execute($@"DELETE FROM {PreTables.Document} WHERE versionId NOT IN (SELECT (versionId) FROM {PreTables.ContentVersion} WHERE {SqlSyntax.GetQuotedColumnName("current")} = 1) AND (published<>1 OR newest<>1)"); // drop some document columns - Delete.Column("text").FromTable(PreTables.Document); - Delete.Column("templateId").FromTable(PreTables.Document); - Delete.Column("documentUser").FromTable(PreTables.Document); - Delete.Column("updateDate").FromTable(PreTables.Document); - Delete.Column("versionId").FromTable(PreTables.Document); - Delete.Column("newest").FromTable(PreTables.Document); + Delete.Column("text").FromTable(PreTables.Document).Do(); + Delete.Column("templateId").FromTable(PreTables.Document).Do(); + Delete.Column("documentUser").FromTable(PreTables.Document).Do(); + Delete.Column("updateDate").FromTable(PreTables.Document).Do(); + Delete.Column("versionId").FromTable(PreTables.Document).Do(); + Delete.Column("newest").FromTable(PreTables.Document).Do(); // add and populate edited column if (!ColumnExists(PreTables.Document, "edited")) { AddColumn(PreTables.Document, "edited", out var sqls); - Execute.Sql($"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.Document)} SET edited=0"); - foreach (var sql in sqls) Execute.Sql(sql); + Database.Execute($"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.Document)} SET edited=0"); + foreach (var sql in sqls) Database.Execute(sql); } // set 'edited' to true whenever a 'non-published' property data is != a published one @@ -258,11 +257,11 @@ WHERE v1.propertyTypeId=v2.propertyTypeId AND v1.languageId=v2.languageId AND v1 Database.Execute("UPDATE {SqlSyntax.GetQuotedTableName(PreTables.Document)} SET edited=1 WHERE nodeId=@nodeIdd", new { t.id }); // drop more columns - Delete.Column("versionId").FromTable(PreTables.ContentVersion); + Delete.Column("versionId").FromTable(PreTables.ContentVersion).Do(); // rename tables - Rename.Table(PreTables.ContentVersion).To(Constants.DatabaseSchema.Tables.ContentVersion); - Rename.Table(PreTables.Document).To(Constants.DatabaseSchema.Tables.Document); + Rename.Table(PreTables.ContentVersion).To(Constants.DatabaseSchema.Tables.ContentVersion).Do(); + Rename.Table(PreTables.Document).To(Constants.DatabaseSchema.Tables.Document).Do(); } private static class PreTables @@ -335,7 +334,7 @@ WHERE v1.propertyTypeId=v2.propertyTypeId AND v1.languageId=v2.languageId AND v1 private void AddColumn(string tableName, string columnName) { AddColumn(tableName, columnName, out var sqls); - foreach (var sql in sqls) Execute.Sql(sql); + foreach (var sql in sqls) Database.Execute(sql); } private void AddColumn(string tableName, string columnName, out IEnumerable sqls) @@ -346,15 +345,15 @@ WHERE v1.propertyTypeId=v2.propertyTypeId AND v1.languageId=v2.languageId AND v1 var table = DefinitionFactory.GetTableDefinition(typeof(T), SqlSyntax); var column = table.Columns.First(x => x.Name == columnName); var createSql = SqlSyntax.Format(column, SqlSyntax.GetQuotedTableName(tableName), out sqls); - Execute.Sql(string.Format(SqlSyntax.AddColumn, SqlSyntax.GetQuotedTableName(tableName), createSql)); + Database.Execute(string.Format(SqlSyntax.AddColumn, SqlSyntax.GetQuotedTableName(tableName), createSql)); } private void ReplaceColumn(string tableName, string currentName, string newName) { AddColumn(tableName, newName, out var sqls); - Execute.Sql($"UPDATE {SqlSyntax.GetQuotedTableName(tableName)} SET {SqlSyntax.GetQuotedColumnName(newName)}={SqlSyntax.GetQuotedColumnName(currentName)}"); - foreach (var sql in sqls) Execute.Sql(sql); - Delete.Column(currentName).FromTable(tableName); + Database.Execute($"UPDATE {SqlSyntax.GetQuotedTableName(tableName)} SET {SqlSyntax.GetQuotedColumnName(newName)}={SqlSyntax.GetQuotedColumnName(currentName)}"); + foreach (var sql in sqls) Database.Execute(sql); + Delete.Column(currentName).FromTable(tableName).Do(); } private bool TableExists(string tableName) diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockObjects.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockObjects.cs index b2a02cfa1e..c638cd5ceb 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockObjects.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockObjects.cs @@ -21,17 +21,13 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenFiveFive private void EnsureLockObject(int id, string name) { - Execute.Code(context => - { - var db = context.Database; - var exists = db.Exists(id); - if (exists) return string.Empty; - // be safe: delete old umbracoNode lock objects if any - db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); - // then create umbracoLock object - db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, @name, 1);", new { id, name }); - return string.Empty; - }); + var db = Database; + var exists = db.Exists(id); + if (exists) return; + // be safe: delete old umbracoNode lock objects if any + db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); + // then create umbracoLock object + db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, @name, 1);", new { id, name }); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockTable.cs index 092ded50d0..66b0b2f6e3 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/AddLockTable.cs @@ -17,7 +17,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenFiveFive Create.Table("umbracoLock") .WithColumn("id").AsInt32().PrimaryKey("PK_umbracoLock") .WithColumn("value").AsInt32().NotNullable() - .WithColumn("name").AsString(64).NotNullable(); + .WithColumn("name").AsString(64).NotNullable() + .Do(); } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/UpdateAllowedMediaTypesAtRoot.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/UpdateAllowedMediaTypesAtRoot.cs index 15d5709662..a9ec92939e 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/UpdateAllowedMediaTypesAtRoot.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveFive/UpdateAllowedMediaTypesAtRoot.cs @@ -12,7 +12,7 @@ public override void Up() { - Execute.Sql("UPDATE cmsContentType SET allowAtRoot = 1 WHERE nodeId = 1032 OR nodeId = 1033"); + Database.Execute("UPDATE cmsContentType SET allowAtRoot = 1 WHERE nodeId = 1032 OR nodeId = 1033"); } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs index dfffb2cd34..8d358c066d 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/RemoveStylesheetDataAndTablesAgain.cs @@ -15,32 +15,22 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenFiveZero public override void Up() { - // defer, because we are making decisions based upon what's in the database - Execute.Code(MigrationCode); - } - - private string MigrationCode(IMigrationContext context) - { - var local = Context.GetLocalMigration(); - //Clear all stylesheet data if the tables exist var tables = SqlSyntax.GetTablesInSchema(Context.Database).ToArray(); if (tables.InvariantContains("cmsStylesheetProperty")) { - local.Delete.FromTable("cmsStylesheetProperty").AllRows(); - local.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = Constants.ObjectTypes.StylesheetProperty }); + Delete.FromTable("cmsStylesheetProperty").AllRows().Do(); + Delete.FromTable("umbracoNode").Row(new { nodeObjectType = Constants.ObjectTypes.StylesheetProperty }).Do(); - local.Delete.Table("cmsStylesheetProperty"); + Delete.Table("cmsStylesheetProperty").Do(); } if (tables.InvariantContains("cmsStylesheet")) { - local.Delete.FromTable("cmsStylesheet").AllRows(); - local.Delete.FromTable("umbracoNode").Row(new { nodeObjectType = Constants.ObjectTypes.Stylesheet }); + Delete.FromTable("cmsStylesheet").AllRows().Do(); + Delete.FromTable("umbracoNode").Row(new { nodeObjectType = Constants.ObjectTypes.Stylesheet }).Do(); - local.Delete.Table("cmsStylesheet"); + Delete.Table("cmsStylesheet").Do(); } - - return local.GetSql(); } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/UpdateUniqueIndexOnPropertyData.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/UpdateUniqueIndexOnPropertyData.cs index ae47a66f13..d08da84ac4 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/UpdateUniqueIndexOnPropertyData.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenFiveZero/UpdateUniqueIndexOnPropertyData.cs @@ -38,24 +38,25 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenFiveZero "id", Sql("SELECT MIN(id) FROM cmsPropertyData GROUP BY nodeId, versionId, propertytypeid HAVING MIN(id) IS NOT NULL"), WhereInType.NotIn); - Execute.Sql(delPropQry.SQL); + Database.Execute(delPropQry.SQL); } else { //NOTE: Even though the above will work for MSSQL, we are not going to execute the // nested delete sub query logic since it will be slower and there could be a ton of property // data here so needs to be as fast as possible. - Execute.Sql("DELETE FROM cmsPropertyData WHERE id NOT IN (SELECT MIN(id) FROM cmsPropertyData GROUP BY nodeId, versionId, propertytypeid HAVING MIN(id) IS NOT NULL)"); + Database.Execute("DELETE FROM cmsPropertyData WHERE id NOT IN (SELECT MIN(id) FROM cmsPropertyData GROUP BY nodeId, versionId, propertytypeid HAVING MIN(id) IS NOT NULL)"); } //we need to re create this index - Delete.Index("IX_cmsPropertyData_1").OnTable("cmsPropertyData"); + Delete.Index("IX_cmsPropertyData_1").OnTable("cmsPropertyData").Do(); Create.Index("IX_cmsPropertyData_1").OnTable("cmsPropertyData") .OnColumn("nodeId").Ascending() .OnColumn("versionId").Ascending() .OnColumn("propertytypeid").Ascending() .WithOptions().NonClustered() - .WithOptions().Unique(); + .WithOptions().Unique() + .Do(); } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddIndexToDictionaryKeyColumn.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddIndexToDictionaryKeyColumn.cs index ff3133e335..8cbe349b2e 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddIndexToDictionaryKeyColumn.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddIndexToDictionaryKeyColumn.cs @@ -12,43 +12,35 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero public override void Up() { - Execute.Code(context => + var database = Database; + //Now we need to check if we can actually do this because we won't be able to if there's data in there that is too long + var colLen = (SqlSyntax is MySqlSyntaxProvider) + ? database.ExecuteScalar(string.Format("select max(LENGTH({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))) + : database.ExecuteScalar(string.Format("select max(datalength({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))); + + if (colLen < 900 == false && colLen != null) { - var database = context.Database; - //Now we need to check if we can actually do this because we won't be able to if there's data in there that is too long - var colLen = (SqlSyntax is MySqlSyntaxProvider) - ? database.ExecuteScalar(string.Format("select max(LENGTH({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))) - : database.ExecuteScalar(string.Format("select max(datalength({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))); + return; + } - if (colLen < 900 == false && colLen != null) - { - return null; - } + var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(Context.Database); - var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(Context.Database); - - //make sure it doesn't already exist - if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsDictionary_key")) == false) - { - var local = Context.GetLocalMigration(); - - //we can apply the index - local.Create.Index("IX_cmsDictionary_key").OnTable("cmsDictionary") - .OnColumn("key") - .Ascending() - .WithOptions() - .NonClustered(); - - return local.GetSql(); - } - - return null; - }); + //make sure it doesn't already exist + if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsDictionary_key")) == false) + { + //we can apply the index + Create.Index("IX_cmsDictionary_key").OnTable("cmsDictionary") + .OnColumn("key") + .Ascending() + .WithOptions() + .NonClustered() + .Do(); + } } public override void Down() { - Delete.Index("IX_cmsDictionary_key").OnTable("cmsDictionary"); + Delete.Index("IX_cmsDictionary_key").OnTable("cmsDictionary").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserGroupTables.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserGroupTables.cs index 1390fe8df2..af308f1079 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserGroupTables.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserGroupTables.cs @@ -52,7 +52,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero { //before we add any foreign key we need to make sure there's no stale data in there which would have happened in the beta //release if a start node was assigned and then that start node was deleted. - Execute.Sql(@"UPDATE umbracoUserGroup SET startContentId = NULL WHERE startContentId NOT IN (SELECT id FROM umbracoNode)"); + Database.Execute(@"UPDATE umbracoUserGroup SET startContentId = NULL WHERE startContentId NOT IN (SELECT id FROM umbracoNode)"); Create.ForeignKey("FK_startContentId_umbracoNode_id") .FromTable("umbracoUserGroup") @@ -60,7 +60,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero .ToTable("umbracoNode") .PrimaryColumn("id") .OnDelete(Rule.None) - .OnUpdate(Rule.None); + .OnUpdate(Rule.None) + .Do(); } if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUserGroup") @@ -69,7 +70,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero { //before we add any foreign key we need to make sure there's no stale data in there which would have happened in the beta //release if a start node was assigned and then that start node was deleted. - Execute.Sql(@"UPDATE umbracoUserGroup SET startMediaId = NULL WHERE startMediaId NOT IN (SELECT id FROM umbracoNode)"); + Database.Execute(@"UPDATE umbracoUserGroup SET startMediaId = NULL WHERE startMediaId NOT IN (SELECT id FROM umbracoNode)"); Create.ForeignKey("FK_startMediaId_umbracoNode_id") .FromTable("umbracoUserGroup") @@ -77,7 +78,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero .ToTable("umbracoNode") .PrimaryColumn("id") .OnDelete(Rule.None) - .OnUpdate(Rule.None); + .OnUpdate(Rule.None) + .Do(); } } } @@ -100,7 +102,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero && x.TableName.Equals("umbracoUser2userGroup", StringComparison.InvariantCultureIgnoreCase)); if (foundOldColumn != null) { - Delete.Table("umbracoUser2userGroup"); + Delete.Table("umbracoUser2userGroup").Do(); //remove from the tables list since this will be re-checked in further logic tables.Remove("umbracoUser2userGroup"); } @@ -113,7 +115,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero .Count(x => x.TableName.Equals("umbracoUserGroup", StringComparison.InvariantCultureIgnoreCase)); if (countOfCols == 2) { - Delete.Table("umbracoUserGroup"); + Delete.Table("umbracoUserGroup").Do(); //remove from the tables list since this will be re-checked in further logic tables.Remove("umbracoUserGroup"); } @@ -122,10 +124,10 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero private void SetDefaultIcons() { - Execute.Sql($"UPDATE umbracoUserGroup SET icon = \'\' WHERE userGroupAlias = \'{Constants.Security.AdminGroupAlias}\'"); - Execute.Sql("UPDATE umbracoUserGroup SET icon = \'icon-edit\' WHERE userGroupAlias = \'writer\'"); - Execute.Sql("UPDATE umbracoUserGroup SET icon = \'icon-tools\' WHERE userGroupAlias = \'editor\'"); - Execute.Sql("UPDATE umbracoUserGroup SET icon = \'icon-globe\' WHERE userGroupAlias = \'translator\'"); + Database.Execute($"UPDATE umbracoUserGroup SET icon = \'\' WHERE userGroupAlias = \'{Constants.Security.AdminGroupAlias}\'"); + Database.Execute("UPDATE umbracoUserGroup SET icon = \'icon-edit\' WHERE userGroupAlias = \'writer\'"); + Database.Execute("UPDATE umbracoUserGroup SET icon = \'icon-tools\' WHERE userGroupAlias = \'editor\'"); + Database.Execute("UPDATE umbracoUserGroup SET icon = \'icon-globe\' WHERE userGroupAlias = \'translator\'"); } private bool AddNewTables(List tables) @@ -133,25 +135,25 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero var updated = false; if (tables.InvariantContains("umbracoUserGroup") == false) { - Create.Table(); + Create.Table().Do(); updated = true; } if (tables.InvariantContains("umbracoUser2UserGroup") == false) { - Create.Table(); + Create.Table().Do(); updated = true; } if (tables.InvariantContains("umbracoUserGroup2App") == false) { - Create.Table(); + Create.Table().Do(); updated = true; } if (tables.InvariantContains("umbracoUserGroup2NodePermission") == false) { - Create.Table(); + Create.Table().Do(); updated = true; } @@ -161,12 +163,12 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero private void MigrateUserTypesToGroups() { // Create a user group for each user type - Execute.Sql(@"INSERT INTO umbracoUserGroup (userGroupAlias, userGroupName, userGroupDefaultPermissions) + Database.Execute(@"INSERT INTO umbracoUserGroup (userGroupAlias, userGroupName, userGroupDefaultPermissions) SELECT userTypeAlias, userTypeName, userTypeDefaultPermissions FROM umbracoUserType"); // Add each user to the group created from their type - Execute.Sql(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) + Database.Execute(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) SELECT u.id, ug.id FROM umbracoUser u INNER JOIN umbracoUserType ut ON ut.id = u.userType @@ -175,7 +177,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero // Add the built-in administrator account to all apps // this will lookup all of the apps that the admin currently has access to in order to assign the sections // instead of use statically assigning since there could be extra sections we don't know about. - Execute.Sql(@"INSERT INTO umbracoUserGroup2app (userGroupId,app) + Database.Execute(@"INSERT INTO umbracoUserGroup2app (userGroupId,app) SELECT ug.id, app FROM umbracoUserGroup ug INNER JOIN umbracoUser2UserGroup u2ug ON u2ug.userGroupId = ug.id @@ -185,21 +187,21 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero // Add the default section access to the other built-in accounts // writer: - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) SELECT ug.id, 'content' as app FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = 'writer' {0}", _collateSyntax)); // editor - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) SELECT ug.id, 'content' as app FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = 'editor' {0}", _collateSyntax)); - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) SELECT ug.id, 'media' as app FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = 'editor' {0}", _collateSyntax)); // translator - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) SELECT ug.id, 'translation' as app FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = 'translator' {0}", _collateSyntax)); @@ -240,12 +242,12 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero { userGroupAlias = "MigratedSectionAccessGroup_" + (i + 1), userGroupName = "Migrated Section Access Group " + (i + 1) - }); + }).Do(); //now assign the apps var distinctApp = distinctApps[i]; foreach (var app in distinctApp.appCollection) { - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId, app) SELECT ug.id, '" + app + @"' as app FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = '" + alias + "' {0}", _collateSyntax)); @@ -258,7 +260,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero if (hash == distinctApp.appsHash) { //it matches so assign the user to this group - Execute.Sql(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) + Database.Execute(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) SELECT " + userWithApps.Key + @", ug.id FROM umbracoUserGroup ug WHERE ug.userGroupAlias {0} = '" + alias + "' {0}", _collateSyntax)); @@ -267,24 +269,24 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero } // Rename some groups for consistency (plural form) - Execute.Sql("UPDATE umbracoUserGroup SET userGroupName = 'Writers' WHERE userGroupAlias = 'writer'"); - Execute.Sql("UPDATE umbracoUserGroup SET userGroupName = 'Translators' WHERE userGroupAlias = 'translator'"); + Database.Execute("UPDATE umbracoUserGroup SET userGroupName = 'Writers' WHERE userGroupAlias = 'writer'"); + Database.Execute("UPDATE umbracoUserGroup SET userGroupName = 'Translators' WHERE userGroupAlias = 'translator'"); //Ensure all built in groups have a start node of -1 - Execute.Sql("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'editor'"); - Execute.Sql("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'editor'"); - Execute.Sql("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'writer'"); - Execute.Sql("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'writer'"); - Execute.Sql("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'translator'"); - Execute.Sql("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'translator'"); - Execute.Sql("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'admin'"); - Execute.Sql("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'admin'"); + Database.Execute("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'editor'"); + Database.Execute("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'editor'"); + Database.Execute("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'writer'"); + Database.Execute("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'writer'"); + Database.Execute("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'translator'"); + Database.Execute("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'translator'"); + Database.Execute("UPDATE umbracoUserGroup SET startContentId = -1 WHERE userGroupAlias = 'admin'"); + Database.Execute("UPDATE umbracoUserGroup SET startMediaId = -1 WHERE userGroupAlias = 'admin'"); } private void MigrateUserPermissions() { // Create user group records for all non-admin users that have specific permissions set - Execute.Sql(@"INSERT INTO umbracoUserGroup(userGroupAlias, userGroupName) + Database.Execute(@"INSERT INTO umbracoUserGroup(userGroupAlias, userGroupName) SELECT 'permissionGroupFor' + userLogin, 'Migrated Permission Group for ' + userLogin FROM umbracoUser WHERE (id IN ( @@ -294,13 +296,13 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero AND id > 0"); // Associate those groups with the users - Execute.Sql(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) + Database.Execute(string.Format(@"INSERT INTO umbracoUser2UserGroup (userId, userGroupId) SELECT u.id, ug.id FROM umbracoUser u INNER JOIN umbracoUserGroup ug ON ug.userGroupAlias {0} = 'permissionGroupFor' + userLogin {0}", _collateSyntax)); // Create node permissions on the groups - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2NodePermission (userGroupId,nodeId,permission) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2NodePermission (userGroupId,nodeId,permission) SELECT ug.id, nodeId, permission FROM umbracoUserGroup ug INNER JOIN umbracoUser2UserGroup u2ug ON u2ug.userGroupId = ug.id @@ -312,7 +314,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero )", _collateSyntax)); // Create app permissions on the groups - Execute.Sql(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId,app) + Database.Execute(string.Format(@"INSERT INTO umbracoUserGroup2app (userGroupId,app) SELECT ug.id, app FROM umbracoUserGroup ug INNER JOIN umbracoUser2UserGroup u2ug ON u2ug.userGroupId = ug.id @@ -328,28 +330,28 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero { if (tables.InvariantContains("umbracoUser2App")) { - Delete.Table("umbracoUser2App"); + Delete.Table("umbracoUser2App").Do(); } if (tables.InvariantContains("umbracoUser2NodePermission")) { - Delete.Table("umbracoUser2NodePermission"); + Delete.Table("umbracoUser2NodePermission").Do(); } if (tables.InvariantContains("umbracoUserType") && tables.InvariantContains("umbracoUser")) { if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_umbracoUser_umbracoUserType_id"))) { - Delete.ForeignKey("FK_umbracoUser_umbracoUserType_id").OnTable("umbracoUser"); + Delete.ForeignKey("FK_umbracoUser_umbracoUserType_id").OnTable("umbracoUser").Do(); } //This is the super old constraint name of the FK for user type so check this one too if (constraints.Any(x => x.Item1.InvariantEquals("umbracoUser") && x.Item3.InvariantEquals("FK_user_userType"))) { - Delete.ForeignKey("FK_user_userType").OnTable("umbracoUser"); + Delete.ForeignKey("FK_user_userType").OnTable("umbracoUser").Do(); } - Delete.Column("userType").FromTable("umbracoUser"); - Delete.Table("umbracoUserType"); + Delete.Column("userType").FromTable("umbracoUser").Do(); + Delete.Table("umbracoUserType").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserStartNodeTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserStartNodeTable.cs index 12179964bb..6647a73422 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserStartNodeTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/AddUserStartNodeTable.cs @@ -16,24 +16,24 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero if (tables.InvariantContains("umbracoUserStartNode")) return; - Create.Table(); + Create.Table().Do(); MigrateUserStartNodes(); //now remove the old columns - Delete.Column("startStructureID").FromTable("umbracoUser"); - Delete.Column("startMediaID").FromTable("umbracoUser"); + Delete.Column("startStructureID").FromTable("umbracoUser").Do(); + Delete.Column("startMediaID").FromTable("umbracoUser").Do(); } private void MigrateUserStartNodes() { - Execute.Sql(@"INSERT INTO umbracoUserStartNode (userId, startNode, startNodeType) + Database.Execute(@"INSERT INTO umbracoUserStartNode (userId, startNode, startNodeType) SELECT id, startStructureID, 1 FROM umbracoUser WHERE startStructureID IS NOT NULL AND startStructureID > 0 AND startStructureID IN (SELECT id FROM umbracoNode WHERE nodeObjectType='" + Constants.ObjectTypes.Document + "')"); - Execute.Sql(@"INSERT INTO umbracoUserStartNode (userId, startNode, startNodeType) + Database.Execute(@"INSERT INTO umbracoUserStartNode (userId, startNode, startNodeType) SELECT id, startMediaID, 2 FROM umbracoUser WHERE startMediaID IS NOT NULL AND startMediaID > 0 AND startMediaID IN (SELECT id FROM umbracoNode WHERE nodeObjectType='" + Constants.ObjectTypes.Media + "')"); diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/EnsureContentTemplatePermissions.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/EnsureContentTemplatePermissions.cs index 0463273285..def96bd334 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/EnsureContentTemplatePermissions.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/EnsureContentTemplatePermissions.cs @@ -16,29 +16,23 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero public override void Up() { - Execute.Code(context => + var database = Database; + var userGroups = database.Fetch( + Context.SqlContext.Sql().Select("*") + .From() + .Where(x => x.Alias == "admin" || x.Alias == "editor")); + + foreach (var userGroup in userGroups) { - var database = context.Database; - var userGroups = database.Fetch( - Context.SqlContext.Sql().Select("*") - .From() - .Where(x => x.Alias == "admin" || x.Alias == "editor")); - - var local = Context.GetLocalMigration(); - - foreach (var userGroup in userGroups) + if (userGroup.DefaultPermissions.Contains('�') == false) { - if (userGroup.DefaultPermissions.Contains('�') == false) - { - userGroup.DefaultPermissions += "�"; - local.Update.Table("umbracoUserGroup") - .Set(new { userGroupDefaultPermissions = userGroup.DefaultPermissions }) - .Where(new { id = userGroup.Id }); - } + userGroup.DefaultPermissions += "�"; + Update.Table("umbracoUserGroup") + .Set(new { userGroupDefaultPermissions = userGroup.DefaultPermissions }) + .Where(new { id = userGroup.Id }) + .Do(); } - - return local.GetSql(); - }); + } } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/ReduceDictionaryKeyColumnsSize.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/ReduceDictionaryKeyColumnsSize.cs index 3703dd973c..1070fabb8d 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/ReduceDictionaryKeyColumnsSize.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/ReduceDictionaryKeyColumnsSize.cs @@ -14,33 +14,27 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero { //Now we need to check if we can actually do this because we won't be able to if there's data in there that is too long - Execute.Code(context => + var database = Database; + var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(database); + + var colLen = SqlSyntax is MySqlSyntaxProvider + ? database.ExecuteScalar(string.Format("select max(LENGTH({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))) + : database.ExecuteScalar(string.Format("select max(datalength({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))); + + if (colLen < 900 == false) return; + + //if it exists we need to drop it first + if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsDictionary_key"))) { - var database = context.Database; - var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(database); + Delete.Index("IX_cmsDictionary_key").OnTable("cmsDictionary").Do(); + } - var colLen = SqlSyntax is MySqlSyntaxProvider - ? database.ExecuteScalar(string.Format("select max(LENGTH({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))) - : database.ExecuteScalar(string.Format("select max(datalength({0})) from cmsDictionary", SqlSyntax.GetQuotedColumnName("key"))); - - if (colLen < 900 == false) return null; - - var local = Context.GetLocalMigration(); - - //if it exists we need to drop it first - if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsDictionary_key"))) - { - local.Delete.Index("IX_cmsDictionary_key").OnTable("cmsDictionary"); - } - - //we can apply the col length change - local.Alter.Table("cmsDictionary") - .AlterColumn("key") - .AsString(450) - .NotNullable(); - - return local.GetSql(); - }); + //we can apply the col length change + Alter.Table("cmsDictionary") + .AlterColumn("key") + .AsString(450) + .NotNullable() + .Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/UpdateUserTables.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/UpdateUserTables.cs index 50edf676ae..134bf729c7 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/UpdateUserTables.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSevenZero/UpdateUserTables.cs @@ -19,29 +19,29 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSevenZero var columns = SqlSyntax.GetColumnsInSchema(Context.Database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("createDate")) == false) - Create.Column("createDate").OnTable("umbracoUser").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); + Create.Column("createDate").OnTable("umbracoUser").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime).Do(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("updateDate")) == false) - Create.Column("updateDate").OnTable("umbracoUser").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); + Create.Column("updateDate").OnTable("umbracoUser").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime).Do(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("emailConfirmedDate")) == false) - Create.Column("emailConfirmedDate").OnTable("umbracoUser").AsDateTime().Nullable(); + Create.Column("emailConfirmedDate").OnTable("umbracoUser").AsDateTime().Nullable().Do(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("invitedDate")) == false) - Create.Column("invitedDate").OnTable("umbracoUser").AsDateTime().Nullable(); + Create.Column("invitedDate").OnTable("umbracoUser").AsDateTime().Nullable().Do(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("avatar")) == false) - Create.Column("avatar").OnTable("umbracoUser").AsString(500).Nullable(); + Create.Column("avatar").OnTable("umbracoUser").AsString(500).Nullable().Do(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoUser") && x.ColumnName.InvariantEquals("passwordConfig")) == false) { - Create.Column("passwordConfig").OnTable("umbracoUser").AsString(500).Nullable(); + Create.Column("passwordConfig").OnTable("umbracoUser").AsString(500).Nullable().Do(); //Check if we have a known config, we only want to store config for hashing var membershipProvider = MembershipProviderExtensions.GetUsersMembershipProvider(); if (membershipProvider.PasswordFormat == MembershipPasswordFormat.Hashed) { var json = JsonConvert.SerializeObject(new { hashAlgorithm = Membership.HashAlgorithmType }); - Execute.Sql("UPDATE umbracoUser SET passwordConfig = '" + json + "'"); + Database.Execute("UPDATE umbracoUser SET passwordConfig = '" + json + "'"); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToCmsMemberLoginName.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToCmsMemberLoginName.cs index da4eddb809..7b873c1088 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToCmsMemberLoginName.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToCmsMemberLoginName.cs @@ -12,47 +12,38 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero public override void Up() { - Execute.Code(context => + var database = Database; + + //Now we need to check if we can actually d6 this because we won't be able to if there's data in there that is too long + //http://issues.umbraco.org/issue/U4-9758 + + var colLen = SqlSyntax is MySqlSyntaxProvider + ? database.ExecuteScalar("select max(LENGTH(LoginName)) from cmsMember") + : database.ExecuteScalar("select max(datalength(LoginName)) from cmsMember"); + + if (colLen < 900 == false && colLen != null) { - var database = context.Database; + return; + } - //Now we need to check if we can actually d6 this because we won't be able to if there's data in there that is too long - //http://issues.umbraco.org/issue/U4-9758 + var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(Context.Database); - var colLen = SqlSyntax is MySqlSyntaxProvider - ? database.ExecuteScalar("select max(LENGTH(LoginName)) from cmsMember") - : database.ExecuteScalar("select max(datalength(LoginName)) from cmsMember"); - - if (colLen < 900 == false && colLen != null) - { - return null; - } - - var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(Context.Database); - - //make sure it doesn't already exist - if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsMember_LoginName")) == false) - { - var local = Context.GetLocalMigration(); - - //we can apply the index - local.Create.Index("IX_cmsMember_LoginName").OnTable("cmsMember") - .OnColumn("LoginName") - .Ascending() - .WithOptions() - .NonClustered(); - - return local.GetSql(); - } - - return null; - - }); + //make sure it doesn't already exist + if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_cmsMember_LoginName")) == false) + { + //we can apply the index + Create.Index("IX_cmsMember_LoginName").OnTable("cmsMember") + .OnColumn("LoginName") + .Ascending() + .WithOptions() + .NonClustered() + .Do(); + } } public override void Down() { - Delete.Index("IX_cmsMember_LoginName").OnTable("cmsMember"); + Delete.Index("IX_cmsMember_LoginName").OnTable("cmsMember").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUmbracoNodePath.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUmbracoNodePath.cs index 7d52d9292d..acbd65e157 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUmbracoNodePath.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUmbracoNodePath.cs @@ -21,13 +21,14 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero .OnColumn("path") .Ascending() .WithOptions() - .NonClustered(); + .NonClustered() + .Do(); } } public override void Down() { - Delete.Index("IX_umbracoNodePath").OnTable("umbracoNode"); + Delete.Index("IX_umbracoNodePath").OnTable("umbracoNode").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUser2NodePermission.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUser2NodePermission.cs index b858484586..c563c42637 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUser2NodePermission.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexToUser2NodePermission.cs @@ -21,13 +21,14 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero .OnColumn("nodeId") .Ascending() .WithOptions() - .NonClustered(); + .NonClustered() + .Do(); } } public override void Down() { - Delete.Index("IX_umbracoUser2NodePermission_nodeId").OnTable("cmsMember"); + Delete.Index("IX_umbracoUser2NodePermission_nodeId").OnTable("cmsMember").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexesToUmbracoRelationTables.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexesToUmbracoRelationTables.cs index 39be1855b9..6198d69d33 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexesToUmbracoRelationTables.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddIndexesToUmbracoRelationTables.cs @@ -20,38 +20,34 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero { //This will remove any corrupt/duplicate data in the relation table before the index is applied //Ensure this executes in a defered block which will be done inside of the migration transaction - this.Execute.Code(context => + var database = Database; + + //We need to check if this index has corrupted data and then clear that data + var duplicates = database.Fetch("SELECT parentId,childId,relType FROM umbracoRelation GROUP BY parentId,childId,relType HAVING COUNT(*) > 1"); + if (duplicates.Count > 0) { - var database = context.Database; - - //We need to check if this index has corrupted data and then clear that data - var duplicates = database.Fetch("SELECT parentId,childId,relType FROM umbracoRelation GROUP BY parentId,childId,relType HAVING COUNT(*) > 1"); - if (duplicates.Count > 0) + //need to fix this there cannot be duplicates so we'll take the latest entries, it's really not going to matter though + foreach (var duplicate in duplicates) { - //need to fix this there cannot be duplicates so we'll take the latest entries, it's really not going to matter though - foreach (var duplicate in duplicates) + var ids = database.Fetch("SELECT id FROM umbracoRelation WHERE parentId=@parentId AND childId=@childId AND relType=@relType ORDER BY datetime DESC", + new { parentId = duplicate.parentId, childId = duplicate.childId, relType = duplicate.relType }); + + if (ids.Count == 1) { - var ids = database.Fetch("SELECT id FROM umbracoRelation WHERE parentId=@parentId AND childId=@childId AND relType=@relType ORDER BY datetime DESC", - new { parentId = duplicate.parentId, childId = duplicate.childId, relType = duplicate.relType }); + //this is just a safety check, this should absolutely never happen + throw new InvalidOperationException("Duplicates were detected but could not be discovered"); + } - if (ids.Count == 1) - { - //this is just a safety check, this should absolutely never happen - throw new InvalidOperationException("Duplicates were detected but could not be discovered"); - } + //delete the others + ids = ids.Skip(0).ToList(); - //delete the others - ids = ids.Skip(0).ToList(); - - //iterate in groups of 2000 to avoid the max sql parameter limit - foreach (var idGroup in ids.InGroupsOf(2000)) - { - database.Execute("DELETE FROM umbracoRelation WHERE id IN (@ids)", new { ids = idGroup }); - } + //iterate in groups of 2000 to avoid the max sql parameter limit + foreach (var idGroup in ids.InGroupsOf(2000)) + { + database.Execute("DELETE FROM umbracoRelation WHERE id IN (@ids)", new { ids = idGroup }); } } - return ""; - }); + } //unique index to prevent duplicates - and for better perf Create.Index("IX_umbracoRelation_parentChildType").OnTable("umbracoRelation") @@ -59,7 +55,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero .OnColumn("childId").Ascending() .OnColumn("relType").Ascending() .WithOptions() - .Unique(); + .Unique() + .Do(); } //need indexes on alias and name for relation type since these are queried against @@ -71,7 +68,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero .OnColumn("alias") .Ascending() .WithOptions() - .NonClustered(); + .NonClustered() + .Do(); } if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_umbracoRelationType_name")) == false) { @@ -79,14 +77,15 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero .OnColumn("name") .Ascending() .WithOptions() - .NonClustered(); + .NonClustered() + .Do(); } } public override void Down() { - Delete.Index("IX_umbracoNodePath").OnTable("umbracoNode"); + Delete.Index("IX_umbracoNodePath").OnTable("umbracoNode").Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockObjects.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockObjects.cs index f3b5a3f973..bdf9513620 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockObjects.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockObjects.cs @@ -21,17 +21,13 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero private void EnsureLockObject(int id, string name) { - Execute.Code(context => - { - var db = context.Database; - var exists = db.Exists(id); - if (exists) return string.Empty; - // be safe: delete old umbracoNode lock objects if any - db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); - // then create umbracoLock object - db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, @name, 1);", new { id, name }); - return string.Empty; - }); + var db = Database; + var exists = db.Exists(id); + if (exists) return; + // be safe: delete old umbracoNode lock objects if any + db.Execute("DELETE FROM umbracoNode WHERE id=@id;", new { id }); + // then create umbracoLock object + db.Execute("INSERT umbracoLock (id, name, value) VALUES (@id, @name, 1);", new { id, name }); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockTable.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockTable.cs index 16b8cc8516..68a529085d 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockTable.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddLockTable.cs @@ -17,7 +17,8 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero Create.Table("umbracoLock") .WithColumn("id").AsInt32().PrimaryKey("PK_umbracoLock") .WithColumn("value").AsInt32().NotNullable() - .WithColumn("name").AsString(64).NotNullable(); + .WithColumn("name").AsString(64).NotNullable() + .Do(); } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddMacroUniqueIdColumn.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddMacroUniqueIdColumn.cs index bcf62c6974..3afbdb981d 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddMacroUniqueIdColumn.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddMacroUniqueIdColumn.cs @@ -16,31 +16,33 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero if (columns.Any(x => x.TableName.InvariantEquals("cmsMacro") && x.ColumnName.InvariantEquals("uniqueId")) == false) { - Create.Column("uniqueId").OnTable("cmsMacro").AsGuid().Nullable(); - Execute.Code(UpdateMacroGuids); - Alter.Table("cmsMacro").AlterColumn("uniqueId").AsGuid().NotNullable(); + Create.Column("uniqueId").OnTable("cmsMacro").AsGuid().Nullable().Do(); + UpdateMacroGuids(); + Alter.Table("cmsMacro").AlterColumn("uniqueId").AsGuid().NotNullable().Do(); Create.Index("IX_cmsMacro_UniqueId").OnTable("cmsMacro").OnColumn("uniqueId") .Ascending() .WithOptions().NonClustered() - .WithOptions().Unique(); + .WithOptions().Unique() + .Do(); } if (columns.Any(x => x.TableName.InvariantEquals("cmsMacroProperty") && x.ColumnName.InvariantEquals("uniquePropertyId")) == false) { - Create.Column("uniquePropertyId").OnTable("cmsMacroProperty").AsGuid().Nullable(); - Execute.Code(UpdateMacroPropertyGuids); - Alter.Table("cmsMacroProperty").AlterColumn("uniquePropertyId").AsGuid().NotNullable(); + Create.Column("uniquePropertyId").OnTable("cmsMacroProperty").AsGuid().Nullable().Do(); + UpdateMacroPropertyGuids(); + Alter.Table("cmsMacroProperty").AlterColumn("uniquePropertyId").AsGuid().NotNullable().Do(); Create.Index("IX_cmsMacroProperty_UniquePropertyId").OnTable("cmsMacroProperty").OnColumn("uniquePropertyId") .Ascending() .WithOptions().NonClustered() - .WithOptions().Unique(); + .WithOptions().Unique() + .Do(); } } - private static string UpdateMacroGuids(IMigrationContext context) + private void UpdateMacroGuids() { - var database = context.Database; + var database = Database; var updates = database.Query("SELECT id, macroAlias FROM cmsMacro") .Select(macro => Tuple.Create((int) macro.id, ("macro____" + (string) macro.macroAlias).ToGuid())) @@ -48,13 +50,11 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero foreach (var update in updates) database.Execute("UPDATE cmsMacro set uniqueId=@guid WHERE id=@id", new { guid = update.Item2, id = update.Item1 }); - - return string.Empty; } - private static string UpdateMacroPropertyGuids(IMigrationContext context) + private void UpdateMacroPropertyGuids() { - var database = context.Database; + var database = Database; var updates = database.Query(@"SELECT cmsMacroProperty.id id, macroPropertyAlias propertyAlias, cmsMacro.macroAlias macroAlias FROM cmsMacroProperty @@ -64,8 +64,6 @@ JOIN cmsMacro ON cmsMacroProperty.macro=cmsMacro.id") foreach (var update in updates) database.Execute("UPDATE cmsMacroProperty set uniquePropertyId=@guid WHERE id=@id", new { guid = update.Item2, id = update.Item1 }); - - return string.Empty; } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs index 42a3b5e99e..4481f09575 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/AddRelationTypeUniqueIdColumn.cs @@ -16,27 +16,26 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero if (columns.Any(x => x.TableName.InvariantEquals("umbracoRelationType") && x.ColumnName.InvariantEquals("typeUniqueId")) == false) { - Create.Column("typeUniqueId").OnTable("umbracoRelationType").AsGuid().Nullable(); - Execute.Code(UpdateRelationTypeGuids); - Alter.Table("umbracoRelationType").AlterColumn("typeUniqueId").AsGuid().NotNullable(); + Create.Column("typeUniqueId").OnTable("umbracoRelationType").AsGuid().Nullable().Do(); + UpdateRelationTypeGuids(); + Alter.Table("umbracoRelationType").AlterColumn("typeUniqueId").AsGuid().NotNullable().Do(); Create.Index("IX_umbracoRelationType_UniqueId").OnTable("umbracoRelationType").OnColumn("typeUniqueId") .Ascending() .WithOptions().NonClustered() - .WithOptions().Unique(); + .WithOptions().Unique() + .Do(); } } - private static string UpdateRelationTypeGuids(IMigrationContext context) + private void UpdateRelationTypeGuids() { - var database = context.Database; + var database = Database; var updates = database.Query("SELECT id, alias, name FROM umbracoRelationType") .Select(relationType => Tuple.Create((int) relationType.id, ("relationType____" + (string) relationType.alias + "____" + (string) relationType.name).ToGuid())) .ToList(); foreach (var update in updates) database.Execute("UPDATE umbracoRelationType set typeUniqueId=@guid WHERE id=@id", new { guid = update.Item2, id = update.Item1 }); - - return string.Empty; } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/NormalizeTemplateGuids.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/NormalizeTemplateGuids.cs index 0bdfe8dcb4..b98bd7ae9a 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/NormalizeTemplateGuids.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/NormalizeTemplateGuids.cs @@ -13,12 +13,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero public override void Up() { - Execute.Code(UpdateTemplateGuids); - } - - private static string UpdateTemplateGuids(IMigrationContext context) - { - var database = context.Database; + var database = Database; // we need this migration because ppl running pre-7.6 on Cloud and Courier have templates in different // environments having different GUIDs (Courier does not sync template GUIDs) and we need to normalize @@ -29,7 +24,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero // so... testing if we already have a 7.6.0 version installed. not pretty but...? // var version = database.FirstOrDefault("SELECT version FROM umbracoMigration WHERE name=@name ORDER BY version DESC", new { name = Constants.System.UmbracoMigrationName }); - if (version != null && version.StartsWith("7.6.0")) return string.Empty; + if (version != null && version.StartsWith("7.6.0")) return; var updates = database.Query(@"SELECT umbracoNode.id, cmsTemplate.alias FROM umbracoNode JOIN cmsTemplate ON umbracoNode.id=cmsTemplate.nodeId @@ -39,8 +34,6 @@ WHERE nodeObjectType = @guid", new { guid = Constants.ObjectTypes.TemplateType } foreach (var update in updates) database.Execute("UPDATE umbracoNode set uniqueId=@guid WHERE id=@id", new { guid = update.Item2, id = update.Item1 }); - - return string.Empty; } public override void Down() diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/ReduceLoginNameColumnsSize.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/ReduceLoginNameColumnsSize.cs index 407c04d9e8..de63c58a8f 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/ReduceLoginNameColumnsSize.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/ReduceLoginNameColumnsSize.cs @@ -15,36 +15,30 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero //Now we need to check if we can actually d6 this because we won't be able to if there's data in there that is too long //http://issues.umbraco.org/issue/U4-9758 - Execute.Code(context => + var database = Database; + var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(database); + + var colLen = (SqlSyntax is MySqlSyntaxProvider) + ? database.ExecuteScalar("select max(LENGTH(LoginName)) from cmsMember") + : database.ExecuteScalar("select max(datalength(LoginName)) from cmsMember"); + + if (colLen < 900 == false) return; + + //if an index exists on this table we need to drop it. Normally we'd check via index name but in some odd cases (i.e. Our) + //the index name is something odd (starts with "mi_"). In any case, the index cannot exist if we want to alter the column + //so we'll drop whatever index is there and add one with the correct name after. + var loginNameIndex = dbIndexes.FirstOrDefault(x => x.TableName.InvariantEquals("cmsMember") && x.ColumnName.InvariantEquals("LoginName")); + if (loginNameIndex != null) { - var database = context.Database; - var dbIndexes = SqlSyntax.GetDefinedIndexesDefinitions(database); + Delete.Index(loginNameIndex.IndexName).OnTable("cmsMember").Do(); + } - var colLen = (SqlSyntax is MySqlSyntaxProvider) - ? database.ExecuteScalar("select max(LENGTH(LoginName)) from cmsMember") - : database.ExecuteScalar("select max(datalength(LoginName)) from cmsMember"); - - if (colLen < 900 == false) return null; - - var local = Context.GetLocalMigration(); - - //if an index exists on this table we need to drop it. Normally we'd check via index name but in some odd cases (i.e. Our) - //the index name is something odd (starts with "mi_"). In any case, the index cannot exist if we want to alter the column - //so we'll drop whatever index is there and add one with the correct name after. - var loginNameIndex = dbIndexes.FirstOrDefault(x => x.TableName.InvariantEquals("cmsMember") && x.ColumnName.InvariantEquals("LoginName")); - if (loginNameIndex != null) - { - local.Delete.Index(loginNameIndex.IndexName).OnTable("cmsMember"); - } - - //we can apply the col length change - local.Alter.Table("cmsMember") - .AlterColumn("LoginName") - .AsString(225) - .NotNullable(); - - return local.GetSql(); - }); + //we can apply the col length change + Alter.Table("cmsMember") + .AlterColumn("LoginName") + .AsString(225) + .NotNullable() + .Do(); } } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemovePropertyDataIdIndex.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemovePropertyDataIdIndex.cs index a84a0a30be..afa3185cb6 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemovePropertyDataIdIndex.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemovePropertyDataIdIndex.cs @@ -23,7 +23,7 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero if (found != null) { //drop the index - Delete.Index("IX_cmsPropertyData").OnTable("cmsPropertyData"); + Delete.Index("IX_cmsPropertyData").OnTable("cmsPropertyData").Do(); } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemoveUmbracoDeployTables.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemoveUmbracoDeployTables.cs index bc8d84dc8a..8f90f56b96 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemoveUmbracoDeployTables.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionSevenSixZero/RemoveUmbracoDeployTables.cs @@ -21,12 +21,12 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionSevenSixZero { var columns = SqlSyntax.GetColumnsInSchema(Context.Database).ToArray(); if (columns.Any(x => x.TableName.InvariantEquals("umbracoDeployDependency") && x.ColumnName.InvariantEquals("sourceId"))) - Delete.Table("umbracoDeployDependency"); + Delete.Table("umbracoDeployDependency").Do(); } // always remove umbracoDeployChecksum if (tables.InvariantContains("umbracoDeployChecksum")) - Delete.Table("umbracoDeployChecksum"); + Delete.Table("umbracoDeployChecksum").Do(); } public override void Down() diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 853e91c8f4..c8a9b8853d 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -314,6 +314,11 @@ + + + + + @@ -882,7 +887,6 @@ - @@ -890,7 +894,6 @@ - @@ -909,10 +912,10 @@ - - - - + + + + @@ -932,7 +935,7 @@ - + @@ -963,9 +966,7 @@ - - diff --git a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs index 92ec8c6cf9..3003f6405c 100644 --- a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs @@ -263,7 +263,7 @@ namespace Umbraco.Tests.Migrations var table = DefinitionFactory.GetTableDefinition(typeof(NodeDto), SqlSyntax); var column = table.Columns.First(x => x.Name == "id"); var create = SqlSyntax.Format(column); // returns [id] INTEGER NOT NULL IDENTITY(1060,1) - Execute.Sql($"ALTER TABLE {SqlSyntax.GetQuotedTableName("umbracoNode")} ADD COLUMN " + create); + Database.Execute($"ALTER TABLE {SqlSyntax.GetQuotedTableName("umbracoNode")} ADD COLUMN " + create); } } } diff --git a/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs b/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs index 6b321149ba..0140fda576 100644 --- a/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/AlterMigrationTests.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Migrations; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Tests.Migrations.Stubs; +using Umbraco.Tests.Testing; namespace Umbraco.Tests.Migrations { @@ -36,28 +37,30 @@ namespace Umbraco.Tests.Migrations public void Drop_Foreign_Key() { // Arrange - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var stub = new DropForeignKeyMigrationStub(context); // Act stub.Up(); // Assert - Assert.That(context.Expressions.Count, Is.EqualTo(1)); - Assert.That(context.Expressions.Single().ToString(), Is.EqualTo("ALTER TABLE [umbracoUser2app] DROP CONSTRAINT [FK_umbracoUser2app_umbracoUser_id]")); + Assert.That(database.Operations.Count, Is.EqualTo(1)); + Assert.That(database.Operations.Single().ToString(), Is.EqualTo("ALTER TABLE [umbracoUser2app] DROP CONSTRAINT [FK_umbracoUser2app_umbracoUser_id]")); } [Test] public void CreateColumn() { - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var migration = new CreateColumnMigration(context); migration.Up(); - Assert.That(context.Expressions.Count, Is.EqualTo(1)); - Assert.That(context.Expressions.Single().ToString(), Is.EqualTo("ALTER TABLE [bar] ADD [foo] UniqueIdentifier NOT NULL")); + Assert.That(database.Operations.Count, Is.EqualTo(1)); + Assert.That(database.Operations.Single().ToString(), Is.EqualTo("ALTER TABLE [bar] ADD [foo] UniqueIdentifier NOT NULL")); } [Migration("1.0.0", 0, "Test")] @@ -79,13 +82,14 @@ namespace Umbraco.Tests.Migrations [Test] public void AlterColumn() { - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var migration = new AlterColumnMigration(context); migration.Up(); - Assert.That(context.Expressions.Count, Is.EqualTo(1)); - Assert.That(context.Expressions.Single().ToString(), Is.EqualTo("ALTER TABLE [bar] ALTER COLUMN [foo] UniqueIdentifier NOT NULL")); + Assert.That(database.Operations.Count, Is.EqualTo(1)); + Assert.That(database.Operations.Single().ToString(), Is.EqualTo("ALTER TABLE [bar] ALTER COLUMN [foo] UniqueIdentifier NOT NULL")); } [Migration("1.0.0", 0, "Test")] @@ -111,19 +115,20 @@ namespace Umbraco.Tests.Migrations public void Can_Get_Up_Migration_From_MigrationStub() { // Arrange - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var stub = new AlterUserTableMigrationStub(context); // Act stub.Up(); // Assert - Assert.That(context.Expressions.Any(), Is.True); + Assert.That(database.Operations.Any(), Is.True); //Console output - Debug.Print("Number of expressions in context: {0}", context.Expressions.Count); + Debug.Print("Number of expressions in context: {0}", database.Operations.Count); Debug.Print(""); - foreach (var expression in context.Expressions) + foreach (var expression in database.Operations) { Debug.Print(expression.ToString()); } diff --git a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs index ffcf00af44..9aa44a7279 100644 --- a/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs +++ b/src/Umbraco.Tests/Migrations/FindingMigrationsTest.cs @@ -48,19 +48,20 @@ namespace Umbraco.Tests.Migrations Assert.That(list.Count, Is.EqualTo(3)); - foreach (var migration1 in list) - { - var migration = (MigrationBase) migration1; - migration.Up(); - } + // migrations Up actually executes in v8 + //foreach (var migration1 in list) + //{ + // var migration = (MigrationBase) migration1; + // migration.Up(); + //} - Assert.That(context.Expressions.Any(), Is.True); + //Assert.That(context.Expressions.Any(), Is.True); - //Console output - foreach (var expression in context.Expressions) - { - Debug.Print(expression.ToString()); - } + ////Console output + //foreach (var expression in context.Expressions) + //{ + // Debug.Print(expression.ToString()); + //} } } } diff --git a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs index 9799553ed2..b62305f801 100644 --- a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Migrations.Expressions.Alter.Expressions; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Services; +using Umbraco.Tests.Testing; namespace Umbraco.Tests.Migrations { @@ -43,11 +44,12 @@ namespace Umbraco.Tests.Migrations Mock.Of(), _logger, new SemVersion(4 /*, 0, 0*/), new SemVersion(6 /*, 0, 0*/), "Test"); + var database = new TestDatabase(); var context = new MigrationContext(_database, _logger); var migrations = runner.OrderedUpgradeMigrations(new List { new MultiMigration(context) }); - runner.InitializeMigrations(migrations.ToList() /*, true*/); + runner.ExecuteMigrations(context, migrations.ToList() /*, true*/); - Assert.AreEqual(1, context.Expressions.Count); + Assert.AreEqual(1, database.Operations.Count); } [Test] @@ -58,11 +60,12 @@ namespace Umbraco.Tests.Migrations Mock.Of(), _logger, new SemVersion(4 /*, 0, 0*/), new SemVersion(5 /*, 0, 0*/), "Test"); - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var migrations = runner.OrderedUpgradeMigrations(new List { new MultiMigration(context) }); - runner.InitializeMigrations(migrations.ToList() /*, true*/); + runner.ExecuteMigrations(context, migrations.ToList() /*, true*/); - Assert.AreEqual(1, context.Expressions.Count); + Assert.AreEqual(1, database.Operations.Count); } [Test] @@ -73,11 +76,12 @@ namespace Umbraco.Tests.Migrations Mock.Of(), _logger, new SemVersion(5, 0, 1), new SemVersion(6 /*, 0, 0*/), "Test"); - var context = new MigrationContext(_database, _logger); + var database = new TestDatabase(); + var context = new MigrationContext(database, _logger); var migrations = runner.OrderedUpgradeMigrations(new List { new MultiMigration(context) }); - runner.InitializeMigrations(migrations.ToList() /*, true*/); + runner.ExecuteMigrations(context, migrations.ToList() /*, true*/); - Assert.AreEqual(1, context.Expressions.Count); + Assert.AreEqual(1, database.Operations.Count); } [Migration("6.0.0", 1, "Test")] @@ -90,12 +94,12 @@ namespace Umbraco.Tests.Migrations public override void Up() { - Context.Expressions.Add(new AlterColumnExpression(Context, new [] { DatabaseType.SQLCe })); + new AlterColumnExpression(Context, new [] { DatabaseType.SQLCe }).Execute(); } public override void Down() { - Context.Expressions.Add(new AlterColumnExpression(Context, new[] { DatabaseType.SQLCe })); + new AlterColumnExpression(Context, new[] { DatabaseType.SQLCe }).Execute(); } } } diff --git a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs index dec861dc37..d02fbd7a4a 100644 --- a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs +++ b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs @@ -15,6 +15,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.Testing; namespace Umbraco.Tests.Persistence.SyntaxProvider { @@ -97,65 +98,85 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_NonClustered_CreatesNonClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); - var db = TestObjects.GetUmbracoSqlServerDatabase(logger); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); var context = new MigrationContext(db, logger); + var createExpression = new CreateIndexExpression(context, new []{ DatabaseType.SqlServer2005 }) { Index = { Name = "IX_A" } }; - var builder = new CreateIndexBuilder(createExpression); - builder.OnTable("TheTable").OnColumn("A").Ascending().WithOptions().NonClustered(); - Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", createExpression.ToString()); + + new CreateIndexBuilder(createExpression) + .OnTable("TheTable").OnColumn("A").Ascending().WithOptions().NonClustered() + .Do(); + + Assert.AreEqual(1, db.Operations.Count); + Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } [Test] public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); - var db = TestObjects.GetUmbracoSqlServerDatabase(logger); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); var context = new MigrationContext(db, logger); + var createExpression = new CreateIndexExpression(context, new[] { DatabaseType.SqlServer2005 }) { Index = { Name = "IX_A" } }; - var builder = new CreateIndexBuilder(createExpression); - builder.OnTable("TheTable").OnColumn("A").Ascending().WithOptions().Unique(); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", createExpression.ToString()); + + new CreateIndexBuilder(createExpression) + .OnTable("TheTable").OnColumn("A").Ascending().WithOptions().Unique() + .Do(); + + Assert.AreEqual(1, db.Operations.Count); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } [Test] public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex_Multi_Columnn() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); - var db = TestObjects.GetUmbracoSqlServerDatabase(logger); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); var context = new MigrationContext(db, logger); + var createExpression = new CreateIndexExpression(context, new[] { DatabaseType.SqlServer2005 }) { Index = { Name = "IX_AB" } }; - var builder = new CreateIndexBuilder(createExpression); - builder.OnTable("TheTable").OnColumn("A").Ascending().OnColumn("B").Ascending().WithOptions().Unique(); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", createExpression.ToString()); + + new CreateIndexBuilder(createExpression) + .OnTable("TheTable").OnColumn("A").Ascending().OnColumn("B").Ascending().WithOptions().Unique() + .Do(); + + Assert.AreEqual(1, db.Operations.Count); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", db.Operations[0].Sql); } [Test] public void CreateIndexBuilder_SqlServer_Clustered_CreatesClusteredIndex() { - var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); var logger = Mock.Of(); - var db = TestObjects.GetUmbracoSqlServerDatabase(logger); + var sqlSyntax = new SqlServerSyntaxProvider(new Lazy(() => null)); + var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); var context = new MigrationContext(db, logger); + var createExpression = new CreateIndexExpression(context, new[] { DatabaseType.SqlServer2005 }) { Index = { Name = "IX_A" } }; - var builder = new CreateIndexBuilder(createExpression); - builder.OnTable("TheTable").OnColumn("A").Ascending().WithOptions().Clustered(); - Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", createExpression.ToString()); + + new CreateIndexBuilder(createExpression) + .OnTable("TheTable").OnColumn("A").Ascending().WithOptions().Clustered() + .Do(); + + Assert.AreEqual(1, db.Operations.Count); + Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } private static IndexDefinition CreateIndexDefinition() diff --git a/src/Umbraco.Tests/Testing/TestDatabase.cs b/src/Umbraco.Tests/Testing/TestDatabase.cs new file mode 100644 index 0000000000..773885ac69 --- /dev/null +++ b/src/Umbraco.Tests/Testing/TestDatabase.cs @@ -0,0 +1,720 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq.Expressions; +using System.Threading.Tasks; +using Moq; +using NPoco; +using NPoco.DatabaseTypes; +using NPoco.Linq; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Tests.Testing +{ + /// + /// An implementation of for tests. + /// + /// + /// Supports writing to the database, and logs Sql statements. + /// Cannot support reading from the database, and throws. + /// Tries to pretend it supports transactions, connections, etc. as best as possible. + /// + public class TestDatabase : IUmbracoDatabase + { + /// + /// Initializes a new instance of the class. + /// + /// + /// When both parameters are supplied, they should of course be consistent. + /// + public TestDatabase(DatabaseType databaseType = null, ISqlSyntaxProvider syntaxProvider = null) + { + DatabaseType = databaseType ?? new SqlServerCEDatabaseType(); + SqlContext = new SqlContext(syntaxProvider ?? new SqlCeSyntaxProvider(), DatabaseType, Mock.Of()); + } + + /// + /// Represents a database operation. + /// + public class Operation + { + public Operation(string text) + { + Text = text; + } + + public Operation(string text, string sql) + { + Text = text; + Sql = sql; + } + + public Operation(string text, string sql, params object[] args) + { + Text = text.Trim(); + Sql = sql.Trim(); + Args = args; + } + + /// + /// Gets the operation text. + /// + public string Text { get; } + + /// + /// Gets the operation Sql statement. + /// + public string Sql { get; } + + /// + /// Gets the operation Sql arguments. + /// + public object[] Args { get; } + } + + /// + /// Gets the database operations. + /// + public List Operations { get; } = new List(); + + #region Connection, Transaction and Stuff + + public void Dispose() + { } + + public IDatabase OpenSharedConnection() + { + return this; + } + + public void CloseSharedConnection() + { } + + public int OneTimeCommandTimeout { get; set; } + public MapperCollection Mappers { get; set; } + public IPocoDataFactory PocoDataFactory { get; set; } + public DatabaseType DatabaseType { get; } + public List Interceptors { get; } + public string ConnectionString { get; } + + public DbConnection Connection { get; } + public DbTransaction Transaction { get; } + public IDictionary Data { get; } + public ISqlContext SqlContext { get; } + public string InstanceId { get; } + public bool InTransaction { get; } + + public DbParameter CreateParameter() + { + throw new NotImplementedException(); + } + + public void AddParameter(DbCommand cmd, object value) + { + throw new NotImplementedException(); + } + + public DbCommand CreateCommand(DbConnection connection, CommandType commandType, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public ITransaction GetTransaction() + { + throw new NotImplementedException(); + } + + public ITransaction GetTransaction(IsolationLevel isolationLevel) + { + throw new NotImplementedException(); + } + + public void SetTransaction(DbTransaction tran) + { + throw new NotImplementedException(); + } + + public void BeginTransaction() + { + Operations.Add(new Operation("BEGIN")); + } + + public void BeginTransaction(IsolationLevel isolationLevel) + { + Operations.Add(new Operation("BEGIN " + isolationLevel)); + } + + public void AbortTransaction() + { + Operations.Add(new Operation("ABORT")); + } + + public void CompleteTransaction() + { + Operations.Add(new Operation("COMMIT")); + } + + #endregion + + #region Writes + + public int Execute(string sql, params object[] args) + { + Operations.Add(new Operation("EXECUTE", sql, args)); + return default; + } + + public int Execute(Sql sql) + { + Operations.Add(new Operation("EXECUTE", sql.SQL, sql.Arguments)); + return default; + } + + public int Execute(string sql, CommandType commandType, params object[] args) + { + Operations.Add(new Operation("EXECUTE", sql, args)); + return default; + } + + public T ExecuteScalar(string sql, params object[] args) + { + Operations.Add(new Operation("EXECUTE SCALAR", sql, args)); + return default; + } + + public T ExecuteScalar(Sql sql) + { + Operations.Add(new Operation("EXECUTE SCALAR", sql.SQL, sql.Arguments)); + return default; + } + + public T ExecuteScalar(string sql, CommandType commandType, params object[] args) + { + Operations.Add(new Operation("EXECUTE SCALAR", sql, args)); + return default; + } + + public Task ExecuteScalarAsync(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task ExecuteScalarAsync(Sql sql) + { + throw new NotImplementedException(); + } + + public Task ExecuteAsync(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task ExecuteAsync(Sql sql) + { + throw new NotImplementedException(); + } + + public object Insert(string tableName, string primaryKeyName, bool autoIncrement, T poco) + { + throw new NotImplementedException(); + } + + public object Insert(string tableName, string primaryKeyName, T poco) + { + throw new NotImplementedException(); + } + + public object Insert(T poco) + { + throw new NotImplementedException(); + } + + public Task InsertAsync(T poco) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(object poco) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(object poco, IEnumerable columns) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(T poco, Expression> fields) + { + throw new NotImplementedException(); + } + + public Task DeleteAsync(object poco) + { + throw new NotImplementedException(); + } + + public void InsertBulk(IEnumerable pocos) + { + throw new NotImplementedException(); + } + + public void InsertBatch(IEnumerable pocos, BatchOptions options = null) + { + throw new NotImplementedException(); + } + + public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue) + { + throw new NotImplementedException(); + } + + public int Update(string tableName, string primaryKeyName, object poco) + { + throw new NotImplementedException(); + } + + public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue, IEnumerable columns) + { + throw new NotImplementedException(); + } + + public int Update(string tableName, string primaryKeyName, object poco, IEnumerable columns) + { + throw new NotImplementedException(); + } + + public int Update(object poco, IEnumerable columns) + { + throw new NotImplementedException(); + } + + public int Update(object poco, object primaryKeyValue, IEnumerable columns) + { + throw new NotImplementedException(); + } + + public int Update(object poco) + { + throw new NotImplementedException(); + } + + public int Update(T poco, Expression> fields) + { + throw new NotImplementedException(); + } + + public int Update(object poco, object primaryKeyValue) + { + throw new NotImplementedException(); + } + + public int Update(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public int Update(Sql sql) + { + throw new NotImplementedException(); + } + + public IUpdateQueryProvider UpdateMany() + { + throw new NotImplementedException(); + } + + public int Delete(string tableName, string primaryKeyName, object poco) + { + throw new NotImplementedException(); + } + + public int Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue) + { + throw new NotImplementedException(); + } + + public int Delete(object poco) + { + throw new NotImplementedException(); + } + + public int Delete(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public int Delete(Sql sql) + { + throw new NotImplementedException(); + } + + public int Delete(object pocoOrPrimaryKey) + { + throw new NotImplementedException(); + } + + public IDeleteQueryProvider DeleteMany() + { + throw new NotImplementedException(); + } + + public void Save(T poco) + { + throw new NotImplementedException(); + } + + public bool IsNew(T poco) + { + throw new NotImplementedException(); + } + + #endregion + + #region Reads (not implemented) + + public List Fetch(Type type, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List Fetch(Type type, Sql Sql) + { + throw new NotImplementedException(); + } + + public IEnumerable Query(Type type, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public IEnumerable Query(Type type, Sql Sql) + { + throw new NotImplementedException(); + } + + public List Fetch() + { + throw new NotImplementedException(); + } + + public List Fetch(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List Fetch(Sql sql) + { + throw new NotImplementedException(); + } + + public List Fetch(long page, long itemsPerPage, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List Fetch(long page, long itemsPerPage, Sql sql) + { + throw new NotImplementedException(); + } + + public Page Page(long page, long itemsPerPage, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Page Page(long page, long itemsPerPage, Sql sql) + { + throw new NotImplementedException(); + } + + public List SkipTake(long skip, long take, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List SkipTake(long skip, long take, Sql sql) + { + throw new NotImplementedException(); + } + + public List FetchOneToMany(Expression> many, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List FetchOneToMany(Expression> many, Sql sql) + { + throw new NotImplementedException(); + } + + public List FetchOneToMany(Expression> many, Func idFunc, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public List FetchOneToMany(Expression> many, Func idFunc, Sql sql) + { + throw new NotImplementedException(); + } + + public IEnumerable Query(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public IEnumerable Query(Sql sql) + { + throw new NotImplementedException(); + } + + public IQueryProviderWithIncludes Query() + { + throw new NotImplementedException(); + } + + public T SingleById(object primaryKey) + { + throw new NotImplementedException(); + } + + public T Single(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T SingleInto(T instance, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T SingleOrDefaultById(object primaryKey) + { + throw new NotImplementedException(); + } + + public T SingleOrDefault(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T SingleOrDefaultInto(T instance, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T First(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T FirstInto(T instance, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T FirstOrDefault(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T FirstOrDefaultInto(T instance, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public T Single(Sql sql) + { + throw new NotImplementedException(); + } + + public T SingleInto(T instance, Sql sql) + { + throw new NotImplementedException(); + } + + public T SingleOrDefault(Sql sql) + { + throw new NotImplementedException(); + } + + public T SingleOrDefaultInto(T instance, Sql sql) + { + throw new NotImplementedException(); + } + + public T First(Sql sql) + { + throw new NotImplementedException(); + } + + public T FirstInto(T instance, Sql sql) + { + throw new NotImplementedException(); + } + + public T FirstOrDefault(Sql sql) + { + throw new NotImplementedException(); + } + + public T FirstOrDefaultInto(T instance, Sql sql) + { + throw new NotImplementedException(); + } + + public Dictionary Dictionary(Sql Sql) + { + throw new NotImplementedException(); + } + + public Dictionary Dictionary(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public bool Exists(object primaryKey) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, TRet> cb, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, List, TRet> cb, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, List, List, TRet> cb, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, TRet> cb, Sql sql) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, List, TRet> cb, Sql sql) + { + throw new NotImplementedException(); + } + + public TRet FetchMultiple(Func, List, List, List, TRet> cb, Sql sql) + { + throw new NotImplementedException(); + } + + public Tuple, List> FetchMultiple(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Tuple, List, List> FetchMultiple(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Tuple, List, List, List> FetchMultiple(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Tuple, List> FetchMultiple(Sql sql) + { + throw new NotImplementedException(); + } + + public Tuple, List, List> FetchMultiple(Sql sql) + { + throw new NotImplementedException(); + } + + public Tuple, List, List, List> FetchMultiple(Sql sql) + { + throw new NotImplementedException(); + } + + public Task SingleByIdAsync(object primaryKey) + { + throw new NotImplementedException(); + } + + public Task SingleOrDefaultByIdAsync(object primaryKey) + { + throw new NotImplementedException(); + } + + public Task> QueryAsync(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task> QueryAsync(Sql sql) + { + throw new NotImplementedException(); + } + + public Task> FetchAsync(string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task> FetchAsync(Sql sql) + { + throw new NotImplementedException(); + } + + public Task> FetchAsync() + { + throw new NotImplementedException(); + } + + public Task> PageAsync(long page, long itemsPerPage, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task> PageAsync(long page, long itemsPerPage, Sql sql) + { + throw new NotImplementedException(); + } + + public Task> FetchAsync(long page, long itemsPerPage, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task> FetchAsync(long page, long itemsPerPage, Sql sql) + { + throw new NotImplementedException(); + } + + public Task> SkipTakeAsync(long skip, long take, string sql, params object[] args) + { + throw new NotImplementedException(); + } + + public Task> SkipTakeAsync(long skip, long take, Sql sql) + { + throw new NotImplementedException(); + } + + #endregion + + #region Stuff + + public void BuildPageQueries(long skip, long take, string sql, ref object[] args, out string sqlCount, out string sqlPage) + { + throw new NotImplementedException(); + } + + #endregion + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index cdbfb3bb3e..02ccb9bb97 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -269,6 +269,7 @@ +