diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/AlterBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/AlterBuilder.cs new file mode 100644 index 0000000000..c95455dec6 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/AlterBuilder.cs @@ -0,0 +1,28 @@ +using NPoco; +using Umbraco.Core.Migrations.Expressions.Alter.Expressions; +using Umbraco.Core.Migrations.Expressions.Alter.Table; + +namespace Umbraco.Core.Migrations.Expressions.Alter +{ + /// + /// Implements . + /// + public class AlterBuilder : IAlterBuilder + { + private readonly IMigrationContext _context; + private readonly DatabaseType[] _supportedDatabaseTypes; + + public AlterBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) + { + _context = context; + _supportedDatabaseTypes = supportedDatabaseTypes; + } + + /// + public IAlterTableBuilder Table(string tableName) + { + var expression = new AlterTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; + return new AlterTableBuilder(_context, _supportedDatabaseTypes, expression); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs similarity index 92% rename from src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs index bb9ec2f90a..04b06c46aa 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs @@ -1,7 +1,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions +namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions { public class AlterColumnExpression : MigrationExpressionBase { diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs similarity index 70% rename from src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs index fb43257e05..f9ef2c377d 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs @@ -1,6 +1,6 @@ using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions +namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions { public class AlterDefaultConstraintExpression : MigrationExpressionBase { @@ -8,8 +8,6 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions : base(context, supportedDatabaseTypes) { } - public virtual string SchemaName { get; set; } - public virtual string TableName { get; set; } public virtual string ColumnName { get; set; } @@ -18,13 +16,16 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions public virtual object DefaultValue { get; set; } - public override string ToString() + 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 return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(TableName), - SqlSyntax.GetQuotedName(ConstraintName)); + SqlSyntax.GetQuotedTableName(TableName), + SqlSyntax.GetQuotedName(ConstraintName)); } } } diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs similarity index 67% rename from src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs index 73ead175b7..fa3190e72b 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs @@ -1,6 +1,6 @@ using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions +namespace Umbraco.Core.Migrations.Expressions.Alter.Expressions { public class AlterTableExpression : MigrationExpressionBase { @@ -8,11 +8,13 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Expressions : base(context, supportedDatabaseTypes) { } - public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { return $"ALTER TABLE {TableName}"; } diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/IAlterBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/IAlterBuilder.cs new file mode 100644 index 0000000000..80a519d449 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/IAlterBuilder.cs @@ -0,0 +1,15 @@ +using Umbraco.Core.Migrations.Expressions.Alter.Table; + +namespace Umbraco.Core.Migrations.Expressions.Alter +{ + /// + /// Builds an Alter expression. + /// + public interface IAlterBuilder : IFluentBuilder + { + /// + /// Specifies the table to alter. + /// + IAlterTableBuilder Table(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/AlterTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs similarity index 71% rename from src/Umbraco.Core/Migrations/Syntax/Alter/Table/AlterTableBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs index 92444f3a25..18d3538320 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/AlterTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs @@ -1,14 +1,14 @@ using System.Data; using NPoco; -using Umbraco.Core.Migrations.Syntax.Alter.Expressions; -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Alter.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Alter.Table +namespace Umbraco.Core.Migrations.Expressions.Alter.Table { - public class AlterTableBuilder : ExpressionBuilder, - IAlterTableColumnTypeSyntax, - IAlterTableColumnOptionForeignKeyCascadeSyntax + public class AlterTableBuilder : ExpressionBuilderBase, + IAlterTableColumnTypeBuilder, + IAlterTableColumnOptionForeignKeyCascadeBuilder { private readonly IMigrationContext _context; private readonly DatabaseType[] _supportedDatabaseTypes; @@ -29,20 +29,19 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return CurrentColumn; } - public IAlterTableColumnOptionSyntax WithDefault(SystemMethods method) + public IAlterTableColumnOptionBuilder WithDefault(SystemMethods method) { CurrentColumn.DefaultValue = method; return this; } - public IAlterTableColumnOptionSyntax WithDefaultValue(object value) + public IAlterTableColumnOptionBuilder WithDefaultValue(object value) { if (CurrentColumn.ModificationType == ModificationType.Alter) { var dc = new AlterDefaultConstraintExpression(_context, _supportedDatabaseTypes) { TableName = Expression.TableName, - SchemaName = Expression.SchemaName, ColumnName = CurrentColumn.Name, DefaultValue = value }; @@ -54,25 +53,24 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnOptionSyntax Identity() + public IAlterTableColumnOptionBuilder Identity() { CurrentColumn.IsIdentity = true; return this; } - public IAlterTableColumnOptionSyntax Indexed() + public IAlterTableColumnOptionBuilder Indexed() { return Indexed(null); } - public IAlterTableColumnOptionSyntax Indexed(string indexName) + public IAlterTableColumnOptionBuilder Indexed(string indexName) { CurrentColumn.IsIndexed = true; var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition { Name = indexName, - SchemaName = Expression.SchemaName, TableName = Expression.TableName }); @@ -86,44 +84,43 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnOptionSyntax PrimaryKey() + public IAlterTableColumnOptionBuilder PrimaryKey() { CurrentColumn.IsPrimaryKey = true; return this; } - public IAlterTableColumnOptionSyntax PrimaryKey(string primaryKeyName) + public IAlterTableColumnOptionBuilder PrimaryKey(string primaryKeyName) { CurrentColumn.IsPrimaryKey = true; CurrentColumn.PrimaryKeyName = primaryKeyName; return this; } - public IAlterTableColumnOptionSyntax Nullable() + public IAlterTableColumnOptionBuilder Nullable() { CurrentColumn.IsNullable = true; return this; } - public IAlterTableColumnOptionSyntax NotNullable() + public IAlterTableColumnOptionBuilder NotNullable() { CurrentColumn.IsNullable = false; return this; } - public IAlterTableColumnOptionSyntax Unique() + public IAlterTableColumnOptionBuilder Unique() { return Unique(null); } - public IAlterTableColumnOptionSyntax Unique(string indexName) + public IAlterTableColumnOptionBuilder Unique(string indexName) { CurrentColumn.IsUnique = true; var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition { Name = indexName, - SchemaName = Expression.SchemaName, TableName = Expression.TableName, IsUnique = true }); @@ -138,18 +135,18 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string primaryTableName, string primaryColumnName) + public IAlterTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string primaryTableName, string primaryColumnName) { return ForeignKey(null, null, primaryTableName, primaryColumnName); } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableName, + public IAlterTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableName, string primaryColumnName) { return ForeignKey(foreignKeyName, null, primaryTableName, primaryColumnName); } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableSchema, + public IAlterTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableSchema, string primaryTableName, string primaryColumnName) { CurrentColumn.IsForeignKey = true; @@ -159,8 +156,7 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table Name = foreignKeyName, PrimaryTable = primaryTableName, PrimaryTableSchema = primaryTableSchema, - ForeignTable = Expression.TableName, - ForeignTableSchema = Expression.SchemaName + ForeignTable = Expression.TableName }); fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); @@ -171,31 +167,30 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ForeignKey() + public IAlterTableColumnOptionForeignKeyCascadeBuilder ForeignKey() { CurrentColumn.IsForeignKey = true; return this; } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignTableName, string foreignColumnName) + public IAlterTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignTableName, string foreignColumnName) { return ReferencedBy(null, null, foreignTableName, foreignColumnName); } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableName, + public IAlterTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableName, string foreignColumnName) { return ReferencedBy(foreignKeyName, null, foreignTableName, foreignColumnName); } - public IAlterTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableSchema, + public IAlterTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableSchema, string foreignTableName, string foreignColumnName) { var fk = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes, new ForeignKeyDefinition { Name = foreignKeyName, PrimaryTable = Expression.TableName, - PrimaryTableSchema = Expression.SchemaName, ForeignTable = foreignTableName, ForeignTableSchema = foreignTableSchema }); @@ -208,13 +203,12 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnTypeSyntax AddColumn(string name) + public IAlterTableColumnTypeBuilder AddColumn(string name) { var column = new ColumnDefinition { Name = name, ModificationType = ModificationType.Create }; var createColumn = new CreateColumnExpression(_context, _supportedDatabaseTypes) { Column = column, - SchemaName = Expression.SchemaName, TableName = Expression.TableName }; @@ -224,13 +218,12 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnTypeSyntax AlterColumn(string name) + public IAlterTableColumnTypeBuilder AlterColumn(string name) { var column = new ColumnDefinition { Name = name, ModificationType = ModificationType.Alter }; var alterColumn = new AlterColumnExpression(_context, _supportedDatabaseTypes) { Column = column, - SchemaName = Expression.SchemaName, TableName = Expression.TableName }; @@ -240,19 +233,19 @@ namespace Umbraco.Core.Migrations.Syntax.Alter.Table return this; } - public IAlterTableColumnOptionForeignKeyCascadeSyntax OnDelete(Rule rule) + public IAlterTableColumnOptionForeignKeyCascadeBuilder OnDelete(Rule rule) { CurrentForeignKey.OnDelete = rule; return this; } - public IAlterTableColumnOptionForeignKeyCascadeSyntax OnUpdate(Rule rule) + public IAlterTableColumnOptionForeignKeyCascadeBuilder OnUpdate(Rule rule) { CurrentForeignKey.OnUpdate = rule; return this; } - public IAlterTableColumnOptionSyntax OnDeleteOrUpdate(Rule rule) + public IAlterTableColumnOptionBuilder OnDeleteOrUpdate(Rule rule) { OnDelete(rule); OnUpdate(rule); diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs new file mode 100644 index 0000000000..04537e48db --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Migrations.Expressions.Alter.Table +{ + /// + /// Builds an Alter Table expression. + /// + public interface IAlterTableBuilder : IFluentBuilder + { + /// + /// Specifies a column to add. + /// + IAlterTableColumnTypeBuilder AddColumn(string name); + + /// + /// Specifies a column to alter. + /// + IAlterTableColumnTypeBuilder AlterColumn(string name); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs new file mode 100644 index 0000000000..c1ce8f7e72 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs @@ -0,0 +1,7 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Alter.Table +{ + public interface IAlterTableColumnOptionBuilder : IColumnOptionBuilder, IAlterTableBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs new file mode 100644 index 0000000000..8099deaa56 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Alter.Table +{ + public interface IAlterTableColumnOptionForeignKeyCascadeBuilder : + IAlterTableColumnOptionBuilder, + IForeignKeyCascadeBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs new file mode 100644 index 0000000000..61fdec4ca0 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs @@ -0,0 +1,7 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Alter.Table +{ + public interface IAlterTableColumnTypeBuilder : IColumnTypeBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs similarity index 72% rename from src/Umbraco.Core/Migrations/Syntax/Expressions/CreateColumnExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs index 19e9f03f43..2883dbe669 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs @@ -1,7 +1,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Expressions +namespace Umbraco.Core.Migrations.Expressions.Common.Expressions { public class CreateColumnExpression : MigrationExpressionBase { @@ -11,11 +11,13 @@ namespace Umbraco.Core.Migrations.Syntax.Expressions Column = new ColumnDefinition { ModificationType = ModificationType.Create }; } - public string SchemaName { get; set; } public string TableName { get; set; } public ColumnDefinition Column { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { if (IsExpressionSupported() == false) return string.Empty; @@ -24,8 +26,8 @@ namespace Umbraco.Core.Migrations.Syntax.Expressions Column.TableName = TableName; return string.Format(SqlSyntax.AddColumn, - SqlSyntax.GetQuotedTableName(Column.TableName), - SqlSyntax.Format(Column)); + SqlSyntax.GetQuotedTableName(Column.TableName), + SqlSyntax.Format(Column)); } } } diff --git a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs similarity index 81% rename from src/Umbraco.Core/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs index 29337520a9..3821f44bae 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs @@ -1,7 +1,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Expressions +namespace Umbraco.Core.Migrations.Expressions.Common.Expressions { public class CreateForeignKeyExpression : MigrationExpressionBase { @@ -19,7 +19,10 @@ namespace Umbraco.Core.Migrations.Syntax.Expressions public ForeignKeyDefinition ForeignKey { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { if (IsExpressionSupported() == false) return string.Empty; diff --git a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateIndexExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs similarity index 79% rename from src/Umbraco.Core/Migrations/Syntax/Expressions/CreateIndexExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs index b14b627d44..4471632c2f 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Expressions/CreateIndexExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs @@ -1,7 +1,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Expressions +namespace Umbraco.Core.Migrations.Expressions.Common.Expressions { public class CreateIndexExpression : MigrationExpressionBase { @@ -20,7 +20,10 @@ namespace Umbraco.Core.Migrations.Syntax.Expressions public IndexDefinition Index { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { return SqlSyntax.Format(Index); } diff --git a/src/Umbraco.Core/Migrations/Syntax/IColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Common/IColumnOptionBuilder.cs similarity index 84% rename from src/Umbraco.Core/Migrations/Syntax/IColumnOptionSyntax.cs rename to src/Umbraco.Core/Migrations/Expressions/Common/IColumnOptionBuilder.cs index 72ff552cf0..06e00211a0 100644 --- a/src/Umbraco.Core/Migrations/Syntax/IColumnOptionSyntax.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/IColumnOptionBuilder.cs @@ -1,10 +1,10 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax +namespace Umbraco.Core.Migrations.Expressions.Common { - public interface IColumnOptionSyntax : IFluentSyntax - where TNext : IFluentSyntax - where TNextFk : IFluentSyntax + public interface IColumnOptionBuilder : IFluentBuilder + where TNext : IFluentBuilder + where TNextFk : IFluentBuilder { TNext WithDefault(SystemMethods method); TNext WithDefaultValue(object value); diff --git a/src/Umbraco.Core/Migrations/Syntax/IColumnTypeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Common/IColumnTypeBuilder.cs similarity index 76% rename from src/Umbraco.Core/Migrations/Syntax/IColumnTypeSyntax.cs rename to src/Umbraco.Core/Migrations/Expressions/Common/IColumnTypeBuilder.cs index a1bb09de8e..431b6c34c4 100644 --- a/src/Umbraco.Core/Migrations/Syntax/IColumnTypeSyntax.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Common/IColumnTypeBuilder.cs @@ -1,7 +1,10 @@ -namespace Umbraco.Core.Migrations.Syntax +namespace Umbraco.Core.Migrations.Expressions.Common { - public interface IColumnTypeSyntax : IFluentSyntax - where TNext : IFluentSyntax + /// + /// Builds a column type expression. + /// + public interface IColumnTypeBuilder : IFluentBuilder + where TNext : IFluentBuilder { TNext AsAnsiString(); TNext AsAnsiString(int size); diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs new file mode 100644 index 0000000000..746dea64d4 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs @@ -0,0 +1,24 @@ +using System.Data; + +namespace Umbraco.Core.Migrations.Expressions.Common +{ + public interface IForeignKeyCascadeBuilder : IFluentBuilder + where TNext : IFluentBuilder + where TNextFk : IFluentBuilder + { + /// + /// Specifies a rule on deletes. + /// + TNextFk OnDelete(Rule rule); + + /// + /// Specifies a rule on updates. + /// + TNextFk OnUpdate(Rule rule); + + /// + /// Specifies a rule on deletes and updates. + /// + TNext OnDeleteOrUpdate(Rule rule); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Column/CreateColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs similarity index 93% rename from src/Umbraco.Core/Migrations/Syntax/Create/Column/CreateColumnBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs index ecefed5f49..239f35f75c 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Column/CreateColumnBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs @@ -1,11 +1,11 @@ using System.Data; using NPoco; -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Create.Column +namespace Umbraco.Core.Migrations.Expressions.Create.Column { - public class CreateColumnBuilder : ExpressionBuilder, + public class CreateColumnBuilder : ExpressionBuilderBase, ICreateColumnOnTableSyntax, ICreateColumnTypeSyntax, ICreateColumnOptionForeignKeyCascadeSyntax @@ -62,7 +62,6 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Column var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition { Name = indexName, - SchemaName = Expression.SchemaName, TableName = Expression.TableName }); @@ -113,7 +112,6 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Column var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition { Name = indexName, - SchemaName = Expression.SchemaName, TableName = Expression.TableName, IsUnique = true }); @@ -149,8 +147,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Column Name = foreignKeyName, PrimaryTable = primaryTableName, PrimaryTableSchema = primaryTableSchema, - ForeignTable = Expression.TableName, - ForeignTableSchema = Expression.SchemaName + ForeignTable = Expression.TableName }); fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); @@ -185,7 +182,6 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Column { Name = foreignKeyName, PrimaryTable = Expression.TableName, - PrimaryTableSchema = Expression.SchemaName, ForeignTable = foreignTableName, ForeignTableSchema = foreignTableSchema }); diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs new file mode 100644 index 0000000000..819485b40f --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableSyntax.cs @@ -0,0 +1,9 @@ +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/ICreateColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs new file mode 100644 index 0000000000..89381b16a2 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000000..8d0d5c8239 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionSyntax.cs @@ -0,0 +1,9 @@ +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/ICreateColumnTypeSyntax.cs new file mode 100644 index 0000000000..8c2f34ab24 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeSyntax.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +namespace Umbraco.Core.Migrations.Expressions.Create.Column +{ + public interface ICreateColumnTypeSyntax : IColumnTypeBuilder + { + + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/CreateConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs similarity index 78% rename from src/Umbraco.Core/Migrations/Syntax/Create/Constraint/CreateConstraintBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs index 73ce66f4bc..6dfa1b994c 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/CreateConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs @@ -1,16 +1,16 @@ -using Umbraco.Core.Migrations.Syntax.Create.Expressions; +using Umbraco.Core.Migrations.Expressions.Create.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Create.Constraint +namespace Umbraco.Core.Migrations.Expressions.Create.Constraint { public class CreateConstraintBuilder : ExpressionBuilderBase, - ICreateConstraintOnTableSyntax, - ICreateConstraintColumnsSyntax + ICreateConstraintOnTableBuilder, + ICreateConstraintColumnsBuilder { public CreateConstraintBuilder(CreateConstraintExpression expression) : base(expression) { } - public ICreateConstraintColumnsSyntax OnTable(string tableName) + public ICreateConstraintColumnsBuilder OnTable(string tableName) { Expression.Constraint.TableName = tableName; return this; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs new file mode 100644 index 0000000000..f7e6f10652 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Constraint +{ + public interface ICreateConstraintColumnsBuilder : IFluentBuilder + { + void Column(string columnName); + void 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 new file mode 100644 index 0000000000..b8385b7332 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Constraint +{ + public interface ICreateConstraintOnTableBuilder : IFluentBuilder + { + ICreateConstraintColumnsBuilder OnTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/CreateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs similarity index 63% rename from src/Umbraco.Core/Migrations/Syntax/Create/CreateBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs index f7fa947898..4ef90faa99 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/CreateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs @@ -1,18 +1,21 @@ using System; using NPoco; -using Umbraco.Core.Migrations.Syntax.Create.Column; -using Umbraco.Core.Migrations.Syntax.Create.Constraint; -using Umbraco.Core.Migrations.Syntax.Create.Expressions; -using Umbraco.Core.Migrations.Syntax.Create.ForeignKey; -using Umbraco.Core.Migrations.Syntax.Create.Index; -using Umbraco.Core.Migrations.Syntax.Create.Table; -using Umbraco.Core.Migrations.Syntax.Execute.Expressions; -using Umbraco.Core.Migrations.Syntax.Expressions; +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.Table; +using Umbraco.Core.Migrations.Expressions.Execute.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; -namespace Umbraco.Core.Migrations.Syntax.Create +namespace Umbraco.Core.Migrations.Expressions.Create { + /// + /// Implements . + /// public class CreateBuilder : ICreateBuilder { private readonly IMigrationContext _context; @@ -26,126 +29,129 @@ namespace Umbraco.Core.Migrations.Syntax.Create private ISqlSyntaxProvider SqlSyntax => _context.Database.SqlContext.SqlSyntax; - public void Table(bool withoutKeysAndIndexes = false) + /// + public void Table(bool withoutKeysAndIndexes = false) { - var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(T), SqlSyntax); + var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(TDto), SqlSyntax); - AddSql(SqlSyntax.Format(tableDefinition)); + ExecuteSql(SqlSyntax.Format(tableDefinition)); if (withoutKeysAndIndexes) return; - AddSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); + ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - AddSql(sql); + ExecuteSql(sql); foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - AddSql(sql); + ExecuteSql(sql); } - public void KeysAndIndexes() + /// + public void KeysAndIndexes() { - var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(T), SqlSyntax); + var tableDefinition = DefinitionFactory.GetTableDefinition(typeof(TDto), SqlSyntax); - AddSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); + ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - AddSql(sql); + ExecuteSql(sql); foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - AddSql(sql); + ExecuteSql(sql); } + /// public void KeysAndIndexes(Type typeOfDto) { var tableDefinition = DefinitionFactory.GetTableDefinition(typeOfDto, SqlSyntax); - AddSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); + ExecuteSql(SqlSyntax.FormatPrimaryKey(tableDefinition)); foreach (var sql in SqlSyntax.Format(tableDefinition.Indexes)) - AddSql(sql); + ExecuteSql(sql); foreach (var sql in SqlSyntax.Format(tableDefinition.ForeignKeys)) - AddSql(sql); + ExecuteSql(sql); } - private void AddSql(string sql) + private void ExecuteSql(string sql) { var expression = new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) { SqlStatement = sql }; - _context.Expressions.Add(expression); + expression.Execute(); } - public ICreateTableWithColumnSyntax Table(string tableName) + /// + public ICreateTableWithColumnBuilder Table(string tableName) { var expression = new CreateTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - _context.Expressions.Add(expression); return new CreateTableBuilder(_context, _supportedDatabaseTypes, expression); } + /// public ICreateColumnOnTableSyntax Column(string columnName) { var expression = new CreateColumnExpression(_context, _supportedDatabaseTypes) { Column = { Name = columnName } }; - _context.Expressions.Add(expression); return new CreateColumnBuilder(_context, _supportedDatabaseTypes, expression); } - public ICreateForeignKeyFromTableSyntax ForeignKey() + /// + public ICreateForeignKeyFromTableBuilder ForeignKey() { var expression = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes); - _context.Expressions.Add(expression); return new CreateForeignKeyBuilder(expression); } - public ICreateForeignKeyFromTableSyntax ForeignKey(string foreignKeyName) + /// + public ICreateForeignKeyFromTableBuilder ForeignKey(string foreignKeyName) { var expression = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes) { ForeignKey = { Name = foreignKeyName } }; - _context.Expressions.Add(expression); return new CreateForeignKeyBuilder(expression); } - public ICreateIndexForTableSyntax Index() + /// + public ICreateIndexForTableBuilder Index() { var expression = new CreateIndexExpression(_context, _supportedDatabaseTypes); - _context.Expressions.Add(expression); return new CreateIndexBuilder(expression); } - public ICreateIndexForTableSyntax Index(string indexName) + /// + public ICreateIndexForTableBuilder Index(string indexName) { var expression = new CreateIndexExpression(_context, _supportedDatabaseTypes) { Index = { Name = indexName } }; - _context.Expressions.Add(expression); return new CreateIndexBuilder(expression); } - public ICreateConstraintOnTableSyntax PrimaryKey() + /// + public ICreateConstraintOnTableBuilder PrimaryKey() { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey); - _context.Expressions.Add(expression); return new CreateConstraintBuilder(expression); } - public ICreateConstraintOnTableSyntax PrimaryKey(string primaryKeyName) + /// + public ICreateConstraintOnTableBuilder PrimaryKey(string primaryKeyName) { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey); expression.Constraint.ConstraintName = primaryKeyName; - _context.Expressions.Add(expression); return new CreateConstraintBuilder(expression); } - public ICreateConstraintOnTableSyntax UniqueConstraint() + /// + public ICreateConstraintOnTableBuilder UniqueConstraint() { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.Unique); - _context.Expressions.Add(expression); return new CreateConstraintBuilder(expression); } - public ICreateConstraintOnTableSyntax UniqueConstraint(string constraintName) + /// + public ICreateConstraintOnTableBuilder UniqueConstraint(string constraintName) { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.Unique); expression.Constraint.ConstraintName = constraintName; - _context.Expressions.Add(expression); return new CreateConstraintBuilder(expression); } - public ICreateConstraintOnTableSyntax Constraint(string constraintName) + /// + public ICreateConstraintOnTableBuilder Constraint(string constraintName) { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.NonUnique); expression.Constraint.ConstraintName = constraintName; - _context.Expressions.Add(expression); return new CreateConstraintBuilder(expression); } } diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs similarity index 95% rename from src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs index fb8f0233d0..c7dd54a815 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs @@ -2,7 +2,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Create.Expressions +namespace Umbraco.Core.Migrations.Expressions.Create.Expressions { public class CreateConstraintExpression : MigrationExpressionBase { diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs similarity index 92% rename from src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs index 2889ada3d2..7bc669632a 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs @@ -2,7 +2,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Create.Expressions +namespace Umbraco.Core.Migrations.Expressions.Create.Expressions { public class CreateTableExpression : MigrationExpressionBase { diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/CreateForeignKeyBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs similarity index 67% rename from src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/CreateForeignKeyBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs index 07f9b8ec34..d7e3bc62e4 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/CreateForeignKeyBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs @@ -1,64 +1,64 @@ using System.Data; -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey { public class CreateForeignKeyBuilder : ExpressionBuilderBase, - ICreateForeignKeyFromTableSyntax, - ICreateForeignKeyForeignColumnSyntax, - ICreateForeignKeyToTableSyntax, - ICreateForeignKeyPrimaryColumnSyntax, - ICreateForeignKeyCascadeSyntax + ICreateForeignKeyFromTableBuilder, + ICreateForeignKeyForeignColumnBuilder, + ICreateForeignKeyToTableBuilder, + ICreateForeignKeyPrimaryColumnBuilder, + ICreateForeignKeyCascadeBuilder { public CreateForeignKeyBuilder(CreateForeignKeyExpression expression) : base(expression) { } - public ICreateForeignKeyForeignColumnSyntax FromTable(string table) + public ICreateForeignKeyForeignColumnBuilder FromTable(string table) { Expression.ForeignKey.ForeignTable = table; return this; } - public ICreateForeignKeyToTableSyntax ForeignColumn(string column) + public ICreateForeignKeyToTableBuilder ForeignColumn(string column) { Expression.ForeignKey.ForeignColumns.Add(column); return this; } - public ICreateForeignKeyToTableSyntax ForeignColumns(params string[] columns) + public ICreateForeignKeyToTableBuilder ForeignColumns(params string[] columns) { foreach (var column in columns) Expression.ForeignKey.ForeignColumns.Add(column); return this; } - public ICreateForeignKeyPrimaryColumnSyntax ToTable(string table) + public ICreateForeignKeyPrimaryColumnBuilder ToTable(string table) { Expression.ForeignKey.PrimaryTable = table; return this; } - public ICreateForeignKeyCascadeSyntax PrimaryColumn(string column) + public ICreateForeignKeyCascadeBuilder PrimaryColumn(string column) { Expression.ForeignKey.PrimaryColumns.Add(column); return this; } - public ICreateForeignKeyCascadeSyntax PrimaryColumns(params string[] columns) + public ICreateForeignKeyCascadeBuilder PrimaryColumns(params string[] columns) { foreach (var column in columns) Expression.ForeignKey.PrimaryColumns.Add(column); return this; } - public ICreateForeignKeyCascadeSyntax OnDelete(Rule rule) + public ICreateForeignKeyCascadeBuilder OnDelete(Rule rule) { Expression.ForeignKey.OnDelete = rule; return this; } - public ICreateForeignKeyCascadeSyntax OnUpdate(Rule rule) + public ICreateForeignKeyCascadeBuilder OnUpdate(Rule rule) { Expression.ForeignKey.OnUpdate = rule; return this; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs new file mode 100644 index 0000000000..ef5a2980ee --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs @@ -0,0 +1,11 @@ +using System.Data; + +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey +{ + public interface ICreateForeignKeyCascadeBuilder : IFluentBuilder + { + ICreateForeignKeyCascadeBuilder OnDelete(Rule rule); + ICreateForeignKeyCascadeBuilder OnUpdate(Rule rule); + void OnDeleteOrUpdate(Rule rule); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs new file mode 100644 index 0000000000..2abebc513e --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey +{ + public interface ICreateForeignKeyForeignColumnBuilder : IFluentBuilder + { + ICreateForeignKeyToTableBuilder ForeignColumn(string column); + ICreateForeignKeyToTableBuilder ForeignColumns(params string[] columns); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs new file mode 100644 index 0000000000..bb6ea987b5 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey +{ + public interface ICreateForeignKeyFromTableBuilder : IFluentBuilder + { + ICreateForeignKeyForeignColumnBuilder FromTable(string table); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs new file mode 100644 index 0000000000..39ad38cd7d --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey +{ + public interface ICreateForeignKeyPrimaryColumnBuilder : IFluentBuilder + { + ICreateForeignKeyCascadeBuilder PrimaryColumn(string column); + ICreateForeignKeyCascadeBuilder PrimaryColumns(params string[] columns); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs new file mode 100644 index 0000000000..0c415cd0ac --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.ForeignKey +{ + public interface ICreateForeignKeyToTableBuilder : IFluentBuilder + { + ICreateForeignKeyPrimaryColumnBuilder ToTable(string table); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs new file mode 100644 index 0000000000..6166cb6cda --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs @@ -0,0 +1,85 @@ +using System; +using Umbraco.Core.Migrations.Expressions.Create.Column; +using Umbraco.Core.Migrations.Expressions.Create.Constraint; +using Umbraco.Core.Migrations.Expressions.Create.ForeignKey; +using Umbraco.Core.Migrations.Expressions.Create.Index; +using Umbraco.Core.Migrations.Expressions.Create.Table; + +namespace Umbraco.Core.Migrations.Expressions.Create +{ + /// + /// Builds a Create expression. + /// + public interface ICreateBuilder : IFluentBuilder + { + /// + /// Builds a Create Table expresion, and executes. + /// + void Table(bool withoutKeysAndIndexes = false); + + /// + /// Builds a Create Keys and Indexes expresion, and executes. + /// + void KeysAndIndexes(); + + /// + /// Builds a Create Keys and Indexes expresion, and executes. + /// + void KeysAndIndexes(Type typeOfDto); + + /// + /// Builds a Create Table expression. + /// + ICreateTableWithColumnBuilder Table(string tableName); + + /// + /// Builds a Create Column expression. + /// + ICreateColumnOnTableSyntax Column(string columnName); + + /// + /// Builds a Create Foreign Key expression. + /// + ICreateForeignKeyFromTableBuilder ForeignKey(); + + /// + /// Builds a Create Foreign Key expression. + /// + ICreateForeignKeyFromTableBuilder ForeignKey(string foreignKeyName); + + /// + /// Builds a Create Index expression. + /// + ICreateIndexForTableBuilder Index(); + + /// + /// Builds a Create Index expression. + /// + ICreateIndexForTableBuilder Index(string indexName); + + /// + /// Builds a Create Primary Key expression. + /// + ICreateConstraintOnTableBuilder PrimaryKey(); + + /// + /// Builds a Create Primary Key expression. + /// + ICreateConstraintOnTableBuilder PrimaryKey(string primaryKeyName); + + /// + /// Builds a Create Unique Constraint expression. + /// + ICreateConstraintOnTableBuilder UniqueConstraint(); + + /// + /// Builds a Create Unique Constraint expression. + /// + ICreateConstraintOnTableBuilder UniqueConstraint(string constraintName); + + /// + /// Builds a Create Constraint expression. + /// + ICreateConstraintOnTableBuilder Constraint(string constraintName); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Index/CreateIndexBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs similarity index 68% rename from src/Umbraco.Core/Migrations/Syntax/Create/Index/CreateIndexBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs index 34c857d798..4b5cac634d 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Index/CreateIndexBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs @@ -1,14 +1,14 @@ -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; using Umbraco.Core.Persistence.DatabaseAnnotations; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Create.Index +namespace Umbraco.Core.Migrations.Expressions.Create.Index { public class CreateIndexBuilder : ExpressionBuilderBase, - ICreateIndexForTableSyntax, - ICreateIndexOnColumnSyntax, - ICreateIndexColumnOptionsSyntax, - ICreateIndexOptionsSyntax + ICreateIndexForTableBuilder, + ICreateIndexOnColumnBuilder, + ICreateIndexColumnOptionsBuilder, + ICreateIndexOptionsBuilder { public CreateIndexBuilder(CreateIndexExpression expression) : base(expression) { @@ -16,37 +16,37 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Index public IndexColumnDefinition CurrentColumn { get; set; } - public ICreateIndexOnColumnSyntax OnTable(string tableName) + public ICreateIndexOnColumnBuilder OnTable(string tableName) { Expression.Index.TableName = tableName; return this; } - public ICreateIndexColumnOptionsSyntax OnColumn(string columnName) + public ICreateIndexColumnOptionsBuilder OnColumn(string columnName) { CurrentColumn = new IndexColumnDefinition { Name = columnName }; Expression.Index.Columns.Add(CurrentColumn); return this; } - public ICreateIndexOptionsSyntax WithOptions() + public ICreateIndexOptionsBuilder WithOptions() { return this; } - public ICreateIndexOnColumnSyntax Ascending() + public ICreateIndexOnColumnBuilder Ascending() { CurrentColumn.Direction = Direction.Ascending; return this; } - public ICreateIndexOnColumnSyntax Descending() + public ICreateIndexOnColumnBuilder Descending() { CurrentColumn.Direction = Direction.Descending; return this; } - ICreateIndexOnColumnSyntax ICreateIndexColumnOptionsSyntax.Unique() + ICreateIndexOnColumnBuilder ICreateIndexColumnOptionsBuilder.Unique() { Expression.Index.IsUnique = true; //if it is Unique then it must be unique nonclustered and set the other flags @@ -55,7 +55,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Index return this; } - public ICreateIndexOnColumnSyntax NonClustered() + public ICreateIndexOnColumnBuilder NonClustered() { Expression.Index.IndexType = IndexTypes.NonClustered; Expression.Index.IsClustered = false; @@ -64,7 +64,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Index return this; } - public ICreateIndexOnColumnSyntax Clustered() + public ICreateIndexOnColumnBuilder Clustered() { Expression.Index.IndexType = IndexTypes.Clustered; Expression.Index.IsClustered = true; @@ -75,7 +75,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Index return this; } - ICreateIndexOnColumnSyntax ICreateIndexOptionsSyntax.Unique() + ICreateIndexOnColumnBuilder ICreateIndexOptionsBuilder.Unique() { Expression.Index.IndexType = IndexTypes.UniqueNonClustered; Expression.Index.IsUnique = true; diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs new file mode 100644 index 0000000000..fbf873236d --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Index +{ + public interface ICreateIndexColumnOptionsBuilder : IFluentBuilder + { + ICreateIndexOnColumnBuilder Ascending(); + ICreateIndexOnColumnBuilder Descending(); + ICreateIndexOnColumnBuilder Unique(); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs new file mode 100644 index 0000000000..f22cedab16 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Index +{ + public interface ICreateIndexForTableBuilder : IFluentBuilder + { + ICreateIndexOnColumnBuilder OnTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs new file mode 100644 index 0000000000..3fee162b4e --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Index +{ + public interface ICreateIndexOnColumnBuilder : IFluentBuilder + { + ICreateIndexColumnOptionsBuilder OnColumn(string columnName); + ICreateIndexOptionsBuilder WithOptions(); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs new file mode 100644 index 0000000000..d3b9c51cd7 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Index +{ + public interface ICreateIndexOptionsBuilder : IFluentBuilder + { + ICreateIndexOnColumnBuilder Unique(); + ICreateIndexOnColumnBuilder NonClustered(); + ICreateIndexOnColumnBuilder Clustered(); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Table/CreateTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs similarity index 78% rename from src/Umbraco.Core/Migrations/Syntax/Create/Table/CreateTableBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs index 37475f59e6..8f73ed820a 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Table/CreateTableBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs @@ -1,16 +1,16 @@ using System.Data; using NPoco; -using Umbraco.Core.Migrations.Syntax.Create.Expressions; -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; +using Umbraco.Core.Migrations.Expressions.Create.Expressions; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Create.Table +namespace Umbraco.Core.Migrations.Expressions.Create.Table { - public class CreateTableBuilder : ExpressionBuilder, - ICreateTableWithColumnSyntax, + public class CreateTableBuilder : ExpressionBuilderBase, + ICreateTableWithColumnBuilder, ICreateTableColumnAsTypeSyntax, - ICreateTableColumnOptionForeignKeyCascadeSyntax + ICreateTableColumnOptionForeignKeyCascadeBuilder { private readonly IMigrationContext _context; private readonly DatabaseType[] _supportedDatabaseTypes; @@ -39,30 +39,30 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionSyntax WithDefault(SystemMethods method) + public ICreateTableColumnOptionBuilder WithDefault(SystemMethods method) { CurrentColumn.DefaultValue = method; return this; } - public ICreateTableColumnOptionSyntax WithDefaultValue(object value) + public ICreateTableColumnOptionBuilder WithDefaultValue(object value) { CurrentColumn.DefaultValue = value; return this; } - public ICreateTableColumnOptionSyntax Identity() + public ICreateTableColumnOptionBuilder Identity() { CurrentColumn.IsIdentity = true; return this; } - public ICreateTableColumnOptionSyntax Indexed() + public ICreateTableColumnOptionBuilder Indexed() { return Indexed(null); } - public ICreateTableColumnOptionSyntax Indexed(string indexName) + public ICreateTableColumnOptionBuilder Indexed(string indexName) { CurrentColumn.IsIndexed = true; @@ -83,7 +83,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionSyntax PrimaryKey() + public ICreateTableColumnOptionBuilder PrimaryKey() { CurrentColumn.IsPrimaryKey = true; @@ -94,7 +94,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table // for this, but I don't see another way around. MySQL doesn't support checking for a constraint before creating // it... except in a very strange way but it doesn't actually provider error feedback if it doesn't work so we cannot use // it. For now, this is what I'm doing - if (Expression.CurrentDatabaseType.IsMySql() == false) + if (Expression.DatabaseType.IsMySql() == false) { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey) { @@ -110,7 +110,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionSyntax PrimaryKey(string primaryKeyName) + public ICreateTableColumnOptionBuilder PrimaryKey(string primaryKeyName) { CurrentColumn.IsPrimaryKey = true; CurrentColumn.PrimaryKeyName = primaryKeyName; @@ -123,7 +123,7 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table // it... except in a very strange way but it doesn't actually provider error feedback if it doesn't work so we cannot use // it. For now, this is what I'm doing - if (Expression.CurrentDatabaseType.IsMySql() == false) + if (Expression.DatabaseType.IsMySql() == false) { var expression = new CreateConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey) { @@ -140,24 +140,24 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionSyntax Nullable() + public ICreateTableColumnOptionBuilder Nullable() { CurrentColumn.IsNullable = true; return this; } - public ICreateTableColumnOptionSyntax NotNullable() + public ICreateTableColumnOptionBuilder NotNullable() { CurrentColumn.IsNullable = false; return this; } - public ICreateTableColumnOptionSyntax Unique() + public ICreateTableColumnOptionBuilder Unique() { return Unique(null); } - public ICreateTableColumnOptionSyntax Unique(string indexName) + public ICreateTableColumnOptionBuilder Unique(string indexName) { CurrentColumn.IsUnique = true; @@ -179,18 +179,18 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string primaryTableName, string primaryColumnName) + public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string primaryTableName, string primaryColumnName) { return ForeignKey(null, null, primaryTableName, primaryColumnName); } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableName, + public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableName, string primaryColumnName) { return ForeignKey(foreignKeyName, null, primaryTableName, primaryColumnName); } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableSchema, + public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey(string foreignKeyName, string primaryTableSchema, string primaryTableName, string primaryColumnName) { CurrentColumn.IsForeignKey = true; @@ -212,24 +212,24 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ForeignKey() + public ICreateTableColumnOptionForeignKeyCascadeBuilder ForeignKey() { CurrentColumn.IsForeignKey = true; return this; } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignTableName, string foreignColumnName) + public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignTableName, string foreignColumnName) { return ReferencedBy(null, null, foreignTableName, foreignColumnName); } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableName, + public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableName, string foreignColumnName) { return ReferencedBy(foreignKeyName, null, foreignTableName, foreignColumnName); } - public ICreateTableColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableSchema, + public ICreateTableColumnOptionForeignKeyCascadeBuilder ReferencedBy(string foreignKeyName, string foreignTableSchema, string foreignTableName, string foreignColumnName) { var fk = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes, new ForeignKeyDefinition @@ -249,19 +249,19 @@ namespace Umbraco.Core.Migrations.Syntax.Create.Table return this; } - public ICreateTableColumnOptionForeignKeyCascadeSyntax OnDelete(Rule rule) + public ICreateTableColumnOptionForeignKeyCascadeBuilder OnDelete(Rule rule) { CurrentForeignKey.OnDelete = rule; return this; } - public ICreateTableColumnOptionForeignKeyCascadeSyntax OnUpdate(Rule rule) + public ICreateTableColumnOptionForeignKeyCascadeBuilder OnUpdate(Rule rule) { CurrentForeignKey.OnUpdate = rule; return this; } - public ICreateTableColumnOptionSyntax OnDeleteOrUpdate(Rule rule) + public ICreateTableColumnOptionBuilder OnDeleteOrUpdate(Rule rule) { OnDelete(rule); OnUpdate(rule); diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs new file mode 100644 index 0000000000..d47a2ff363 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeSyntax.cs @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000000..3d6f4cb3d2 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs @@ -0,0 +1,11 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +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 new file mode 100644 index 0000000000..e59d4d9457 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs @@ -0,0 +1,11 @@ +using Umbraco.Core.Migrations.Expressions.Common; + +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 new file mode 100644 index 0000000000..18dc02b726 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Migrations.Expressions.Create.Table +{ + public interface ICreateTableWithColumnBuilder : IFluentBuilder + { + ICreateTableColumnAsTypeSyntax 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 new file mode 100644 index 0000000000..b4b8a61716 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs @@ -0,0 +1,28 @@ +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Column +{ + /// + /// Implements . + /// + public class DeleteColumnBuilder : ExpressionBuilderBase, IDeleteColumnBuilder + { + public DeleteColumnBuilder(DeleteColumnExpression expression) + : base(expression) + { } + + /// + public void FromTable(string tableName) + { + Expression.TableName = tableName; + Expression.Execute(); + } + + /// + public IDeleteColumnBuilder Column(string columnName) + { + Expression.ColumnNames.Add(columnName); + return this; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs new file mode 100644 index 0000000000..aa872026a5 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.Column +{ + /// + /// Builds a Delete Column expression. + /// + public interface IDeleteColumnBuilder : IFluentBuilder + { + /// + /// Specifies the table of the column to delete, and execute. + /// + void FromTable(string tableName); + + /// + /// Specifies the column to delete. + /// + IDeleteColumnBuilder Column(string columnName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs new file mode 100644 index 0000000000..640c977747 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs @@ -0,0 +1,21 @@ +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Constraint +{ + /// + /// Implements . + /// + public class DeleteConstraintBuilder : ExpressionBuilderBase, IDeleteConstraintBuilder + { + public DeleteConstraintBuilder(DeleteConstraintExpression expression) + : base(expression) + { } + + /// + public void FromTable(string tableName) + { + Expression.Constraint.TableName = tableName; + Expression.Execute(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs new file mode 100644 index 0000000000..babfd0362a --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.Constraint +{ + /// + /// Builds a Delete Constraint expression. + /// + public interface IDeleteConstraintBuilder : IFluentBuilder + { + /// + /// Specifies the table of the constraint to delete, and executes. + /// + void 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 new file mode 100644 index 0000000000..3893ec3812 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.ComponentModel; +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 DeleteDataBuilder(DeleteDataExpression expression) + : base(expression) + { } + + /// + public void IsNull(string columnName) + { + Expression.Rows.Add(new DeletionDataDefinition { new KeyValuePair(columnName, null) }); + } + + /// + public IDeleteDataBuilder Row(object dataAsAnonymousType) + { + Expression.Rows.Add(GetData(dataAsAnonymousType)); + return this; + } + + /// + public void AllRows() + { + Expression.IsAllRows = true; + Expression.Execute(); + } + + /// + public void Execute() + { + Expression.Execute(); + } + + private static DeletionDataDefinition GetData(object dataAsAnonymousType) + { + var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); + + var data = new DeletionDataDefinition(); + foreach (PropertyDescriptor property in properties) + data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); + return data; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs new file mode 100644 index 0000000000..ba42dee997 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs @@ -0,0 +1,28 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.Data +{ + /// + /// Builds a Delete Data expression. + /// + public interface IDeleteDataBuilder : IFluentBuilder + { + /// + /// Specifies a row to be deleted. + /// + IDeleteDataBuilder Row(object dataAsAnonymousType); + + /// + /// Specifies that all rows must be deleted, and executes. + /// + void AllRows(); + + /// + /// Specifies that rows with a specified column being null must be deleted, and executes. + /// + void IsNull(string columnName); + + /// + /// Executes. + /// + void Execute(); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs new file mode 100644 index 0000000000..299345cbb7 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs @@ -0,0 +1,30 @@ +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint +{ + /// + /// Implements , . + /// + public class DeleteDefaultConstraintBuilder : ExpressionBuilderBase, + IDeleteDefaultConstraintOnTableBuilder, + IDeleteDefaultConstraintOnColumnBuilder + { + public DeleteDefaultConstraintBuilder(DeleteDefaultConstraintExpression expression) + : base(expression) + { } + + /// + public IDeleteDefaultConstraintOnColumnBuilder OnTable(string tableName) + { + Expression.TableName = tableName; + return this; + } + + /// + public void OnColumn(string columnName) + { + Expression.ColumnName = columnName; + Expression.Execute(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs new file mode 100644 index 0000000000..d78583dcfb --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint +{ + /// + /// Builds a Delete Default Constraint On Column expression. + /// + public interface IDeleteDefaultConstraintOnColumnBuilder : IFluentBuilder + { + /// + /// Specifies the column of the constraint to delete, and executes. + /// + void 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 new file mode 100644 index 0000000000..95834bcea8 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint +{ + /// + /// Builds a Delete Default Constraint On Table expression. + /// + public interface IDeleteDefaultConstraintOnTableBuilder : IFluentBuilder + { + /// + /// Specifies the table of the constraint to delete. + /// + IDeleteDefaultConstraintOnColumnBuilder OnTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs new file mode 100644 index 0000000000..1d4f89778a --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs @@ -0,0 +1,138 @@ +using NPoco; +using System.Linq; +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; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Delete.ForeignKey; +using Umbraco.Core.Migrations.Expressions.Delete.Index; +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; + private readonly DatabaseType[] _supportedDatabaseTypes; + + public DeleteBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) + { + _context = context; + _supportedDatabaseTypes = supportedDatabaseTypes; + } + + /// + public void Table(string tableName) + { + var expression = new DeleteTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; + expression.Execute(); + } + + /// + public void 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); + } + } + + /// + public IDeleteColumnBuilder Column(string columnName) + { + var expression = new DeleteColumnExpression(_context, _supportedDatabaseTypes) {ColumnNames = {columnName}}; + return new DeleteColumnBuilder(expression); + } + + /// + public IDeleteForeignKeyFromTableBuilder ForeignKey() + { + var expression = new DeleteForeignKeyExpression(_context, _supportedDatabaseTypes); + return new DeleteForeignKeyBuilder(expression); + } + + /// + public IDeleteForeignKeyOnTableBuilder ForeignKey(string foreignKeyName) + { + var expression = new DeleteForeignKeyExpression(_context, _supportedDatabaseTypes) {ForeignKey = {Name = foreignKeyName}}; + return new DeleteForeignKeyBuilder(expression); + } + + /// + public IDeleteDataBuilder FromTable(string tableName) + { + var expression = new DeleteDataExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; + return new DeleteDataBuilder(expression); + } + + /// + public IDeleteIndexForTableBuilder Index() + { + var expression = new DeleteIndexExpression(_context, _supportedDatabaseTypes); + return new DeleteIndexBuilder(expression); + } + + /// + public IDeleteIndexForTableBuilder Index(string indexName) + { + var expression = new DeleteIndexExpression(_context, _supportedDatabaseTypes) { Index = { Name = indexName } }; + return new DeleteIndexBuilder(expression); + } + + /// + public IDeleteConstraintBuilder PrimaryKey(string primaryKeyName) + { + var expression = new DeleteConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey) + { + Constraint = { ConstraintName = primaryKeyName } + }; + return new DeleteConstraintBuilder(expression); + } + + /// + public IDeleteConstraintBuilder UniqueConstraint(string constraintName) + { + var expression = new DeleteConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.Unique) + { + Constraint = { ConstraintName = constraintName } + }; + return new DeleteConstraintBuilder(expression); + } + + /// + public IDeleteDefaultConstraintOnTableBuilder DefaultConstraint() + { + var expression = new DeleteDefaultConstraintExpression(_context, _supportedDatabaseTypes); + return new DeleteDefaultConstraintBuilder(expression); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs similarity index 51% rename from src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs index 800d756c5d..af0d687b25 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; -using System.Linq; using System.Text; using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions { public class DeleteColumnExpression : MigrationExpressionBase { @@ -13,25 +12,24 @@ namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions ColumnNames = new List(); } - public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } public ICollection ColumnNames { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { if (IsExpressionSupported() == false) return string.Empty; - var sb = new StringBuilder(); - foreach (string columnName in ColumnNames) + var stmts = new StringBuilder(); + foreach (var columnName in ColumnNames) { - if (ColumnNames.First() != columnName) sb.AppendLine(";"); - sb.AppendFormat(SqlSyntax.DropColumn, - SqlSyntax.GetQuotedTableName(TableName), - SqlSyntax.GetQuotedColumnName(columnName)); + stmts.AppendFormat(SqlSyntax.DropColumn, SqlSyntax.GetQuotedTableName(TableName), SqlSyntax.GetQuotedColumnName(columnName)); + AppendStatementSeparator(stmts); } - - return sb.ToString(); + return stmts.ToString(); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs new file mode 100644 index 0000000000..594067098d --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs @@ -0,0 +1,37 @@ +using NPoco; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions +{ + public class DeleteConstraintExpression : MigrationExpressionBase + { + public DeleteConstraintExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes, ConstraintType type) + : base(context, supportedDatabaseTypes) + { + Constraint = new ConstraintDefinition(type); + } + + public ConstraintDefinition Constraint { get; } + + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() + { + return DatabaseType.IsMySql() + ? GetMySql() + : string.Format(SqlSyntax.DeleteConstraint, + SqlSyntax.GetQuotedTableName(Constraint.TableName), + SqlSyntax.GetQuotedName(Constraint.ConstraintName)); + } + + private string GetMySql() + { + return string.Format(SqlSyntax.DeleteConstraint, + SqlSyntax.GetQuotedTableName(Constraint.TableName), + Constraint.IsPrimaryKeyConstraint ? "PRIMARY KEY" : "FOREIGN KEY", + ""); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs new file mode 100644 index 0000000000..720613e110 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs @@ -0,0 +1,42 @@ +using System.Linq; +using System.Collections.Generic; +using System.Text; +using NPoco; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions +{ + public class DeleteDataExpression : MigrationExpressionBase + { + public DeleteDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { } + + public string TableName { get; set; } + public virtual bool IsAllRows { get; set; } + + public List Rows { get; } = new List(); + + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() + { + if (IsAllRows) + return string.Format(SqlSyntax.DeleteData, SqlSyntax.GetQuotedTableName(TableName), "(1=1)"); + + var stmts = new StringBuilder(); + foreach (var row in Rows) + { + var whereClauses = row.Select(kvp => $"{SqlSyntax.GetQuotedColumnName(kvp.Key)} {(kvp.Value == null ? "IS" : "=")} {GetQuotedValue(kvp.Value)}"); + + stmts.Append(string.Format(SqlSyntax.DeleteData, + SqlSyntax.GetQuotedTableName(TableName), + string.Join(" AND ", whereClauses))); + + AppendStatementSeparator(stmts); + } + return stmts.ToString(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs similarity index 65% rename from src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs index f3177af500..b46921c55f 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs @@ -1,6 +1,6 @@ using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions { public class DeleteDefaultConstraintExpression : MigrationExpressionBase { @@ -8,18 +8,20 @@ namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions : base(context, supportedDatabaseTypes) { } - public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } public virtual string ColumnName { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { if (IsExpressionSupported() == false) return string.Empty; return string.Format(SqlSyntax.DeleteDefaultConstraint, - TableName, - ColumnName); + SqlSyntax.GetQuotedTableName(TableName), + SqlSyntax.GetQuotedColumnName(ColumnName)); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs new file mode 100644 index 0000000000..1b306af3a7 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs @@ -0,0 +1,55 @@ +using System; +using System.Linq; +using NPoco; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions +{ + public class DeleteForeignKeyExpression : MigrationExpressionBase + { + public DeleteForeignKeyExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { + ForeignKey = new ForeignKeyDefinition(); + } + + public ForeignKeyDefinition ForeignKey { get; set; } + + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() + { + if (IsExpressionSupported() == false) + return string.Empty; + + if (ForeignKey.ForeignTable == null) + throw new ArgumentNullException("Table name not specified, ensure you have appended the OnTable extension. Format should be Delete.ForeignKey(KeyName).OnTable(TableName)"); + + if (DatabaseType.IsMySql()) + return GetMySql(); + + if (string.IsNullOrEmpty(ForeignKey.Name)) + { + ForeignKey.Name = $"FK_{ForeignKey.ForeignTable}_{ForeignKey.PrimaryTable}_{ForeignKey.PrimaryColumns.First()}"; + } + + return string.Format(SqlSyntax.DeleteConstraint, + SqlSyntax.GetQuotedTableName(ForeignKey.ForeignTable), + SqlSyntax.GetQuotedName(ForeignKey.Name)); + } + + private string GetMySql() + { + // MySql naming "convention" for foreignkeys, which aren't explicitly named + if (string.IsNullOrEmpty(ForeignKey.Name)) + ForeignKey.Name = $"{ForeignKey.ForeignTable.ToLower()}_ibfk_1"; + + return string.Format(SqlSyntax.DeleteConstraint, + SqlSyntax.GetQuotedTableName(ForeignKey.ForeignTable), + "FOREIGN KEY", + SqlSyntax.GetQuotedName(ForeignKey.Name)); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs similarity index 70% rename from src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs index 31cdba5be8..c12ea346bc 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs @@ -1,7 +1,7 @@ using NPoco; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions { public class DeleteIndexExpression : MigrationExpressionBase { @@ -19,11 +19,14 @@ namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions public IndexDefinition Index { get; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { return string.Format(SqlSyntax.DropIndex, - SqlSyntax.GetQuotedName(Index.Name), - SqlSyntax.GetQuotedTableName(Index.TableName)); + SqlSyntax.GetQuotedName(Index.Name), + SqlSyntax.GetQuotedTableName(Index.TableName)); } } } diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs similarity index 69% rename from src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs index a663213240..915d829696 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs @@ -1,6 +1,6 @@ using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions +namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions { public class DeleteTableExpression : MigrationExpressionBase { @@ -8,13 +8,12 @@ namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions : base(context, supportedDatabaseTypes) { } - public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } public override string ToString() { return string.Format(SqlSyntax.DropTable, - SqlSyntax.GetQuotedTableName(TableName)); + SqlSyntax.GetQuotedTableName(TableName)); } } } diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/DeleteForeignKeyBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs similarity index 51% rename from src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/DeleteForeignKeyBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs index 792fcebf43..9a5f25217f 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/DeleteForeignKeyBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs @@ -1,59 +1,67 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey { + /// + /// Implements IDeleteForeignKey... + /// public class DeleteForeignKeyBuilder : ExpressionBuilderBase, - IDeleteForeignKeyFromTableSyntax, - IDeleteForeignKeyForeignColumnSyntax, - IDeleteForeignKeyToTableSyntax, - IDeleteForeignKeyPrimaryColumnSyntax, - IDeleteForeignKeyOnTableSyntax + IDeleteForeignKeyFromTableBuilder, + IDeleteForeignKeyForeignColumnBuilder, + IDeleteForeignKeyToTableBuilder, + IDeleteForeignKeyPrimaryColumnBuilder, + IDeleteForeignKeyOnTableBuilder { - public DeleteForeignKeyBuilder(DeleteForeignKeyExpression expression) : base(expression) - { - } + public DeleteForeignKeyBuilder(DeleteForeignKeyExpression expression) + : base(expression) + { } - public IDeleteForeignKeyForeignColumnSyntax FromTable(string foreignTableName) + /// + public IDeleteForeignKeyForeignColumnBuilder FromTable(string foreignTableName) { Expression.ForeignKey.ForeignTable = foreignTableName; return this; } - public IDeleteForeignKeyToTableSyntax ForeignColumn(string column) + /// + public IDeleteForeignKeyToTableBuilder ForeignColumn(string column) { Expression.ForeignKey.ForeignColumns.Add(column); return this; } - public IDeleteForeignKeyToTableSyntax ForeignColumns(params string[] columns) + /// + public IDeleteForeignKeyToTableBuilder ForeignColumns(params string[] columns) { foreach (var column in columns) - { Expression.ForeignKey.ForeignColumns.Add(column); - } return this; } - public IDeleteForeignKeyPrimaryColumnSyntax ToTable(string table) + /// + public IDeleteForeignKeyPrimaryColumnBuilder ToTable(string table) { Expression.ForeignKey.PrimaryTable = table; return this; } + /// public void PrimaryColumn(string column) { Expression.ForeignKey.PrimaryColumns.Add(column); + Expression.Execute(); } + /// public void PrimaryColumns(params string[] columns) { foreach (var column in columns) - { Expression.ForeignKey.PrimaryColumns.Add(column); - } + Expression.Execute(); } + /// public void OnTable(string foreignTableName) { Expression.ForeignKey.ForeignTable = foreignTableName; diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs new file mode 100644 index 0000000000..6f9e16f684 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +{ + /// + /// Builds a Delete Foreign Key expression. + /// + public interface IDeleteForeignKeyForeignColumnBuilder : IFluentBuilder + { + /// + /// Specifies the foreign column. + /// + IDeleteForeignKeyToTableBuilder ForeignColumn(string column); + + /// + /// Specifies the foreign columns. + /// + IDeleteForeignKeyToTableBuilder ForeignColumns(params string[] columns); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs new file mode 100644 index 0000000000..7bd16cefa2 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +{ + /// + /// Builds a Delete Foreign Key expression. + /// + public interface IDeleteForeignKeyFromTableBuilder : IFluentBuilder + { + /// + /// Specifies the source table of the foreign key. + /// + IDeleteForeignKeyForeignColumnBuilder FromTable(string foreignTableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs new file mode 100644 index 0000000000..35095c6650 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +{ + /// + /// Builds a Delete Foreign Key expression. + /// + public interface IDeleteForeignKeyOnTableBuilder : IFluentBuilder + { + /// + /// Specifies the table of the foreign key, and executes. + /// + void 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 new file mode 100644 index 0000000000..1722c3b7f9 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +{ + /// + /// Builds a Delete Foreign Key expression. + /// + public interface IDeleteForeignKeyPrimaryColumnBuilder : IFluentBuilder + { + /// + /// Specifies the target primary column, and executes. + /// + void PrimaryColumn(string column); + + /// + /// Specifies the target primary columns, and executes. + /// + void 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 new file mode 100644 index 0000000000..cd881042ee --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.ForeignKey +{ + /// + /// Builds a Delete Foreign Key expression. + /// + public interface IDeleteForeignKeyToTableBuilder : IFluentBuilder + { + /// + /// Specifies the target table of the foreign key. + /// + IDeleteForeignKeyPrimaryColumnBuilder ToTable(string table); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs new file mode 100644 index 0000000000..602114f14f --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs @@ -0,0 +1,72 @@ +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; +using Umbraco.Core.Migrations.Expressions.Delete.ForeignKey; +using Umbraco.Core.Migrations.Expressions.Delete.Index; + +namespace Umbraco.Core.Migrations.Expressions.Delete +{ + /// + /// Builds a Delete expression. + /// + public interface IDeleteBuilder : IFluentBuilder + { + /// + /// Specifies the table to delete, and executes. + /// + void Table(string tableName); + + /// + /// Specifies the table to delete keys and indexes for, and executes. + /// + void KeysAndIndexes(string tableName = null); + + /// + /// Specifies the column to delete. + /// + IDeleteColumnBuilder Column(string columnName); + + /// + /// Specifies the foreign key to delete. + /// + IDeleteForeignKeyFromTableBuilder ForeignKey(); + + /// + /// Specifies the foreign key to delete. + /// + IDeleteForeignKeyOnTableBuilder ForeignKey(string foreignKeyName); + + /// + /// Specifies the table to delete data from. + /// + /// + /// + IDeleteDataBuilder FromTable(string tableName); + + /// + /// Specifies the index to delete. + /// + IDeleteIndexForTableBuilder Index(); + + /// + /// Specifies the index to delete. + /// + IDeleteIndexForTableBuilder Index(string indexName); + + /// + /// Specifies the primary key to delete. + /// + IDeleteConstraintBuilder PrimaryKey(string primaryKeyName); + + /// + /// Specifies the unique constraint to delete. + /// + IDeleteConstraintBuilder UniqueConstraint(string constraintName); + + /// + /// Specifies the default constraint to delete. + /// + IDeleteDefaultConstraintOnTableBuilder DefaultConstraint(); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/DeleteIndexBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs similarity index 58% rename from src/Umbraco.Core/Migrations/Syntax/Delete/Index/DeleteIndexBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs index fbdd3d0222..247664417f 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/DeleteIndexBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs @@ -1,37 +1,40 @@ using System; -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; +using Umbraco.Core.Migrations.Expressions.Delete.Expressions; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -namespace Umbraco.Core.Migrations.Syntax.Delete.Index +namespace Umbraco.Core.Migrations.Expressions.Delete.Index { - public class DeleteIndexBuilder : ExpressionBuilderBase, IDeleteIndexForTableSyntax, IDeleteIndexOnColumnSyntax + /// + /// Implements , . + /// + public class DeleteIndexBuilder : ExpressionBuilderBase, IDeleteIndexForTableBuilder, IDeleteIndexOnColumnBuilder { - public DeleteIndexBuilder(DeleteIndexExpression expression) : base(expression) - { - } + public DeleteIndexBuilder(DeleteIndexExpression expression) + : base(expression) + { } public IndexColumnDefinition CurrentColumn { get; set; } - public IDeleteIndexOnColumnSyntax OnTable(string tableName) + public IDeleteIndexOnColumnBuilder OnTable(string tableName) { Expression.Index.TableName = tableName; return this; } - [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] + /// public void OnColumn(string columnName) { var column = new IndexColumnDefinition { Name = columnName }; Expression.Index.Columns.Add(column); + Expression.Execute(); } - [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] + /// public void OnColumns(params string[] columnNames) { foreach (string columnName in columnNames) - { Expression.Index.Columns.Add(new IndexColumnDefinition { Name = columnName }); - } + Expression.Execute(); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs new file mode 100644 index 0000000000..99b762a562 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Delete.Index +{ + /// + /// Builds a Delete Index expression. + /// + public interface IDeleteIndexForTableBuilder : IFluentBuilder + { + /// + /// Specifies the table of the index to delete. + /// + IDeleteIndexOnColumnBuilder OnTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs new file mode 100644 index 0000000000..b8eb588bed --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs @@ -0,0 +1,22 @@ +using System; + +namespace Umbraco.Core.Migrations.Expressions.Delete.Index +{ + /// + /// Builds a Delete Index expression. + /// + public interface IDeleteIndexOnColumnBuilder : IFluentBuilder + { + /// + /// Specifies the column of the index, and executes. + /// + [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] + void OnColumn(string columnName); + + /// + /// Specifies the column of the index, and executes. + /// + [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] + void OnColumns(params string[] columnNames); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs new file mode 100644 index 0000000000..c21c4f9619 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Table/DeleteTableBuilder.cs @@ -0,0 +1,16 @@ +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/Syntax/Execute/ExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs similarity index 79% rename from src/Umbraco.Core/Migrations/Syntax/Execute/ExecuteBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs index c6f428ad94..87066ca085 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Execute/ExecuteBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs @@ -1,9 +1,12 @@ using System; using NPoco; -using Umbraco.Core.Migrations.Syntax.Execute.Expressions; +using Umbraco.Core.Migrations.Expressions.Execute.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Execute +namespace Umbraco.Core.Migrations.Expressions.Execute { + /// + /// Implements . + /// public class ExecuteBuilder : IExecuteBuilder { private readonly IMigrationContext _context; @@ -18,7 +21,7 @@ namespace Umbraco.Core.Migrations.Syntax.Execute public void Sql(string sqlStatement) { var expression = new ExecuteSqlStatementExpression(_context, _supportedDatabaseTypes) {SqlStatement = sqlStatement}; - _context.Expressions.Add(expression); + expression.Execute(); } public void Code(Func codeStatement) diff --git a/src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs similarity index 89% rename from src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs index 372112aedb..1149cda9e9 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteCodeStatementExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteCodeStatementExpression.cs @@ -1,7 +1,7 @@ using System; using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Execute.Expressions +namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions { public class ExecuteCodeStatementExpression : MigrationExpressionBase { diff --git a/src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteSqlStatementExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs similarity index 71% rename from src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteSqlStatementExpression.cs rename to src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs index c9487cce55..74dfca3f37 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Execute/Expressions/ExecuteSqlStatementExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs @@ -1,6 +1,6 @@ using NPoco; -namespace Umbraco.Core.Migrations.Syntax.Execute.Expressions +namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions { public class ExecuteSqlStatementExpression : MigrationExpressionBase { @@ -10,7 +10,10 @@ namespace Umbraco.Core.Migrations.Syntax.Execute.Expressions public virtual string SqlStatement { get; set; } - public override string ToString() + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() { if (IsExpressionSupported() == false) return string.Empty; diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs new file mode 100644 index 0000000000..d4dba5ced8 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs @@ -0,0 +1,19 @@ +using System; + +namespace Umbraco.Core.Migrations.Expressions.Execute +{ + /// + /// Builds and executes an Sql statement. + /// + /// Deals with multi-statements Sql. + public interface IExecuteBuilder : IFluentBuilder + { + /// + /// Executes an Sql statement. + /// + void Sql(string sqlStatement); + + [Obsolete("kill.kill.kill")] + void Code(Func codeStatement); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBase.cs b/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBase.cs new file mode 100644 index 0000000000..e491cf30c7 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBase.cs @@ -0,0 +1,22 @@ +namespace Umbraco.Core.Migrations.Expressions +{ + /// + /// Provides a base class for expression builders. + /// + public abstract class ExpressionBuilderBase + where TExpression : IMigrationExpression + { + /// + /// Initializes a new instance of the class. + /// + protected ExpressionBuilderBase(TExpression expression) + { + Expression = expression; + } + + /// + /// Gets the expression. + /// + public TExpression Expression { get; } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs b/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs new file mode 100644 index 0000000000..91cf471b0a --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs @@ -0,0 +1,185 @@ +using System.Data; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions +{ + /// + /// Provides a base class for expression builders. + /// + public abstract class ExpressionBuilderBase : ExpressionBuilderBase + where TExpression : IMigrationExpression + where TNext : IFluentBuilder + { + /// + /// Initializes a new instance of the class. + /// + protected ExpressionBuilderBase(TExpression expression) + : base(expression) + { } + + // FIXME WTF is this and what is TNext here?! + + public abstract ColumnDefinition GetColumnForType(); + + private ColumnDefinition Column => GetColumnForType(); + + public TNext AsAnsiString() + { + Column.Type = DbType.AnsiString; + return (TNext)(object)this; + } + + public TNext AsAnsiString(int size) + { + Column.Type = DbType.AnsiString; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsBinary() + { + Column.Type = DbType.Binary; + return (TNext)(object)this; + } + + public TNext AsBinary(int size) + { + Column.Type = DbType.Binary; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsBoolean() + { + Column.Type = DbType.Boolean; + return (TNext)(object)this; + } + + public TNext AsByte() + { + Column.Type = DbType.Byte; + return (TNext)(object)this; + } + + public TNext AsCurrency() + { + Column.Type = DbType.Currency; + return (TNext)(object)this; + } + + public TNext AsDate() + { + Column.Type = DbType.Date; + return (TNext)(object)this; + } + + public TNext AsDateTime() + { + Column.Type = DbType.DateTime; + return (TNext)(object)this; + } + + public TNext AsDecimal() + { + Column.Type = DbType.Decimal; + return (TNext)(object)this; + } + + public TNext AsDecimal(int size, int precision) + { + Column.Type = DbType.Decimal; + Column.Size = size; + Column.Precision = precision; + return (TNext)(object)this; + } + + public TNext AsDouble() + { + Column.Type = DbType.Double; + return (TNext)(object)this; + } + + public TNext AsFixedLengthString(int size) + { + Column.Type = DbType.StringFixedLength; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsFixedLengthAnsiString(int size) + { + Column.Type = DbType.AnsiStringFixedLength; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsFloat() + { + Column.Type = DbType.Single; + return (TNext)(object)this; + } + + public TNext AsGuid() + { + Column.Type = DbType.Guid; + return (TNext)(object)this; + } + + public TNext AsInt16() + { + Column.Type = DbType.Int16; + return (TNext)(object)this; + } + + public TNext AsInt32() + { + Column.Type = DbType.Int32; + return (TNext)(object)this; + } + + public TNext AsInt64() + { + Column.Type = DbType.Int64; + return (TNext)(object)this; + } + + public TNext AsString() + { + Column.Type = DbType.String; + return (TNext)(object)this; + } + + public TNext AsString(int size) + { + Column.Type = DbType.String; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsTime() + { + Column.Type = DbType.Time; + return (TNext)(object)this; + } + + public TNext AsXml() + { + Column.Type = DbType.Xml; + return (TNext)(object)this; + } + + public TNext AsXml(int size) + { + Column.Type = DbType.Xml; + Column.Size = size; + return (TNext)(object)this; + } + + public TNext AsCustom(string customType) + { + Column.Type = null; + Column.CustomType = customType; + return (TNext)(object)this; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/IFluentBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/IFluentBuilder.cs new file mode 100644 index 0000000000..6d947ef410 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/IFluentBuilder.cs @@ -0,0 +1,5 @@ +namespace Umbraco.Core.Migrations.Expressions +{ + public interface IFluentBuilder + { } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs new file mode 100644 index 0000000000..94a62c0c06 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Text; +using System.Linq; +using NPoco; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Insert.Expressions +{ + public class InsertDataExpression : MigrationExpressionBase + { + public InsertDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { } + + public string TableName { get; set; } + public bool EnabledIdentityInsert { get; set; } + + public List Rows { get; } = new List(); + + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() + { + if (IsExpressionSupported() == false) + return string.Empty; + + var stmts = new StringBuilder(); + + if (EnabledIdentityInsert && SqlSyntax.SupportsIdentityInsert()) + { + stmts.AppendLine($"SET IDENTITY_INSERT {SqlSyntax.GetQuotedTableName(TableName)} ON"); + AppendStatementSeparator(stmts); + } + + try + { + foreach (var item in Rows) + { + var cols = string.Join(",", item.Select(x => x.Key)); + var vals = string.Join(",", item.Select(x => x.Value)); + + var sql = string.Format(SqlSyntax.InsertData, + SqlSyntax.GetQuotedTableName(TableName), + cols, vals); + + stmts.Append(sql); + AppendStatementSeparator(stmts); + } + } + finally + { + if (EnabledIdentityInsert && SqlSyntax.SupportsIdentityInsert()) + { + stmts.AppendLine($"SET IDENTITY_INSERT {SqlSyntax.GetQuotedTableName(TableName)} OFF"); + AppendStatementSeparator(stmts); + } + } + + return stmts.ToString(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs new file mode 100644 index 0000000000..14dab6e0da --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Insert +{ + /// + /// Builds an Insert expression. + /// + public interface IInsertBuilder : IFluentBuilder + { + /// + /// Builds an Insert Into expression. + /// + IInsertIntoBuilder IntoTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs new file mode 100644 index 0000000000..442023ea62 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs @@ -0,0 +1,23 @@ +namespace Umbraco.Core.Migrations.Expressions.Insert +{ + /// + /// Builds an Insert Into expression. + /// + public interface IInsertIntoBuilder : IFluentBuilder + { + /// + /// Enables identity insert. + /// + IInsertIntoBuilder EnableIdentityInsert(); + + /// + /// Specifies a row to be inserted. + /// + IInsertIntoBuilder Row(object dataAsAnonymousType); + + /// + /// Executes. + /// + void Execute(); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Insert/InsertBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertBuilder.cs similarity index 60% rename from src/Umbraco.Core/Migrations/Syntax/Insert/InsertBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Insert/InsertBuilder.cs index d1ae17ffef..18b9cb0b2b 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Insert/InsertBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertBuilder.cs @@ -1,13 +1,14 @@ using NPoco; -using Umbraco.Core.Migrations.Syntax.Insert.Expressions; -using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Migrations.Expressions.Insert.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Insert +namespace Umbraco.Core.Migrations.Expressions.Insert { + /// + /// Implements . + /// public class InsertBuilder : IInsertBuilder { private readonly IMigrationContext _context; - private readonly ISqlSyntaxProvider _sqlSyntax; private readonly DatabaseType[] _supportedDatabaseTypes; public InsertBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) @@ -16,11 +17,11 @@ namespace Umbraco.Core.Migrations.Syntax.Insert _supportedDatabaseTypes = supportedDatabaseTypes; } - public IInsertDataSyntax IntoTable(string tableName) + /// + public IInsertIntoBuilder IntoTable(string tableName) { var expression = new InsertDataExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - _context.Expressions.Add(expression); - return new InsertDataBuilder(expression); + return new InsertIntoBuilder(expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs new file mode 100644 index 0000000000..d17f7ff2d2 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.ComponentModel; +using Umbraco.Core.Migrations.Expressions.Insert.Expressions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; + +namespace Umbraco.Core.Migrations.Expressions.Insert +{ + /// + /// Implements . + /// + public class InsertIntoBuilder : ExpressionBuilderBase, IInsertIntoBuilder + { + public InsertIntoBuilder(InsertDataExpression expression) + : base(expression) + { } + + /// + public IInsertIntoBuilder EnableIdentityInsert() + { + Expression.EnabledIdentityInsert = true; + return this; + } + + /// + public IInsertIntoBuilder Row(object dataAsAnonymousType) + { + Expression.Rows.Add(GetData(dataAsAnonymousType)); + return this; + } + + /// + public void Execute() + { + Expression.Execute(); + } + + private static InsertionDataDefinition GetData(object dataAsAnonymousType) + { + var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); + + var data = new InsertionDataDefinition(); + foreach (PropertyDescriptor property in properties) + data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); + return data; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs new file mode 100644 index 0000000000..dd2ccb889f --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Rename.Column +{ + /// + /// Builds a Rename Column expression. + /// + public interface IRenameColumnBuilder : IFluentBuilder + { + /// + /// Specifies the table name. + /// + IRenameColumnToBuilder OnTable(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs new file mode 100644 index 0000000000..403132c222 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Rename.Column +{ + /// + /// Builds a Rename Column expression. + /// + public interface IRenameColumnToBuilder : IFluentBuilder + { + /// + /// Specifies the new name of the column and executes. + /// + void 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 new file mode 100644 index 0000000000..bf9e48017a --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs @@ -0,0 +1,27 @@ +using Umbraco.Core.Migrations.Expressions.Rename.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Column +{ + /// + /// Implements , . + /// + public class RenameColumnBuilder : ExpressionBuilderBase, IRenameColumnToBuilder, IRenameColumnBuilder + { + public RenameColumnBuilder(RenameColumnExpression expression) : base(expression) + { } + + /// + public void To(string name) + { + Expression.NewName = name; + Expression.Execute(); + } + + /// + public IRenameColumnToBuilder OnTable(string tableName) + { + Expression.TableName = tableName; + return this; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs new file mode 100644 index 0000000000..9ed4d97486 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs @@ -0,0 +1,55 @@ +using NPoco; +using Umbraco.Core.Persistence; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Expressions +{ + public class RenameColumnExpression : MigrationExpressionBase + { + public RenameColumnExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { } + + public virtual string TableName { get; set; } + public virtual string OldName { get; set; } + public virtual string NewName { get; set; } + + public override string Process(IMigrationContext context) + => GetSql(); + + public override string ToString() // fixme kill + => GetBaseSql(); + + /// + protected override string GetSql() + { + return DatabaseType.IsMySql() + ? GetMySql() + : GetBaseSql(); + } + + private string GetBaseSql() + { + return IsExpressionSupported() == false + ? string.Empty + : SqlSyntax.FormatColumnRename(TableName, OldName, NewName); + } + + private string GetMySql() + { + var columnDefinitionSql = $@" +SELECT CONCAT( + CAST(COLUMN_TYPE AS CHAR), + IF(ISNULL(CHARACTER_SET_NAME), '', CONCAT(' CHARACTER SET ', CHARACTER_SET_NAME)), + IF(ISNULL(COLLATION_NAME), '', CONCAT(' COLLATE ', COLLATION_NAME)), + ' ', + IF(IS_NULLABLE = 'NO', 'NOT NULL ', ''), + IF(IS_NULLABLE = 'NO' AND COLUMN_DEFAULT IS NULL, '', CONCAT('DEFAULT ', QUOTE(COLUMN_DEFAULT), ' ')), + UPPER(extra)) +FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME = '{TableName}' AND COLUMN_NAME = '{OldName}'"; + + var columnDefinition = Database.ExecuteScalar(columnDefinitionSql); + return GetBaseSql() + " " + columnDefinition; + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs new file mode 100644 index 0000000000..573ac4e4b8 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs @@ -0,0 +1,36 @@ +using NPoco; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Expressions +{ + /// + /// Represents a Rename Table expression. + /// + public class RenameTableExpression : MigrationExpressionBase + { + public RenameTableExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { } + + /// + /// Gets or sets the source name. + /// + public virtual string OldName { get; set; } + + /// + /// Gets or sets the target name. + /// + public virtual string NewName { get; set; } + + /// + public override string ToString() // fixme kill + => GetSql(); + + /// + protected override string GetSql() + { + return IsExpressionSupported() == false + ? string.Empty + : SqlSyntax.FormatTableRename(OldName, NewName); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs new file mode 100644 index 0000000000..87bc85784b --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs @@ -0,0 +1,21 @@ +using Umbraco.Core.Migrations.Expressions.Rename.Column; +using Umbraco.Core.Migrations.Expressions.Rename.Table; + +namespace Umbraco.Core.Migrations.Expressions.Rename +{ + /// + /// Builds a Rename expression. + /// + public interface IRenameBuilder : IFluentBuilder + { + /// + /// Builds a Rename Table expression. + /// + IRenameTableBuilder Table(string oldName); + + /// + /// Builds a Rename Column expression. + /// + IRenameColumnBuilder Column(string oldName); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/RenameBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs similarity index 62% rename from src/Umbraco.Core/Migrations/Syntax/Rename/RenameBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs index d3a158d87e..dc500168ce 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/RenameBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs @@ -1,10 +1,13 @@ using NPoco; -using Umbraco.Core.Migrations.Syntax.Rename.Column; -using Umbraco.Core.Migrations.Syntax.Rename.Expressions; -using Umbraco.Core.Migrations.Syntax.Rename.Table; +using Umbraco.Core.Migrations.Expressions.Rename.Column; +using Umbraco.Core.Migrations.Expressions.Rename.Expressions; +using Umbraco.Core.Migrations.Expressions.Rename.Table; -namespace Umbraco.Core.Migrations.Syntax.Rename +namespace Umbraco.Core.Migrations.Expressions.Rename { + /// + /// Implements . + /// public class RenameBuilder : IRenameBuilder { private readonly IMigrationContext _context; @@ -16,17 +19,17 @@ namespace Umbraco.Core.Migrations.Syntax.Rename _supportedDatabaseTypes = supportedDatabaseTypes; } - public IRenameTableSyntax Table(string oldName) + /// + public IRenameTableBuilder Table(string oldName) { var expression = new RenameTableExpression(_context, _supportedDatabaseTypes) { OldName = oldName }; - _context.Expressions.Add(expression); return new RenameTableBuilder(expression); } - public IRenameColumnTableSyntax Column(string oldName) + /// + public IRenameColumnBuilder Column(string oldName) { var expression = new RenameColumnExpression(_context, _supportedDatabaseTypes) { OldName = oldName }; - _context.Expressions.Add(expression); return new RenameColumnBuilder(expression); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs new file mode 100644 index 0000000000..207c447c85 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Rename.Table +{ + /// + /// Builds a Rename Table expression. + /// + public interface IRenameTableBuilder : IFluentBuilder + { + /// + /// Specifies the new name of the table and executes. + /// + void 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 new file mode 100644 index 0000000000..89fa86622e --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs @@ -0,0 +1,21 @@ +using Umbraco.Core.Migrations.Expressions.Rename.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Rename.Table +{ + /// + /// Implements . + /// + public class RenameTableBuilder : ExpressionBuilderBase, IRenameTableBuilder + { + public RenameTableBuilder(RenameTableExpression expression) + : base(expression) + { } + + /// + public void To(string name) + { + Expression.NewName = name; + Expression.Execute(); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs new file mode 100644 index 0000000000..6ce9fb7966 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using NPoco; +using System.Linq; + +namespace Umbraco.Core.Migrations.Expressions.Update.Expressions +{ + public class UpdateDataExpression : MigrationExpressionBase + { + public UpdateDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) + : base(context, supportedDatabaseTypes) + { } + + public string TableName { get; set; } + + public List> Set { get; set; } + public List> Where { get; set; } + public bool IsAllRows { get; set; } + + public override string ToString() // fixme kill + => GetSql(); + + protected override string GetSql() + { + if (IsExpressionSupported() == false) + return string.Empty; + + var updateItems = Set.Select(x => $"{SqlSyntax.GetQuotedColumnName(x.Key)} = {GetQuotedValue(x.Value)}"); + var whereClauses = IsAllRows + ? null + : Where.Select(x => $"{SqlSyntax.GetQuotedColumnName(x.Key)} {(x.Value == null ? "IS" : "=")} {GetQuotedValue(x.Value)}"); + + var whereClause = whereClauses == null + ? "(1=1)" + : string.Join(" AND ", whereClauses.ToArray()); + + return string.Format(SqlSyntax.UpdateData, + SqlSyntax.GetQuotedTableName(TableName), + string.Join(", ", updateItems), + whereClause); + } + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs new file mode 100644 index 0000000000..cb045830cb --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Update +{ + /// + /// Builds an Update expression. + /// + public interface IUpdateBuilder : IFluentBuilder + { + /// + /// Builds an Update Table expression. + /// + IUpdateTableBuilder Table(string tableName); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs new file mode 100644 index 0000000000..f0f5835356 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Migrations.Expressions.Update +{ + /// + /// Builds an Update Table expression. + /// + public interface IUpdateTableBuilder + { + /// + /// Specifies the data. + /// + IUpdateWhereBuilder Set(object dataAsAnonymousType); + } +} diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs new file mode 100644 index 0000000000..88c8936072 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Migrations.Expressions.Update +{ + /// + /// Builds an Update Table ... Where expression. + /// + public interface IUpdateWhereBuilder + { + /// + /// Specifies rows to update, and executes. + /// + void Where(object dataAsAnonymousType); + + /// + /// Specifies that all rows must be updated, and executes. + /// + void AllRows(); + } +} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/UpdateBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs similarity index 61% rename from src/Umbraco.Core/Migrations/Syntax/Update/UpdateBuilder.cs rename to src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs index 6a8afbd842..9dec308a9e 100644 --- a/src/Umbraco.Core/Migrations/Syntax/Update/UpdateBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs @@ -1,8 +1,11 @@ using NPoco; -using Umbraco.Core.Migrations.Syntax.Update.Expressions; +using Umbraco.Core.Migrations.Expressions.Update.Expressions; -namespace Umbraco.Core.Migrations.Syntax.Update +namespace Umbraco.Core.Migrations.Expressions.Update { + /// + /// Implements . + /// public class UpdateBuilder : IUpdateBuilder { private readonly IMigrationContext _context; @@ -14,11 +17,11 @@ namespace Umbraco.Core.Migrations.Syntax.Update _supportedDatabaseTypes = supportedDatabaseTypes; } - public IUpdateSetSyntax Table(string tableName) + /// + public IUpdateTableBuilder Table(string tableName) { var expression = new UpdateDataExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - _context.Expressions.Add(expression); - return new UpdateDataBuilder(expression, _context); + return new UpdateDataBuilder(expression); } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs new file mode 100644 index 0000000000..501efb5056 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using Umbraco.Core.Migrations.Expressions.Update.Expressions; + +namespace Umbraco.Core.Migrations.Expressions.Update +{ + /// + /// Implements , / + /// + public class UpdateDataBuilder : ExpressionBuilderBase, IUpdateTableBuilder, IUpdateWhereBuilder + { + public UpdateDataBuilder(UpdateDataExpression expression) + : base(expression) + { } + + /// + public IUpdateWhereBuilder Set(object dataAsAnonymousType) + { + Expression.Set = GetData(dataAsAnonymousType); + return this; + } + + /// + public void Where(object dataAsAnonymousType) + { + Expression.Where = GetData(dataAsAnonymousType); + Expression.Execute(); + } + + /// + public void AllRows() + { + Expression.IsAllRows = true; + Expression.Execute(); + } + + private static List> GetData(object dataAsAnonymousType) + { + var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); + + var data = new List>(); + foreach (PropertyDescriptor property in properties) + data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); + return data; + } + } +} diff --git a/src/Umbraco.Core/Migrations/ILocalMigration.cs b/src/Umbraco.Core/Migrations/ILocalMigration.cs index a4670cb390..5822298150 100644 --- a/src/Umbraco.Core/Migrations/ILocalMigration.cs +++ b/src/Umbraco.Core/Migrations/ILocalMigration.cs @@ -1,8 +1,8 @@ -using Umbraco.Core.Migrations.Syntax.Alter; -using Umbraco.Core.Migrations.Syntax.Create; -using Umbraco.Core.Migrations.Syntax.Delete; -using Umbraco.Core.Migrations.Syntax.Execute; -using Umbraco.Core.Migrations.Syntax.Update; +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 { @@ -11,7 +11,7 @@ namespace Umbraco.Core.Migrations IExecuteBuilder Execute { get; } IDeleteBuilder Delete { get; } IUpdateBuilder Update { get; } - IAlterSyntaxBuilder Alter { 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 e555fbce89..335df94057 100644 --- a/src/Umbraco.Core/Migrations/IMigrationContext.cs +++ b/src/Umbraco.Core/Migrations/IMigrationContext.cs @@ -4,16 +4,33 @@ using Umbraco.Core.Persistence; namespace Umbraco.Core.Migrations { + /// + /// Provides context to migrations. + /// public interface IMigrationContext { - IUmbracoDatabase Database { get; } - - ICollection Expressions { get; set; } - + /// + /// Gets the logger. + /// ILogger Logger { get; } - ILocalMigration GetLocalMigration(); + /// + /// Gets the database instance. + /// + IUmbracoDatabase Database { get; } + /// + /// Gets the Sql context. + /// ISqlContext SqlContext { get; } + + /// + /// 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/IMigrationExpression.cs b/src/Umbraco.Core/Migrations/IMigrationExpression.cs index e4265d9190..8f950ab301 100644 --- a/src/Umbraco.Core/Migrations/IMigrationExpression.cs +++ b/src/Umbraco.Core/Migrations/IMigrationExpression.cs @@ -5,6 +5,7 @@ /// public interface IMigrationExpression { - string Process(IMigrationContext context); + string Process(IMigrationContext context); // fixme kill + void Execute(); } } diff --git a/src/Umbraco.Core/Migrations/LocalMigration.cs b/src/Umbraco.Core/Migrations/LocalMigration.cs index 53729b3a93..6e1ee1a713 100644 --- a/src/Umbraco.Core/Migrations/LocalMigration.cs +++ b/src/Umbraco.Core/Migrations/LocalMigration.cs @@ -1,11 +1,11 @@ using System.Linq; using System.Text; using Umbraco.Core.Logging; -using Umbraco.Core.Migrations.Syntax.Alter; -using Umbraco.Core.Migrations.Syntax.Create; -using Umbraco.Core.Migrations.Syntax.Delete; -using Umbraco.Core.Migrations.Syntax.Execute; -using Umbraco.Core.Migrations.Syntax.Update; +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 @@ -22,7 +22,7 @@ namespace Umbraco.Core.Migrations public IUpdateBuilder Update => new UpdateBuilder(this); - public IAlterSyntaxBuilder Alter => new AlterSyntaxBuilder(this); + public IAlterBuilder Alter => new AlterBuilder(this); public ICreateBuilder Create => new CreateBuilder(this); diff --git a/src/Umbraco.Core/Migrations/MigrationBase.cs b/src/Umbraco.Core/Migrations/MigrationBase.cs index 3ef3bb27bc..5e89182121 100644 --- a/src/Umbraco.Core/Migrations/MigrationBase.cs +++ b/src/Umbraco.Core/Migrations/MigrationBase.cs @@ -1,65 +1,112 @@ using System; using NPoco; using Umbraco.Core.Logging; -using Umbraco.Core.Migrations.Syntax.Alter; -using Umbraco.Core.Migrations.Syntax.Create; -using Umbraco.Core.Migrations.Syntax.Delete; -using Umbraco.Core.Migrations.Syntax.Execute; -using Umbraco.Core.Migrations.Syntax.IfDatabase; -using Umbraco.Core.Migrations.Syntax.Insert; -using Umbraco.Core.Migrations.Syntax.Rename; -using Umbraco.Core.Migrations.Syntax.Update; +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.Insert; +using Umbraco.Core.Migrations.Expressions.Rename; +using Umbraco.Core.Migrations.Expressions.Update; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Migrations { + /// + /// Provides a base class to all migrations. + /// public abstract class MigrationBase : IMigration { - public ISqlSyntaxProvider SqlSyntax => Context.SqlContext.SqlSyntax; - - public DatabaseType DatabaseType => Context.Database.DatabaseType; - - public ILogger Logger { get; } - protected IMigrationContext Context { get; } - + /// + /// Initializes a new instance of the class. + /// + /// A migration context. protected MigrationBase(IMigrationContext context) { - Logger = context.Logger; Context = context; } + /// + /// Gets the migration context. + /// + protected IMigrationContext Context { get; } + + /// + /// Gets the logger. + /// + protected ILogger Logger => Context.Logger; + + /// + /// Gets the Sql syntax. + /// + protected ISqlSyntaxProvider SqlSyntax => Context.SqlContext.SqlSyntax; + + /// + /// Gets the database instance. + /// + protected IUmbracoDatabase Database => Context.Database; + + /// + /// Gets the database type. + /// + protected DatabaseType DatabaseType => Context.Database.DatabaseType; + + /// + /// Creates a new Sql statement. + /// + protected Sql Sql() => Context.SqlContext.Sql(); + + /// + /// Creates a new Sql statement with arguments. + /// + protected Sql Sql(string sql, params object[] args) => Context.SqlContext.Sql(sql, args); + + /// public virtual void Up() { throw new NotSupportedException("This migration does not implement the \"up\" operation."); } + /// public virtual void Down() { throw new NotSupportedException("This migration does not implement the \"down\" operation."); } - public IAlterSyntaxBuilder Alter => new AlterSyntaxBuilder(Context); + /// + /// Builds an Alter expression. + /// + public IAlterBuilder Alter => new AlterBuilder(Context); + /// + /// Builds a Create expression. + /// public ICreateBuilder Create => new CreateBuilder(Context); + /// + /// Builds a Delete expression. + /// public IDeleteBuilder Delete => new DeleteBuilder(Context); + /// + /// Builds an Execute expression. + /// public IExecuteBuilder Execute => new ExecuteBuilder(Context); + /// + /// Builds an Insert expression. + /// public IInsertBuilder Insert => new InsertBuilder(Context); + /// + /// Builds a Rename expression. + /// public IRenameBuilder Rename => new RenameBuilder(Context); + /// + /// Builds an Update expression. + /// public IUpdateBuilder Update => new UpdateBuilder(Context); - - protected Sql Sql() => Context.SqlContext.Sql(); - - protected Sql Sql(string sql, params object[] args) => Context.SqlContext.Sql(sql, args); - - public IIfDatabaseBuilder IfDatabase(params DatabaseType[] supportedDatabaseTypes) - { - return new IfDatabaseBuilder(Context, supportedDatabaseTypes); - } } } diff --git a/src/Umbraco.Core/Migrations/MigrationContext.cs b/src/Umbraco.Core/Migrations/MigrationContext.cs index 094c2e7194..e996fe0410 100644 --- a/src/Umbraco.Core/Migrations/MigrationContext.cs +++ b/src/Umbraco.Core/Migrations/MigrationContext.cs @@ -15,14 +15,16 @@ namespace Umbraco.Core.Migrations Logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - public ICollection Expressions { get; set; } + public ILogger Logger { get; } public IUmbracoDatabase Database { get; } public ISqlContext SqlContext => Database.SqlContext; - public ILogger Logger { get; } + public int Index { get; set; } - public ILocalMigration GetLocalMigration() => new LocalMigration(Database, Logger); + 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 7fc7349130..3addba1075 100644 --- a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs @@ -1,28 +1,40 @@ using System; +using System.IO; using System.Linq; +using System.Text; using NPoco; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Migrations { + /// + /// Provides a base class for migration expressions. + /// public abstract class MigrationExpressionBase : IMigrationExpression { - private readonly IMigrationContext _context; + private bool _executed; protected MigrationExpressionBase(IMigrationContext context, DatabaseType[] supportedDatabaseTypes = null) { - if (context == null) throw new ArgumentNullException(nameof(context)); - _context = context; + Context = context ?? throw new ArgumentNullException(nameof(context)); SupportedDatabaseTypes = supportedDatabaseTypes; } - public virtual DatabaseType[] SupportedDatabaseTypes { get; } + protected IMigrationContext Context { get; } - public ISqlSyntaxProvider SqlSyntax => _context.Database.SqlContext.SqlSyntax; + protected ILogger Logger => Context.Logger; - public virtual DatabaseType CurrentDatabaseType => _context.Database.DatabaseType; + protected ISqlSyntaxProvider SqlSyntax => Context.Database.SqlContext.SqlSyntax; - public bool IsExpressionSupported() + protected IUmbracoDatabase Database => Context.Database; + + public DatabaseType DatabaseType => Context.Database.DatabaseType; + + public DatabaseType[] SupportedDatabaseTypes { get; } + + public bool IsExpressionSupported() // fixme - do we need this?! { return SupportedDatabaseTypes == null || SupportedDatabaseTypes.Length == 0 @@ -33,7 +45,7 @@ namespace Umbraco.Core.Migrations // need to accept SqlServer2012 too => cannot simply test with "Contains" // and have to test the types. //|| SupportedDatabaseTypes.Contains(CurrentDatabaseType); - || SupportedDatabaseTypes.Any(x => CurrentDatabaseType.GetType().Inherits(x.GetType())); + || SupportedDatabaseTypes.Any(x => DatabaseType.GetType().Inherits(x.GetType())); } public virtual string Process(IMigrationContext context) @@ -41,6 +53,63 @@ namespace Umbraco.Core.Migrations return ToString(); } + protected virtual string GetSql() + { + return ToString(); + } + + public void Execute() + { + if (_executed) + throw new InvalidOperationException("This expression has already been executed."); + _executed = true; + + var sql = GetSql(); + + if (string.IsNullOrWhiteSpace(sql)) + { + Logger.Info(GetType(), $"SQL [{Context.Index}]: "); + Context.Index++; + return; + } + + // split multiple statements - required for SQL CE + // http://stackoverflow.com/questions/13665491/sql-ce-inconsistent-with-multiple-statements + var stmtBuilder = new StringBuilder(); + using (var reader = new StringReader(sql)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + line = line.Trim(); + if (line.Equals("GO", StringComparison.OrdinalIgnoreCase)) + ExecuteStatement(stmtBuilder); + else + stmtBuilder.AppendLine(line); + } + + if (stmtBuilder.Length > 0) + ExecuteStatement(stmtBuilder); + } + + Context.Index++; + } + + private void ExecuteStatement(StringBuilder stmtBuilder) + { + var stmt = stmtBuilder.ToString(); + Logger.Info(GetType(), $"SQL [{Context.Index}]: {stmt}"); + Database.Execute(stmt); + stmtBuilder.Clear(); + } + + protected void AppendStatementSeparator(StringBuilder stmtBuilder) + { + stmtBuilder.AppendLine(";"); + if (DatabaseType.IsSqlServerOrCe()) + stmtBuilder.AppendLine("GO"); + } + /// /// This might be useful in the future if we add it to the interface, but for now it's used to hack the DeleteAppTables & DeleteForeignKeyExpression /// to ensure they are not executed twice. diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/AlterSyntaxBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/AlterSyntaxBuilder.cs deleted file mode 100644 index b8442c17f8..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/AlterSyntaxBuilder.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using NPoco; -using Umbraco.Core.Migrations.Syntax.Alter.Column; -using Umbraco.Core.Migrations.Syntax.Alter.Expressions; -using Umbraco.Core.Migrations.Syntax.Alter.Table; - -namespace Umbraco.Core.Migrations.Syntax.Alter -{ - public class AlterSyntaxBuilder : IAlterSyntaxBuilder - { - private readonly IMigrationContext _context; - private readonly DatabaseType[] _supportedDatabaseTypes; - - public AlterSyntaxBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) - { - _context = context; - _supportedDatabaseTypes = supportedDatabaseTypes; - } - - public IAlterTableSyntax Table(string tableName) - { - var expression = new AlterTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - //_context.Expressions.Add(expression); - return new AlterTableBuilder(_context, _supportedDatabaseTypes, expression); - } - - /// - /// The problem with this is that only under particular circumstances is the expression added to the context - /// so you wouldn't actually know if you are using it correctly or not and chances are you are not and therefore - /// the statement won't even execute whereas using the IAlterTableSyntax to modify a column is guaranteed to add - /// the expression to the context. - /// - /// - /// - [Obsolete("Use the IAlterTableSyntax to modify a column instead, this will be removed in future versions")] - public IAlterColumnSyntax Column(string columnName) - { - var expression = new AlterColumnExpression(_context, _supportedDatabaseTypes) {Column = {Name = columnName}}; - //_context.Expressions.Add(expression); - return new AlterColumnBuilder(_context, _supportedDatabaseTypes, expression); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/AlterColumnBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Column/AlterColumnBuilder.cs deleted file mode 100644 index d1c8e009ab..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/AlterColumnBuilder.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System.Data; -using NPoco; -using Umbraco.Core.Migrations.Syntax.Alter.Expressions; -using Umbraco.Core.Migrations.Syntax.Expressions; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Alter.Column -{ - public class AlterColumnBuilder : ExpressionBuilder, - IAlterColumnSyntax, - IAlterColumnTypeSyntax, - IAlterColumnOptionForeignKeyCascadeSyntax - { - private readonly IMigrationContext _context; - private readonly DatabaseType[] _supportedDatabaseTypes; - - public AlterColumnBuilder(IMigrationContext context, DatabaseType[] supportedDatabaseTypes, AlterColumnExpression expression) - : base(expression) - { - _context = context; - _supportedDatabaseTypes = supportedDatabaseTypes; - } - - public ForeignKeyDefinition CurrentForeignKey { get; set; } - - public override ColumnDefinition GetColumnForType() - { - return Expression.Column; - } - - public IAlterColumnTypeSyntax OnTable(string name) - { - Expression.TableName = name; - return this; - } - - public IAlterColumnOptionSyntax WithDefault(SystemMethods method) - { - var dc = new AlterDefaultConstraintExpression(_context, _supportedDatabaseTypes) - { - TableName = Expression.TableName, - SchemaName = Expression.SchemaName, - ColumnName = Expression.Column.Name, - DefaultValue = method - }; - - _context.Expressions.Add(dc); - - Expression.Column.DefaultValue = method; - - return this; - } - - - public IAlterColumnOptionSyntax WithDefaultValue(object value) - { - var dc = new AlterDefaultConstraintExpression(_context, _supportedDatabaseTypes) - { - TableName = Expression.TableName, - SchemaName = Expression.SchemaName, - ColumnName = Expression.Column.Name, - DefaultValue = value - }; - - _context.Expressions.Add(dc); - - Expression.Column.DefaultValue = value; - - return this; - } - - public IAlterColumnOptionSyntax Identity() - { - Expression.Column.IsIdentity = true; - return this; - } - - public IAlterColumnOptionSyntax Indexed() - { - return Indexed(null); - } - - public IAlterColumnOptionSyntax Indexed(string indexName) - { - Expression.Column.IsIndexed = true; - - var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition - { - Name = indexName, - SchemaName = Expression.SchemaName, - TableName = Expression.TableName - }); - - index.Index.Columns.Add(new IndexColumnDefinition - { - Name = Expression.Column.Name - }); - - _context.Expressions.Add(index); - - return this; - } - - public IAlterColumnOptionSyntax PrimaryKey() - { - Expression.Column.IsPrimaryKey = true; - return this; - } - - public IAlterColumnOptionSyntax PrimaryKey(string primaryKeyName) - { - Expression.Column.IsPrimaryKey = true; - Expression.Column.PrimaryKeyName = primaryKeyName; - return this; - } - - public IAlterColumnOptionSyntax Nullable() - { - Expression.Column.IsNullable = true; - return this; - } - - public IAlterColumnOptionSyntax NotNullable() - { - Expression.Column.IsNullable = false; - return this; - } - - public IAlterColumnOptionSyntax Unique() - { - return Unique(null); - } - - public IAlterColumnOptionSyntax Unique(string indexName) - { - Expression.Column.IsUnique = true; - - var index = new CreateIndexExpression(_context, _supportedDatabaseTypes, new IndexDefinition - { - Name = indexName, - SchemaName = Expression.SchemaName, - TableName = Expression.TableName, - IsUnique = true - }); - - index.Index.Columns.Add(new IndexColumnDefinition - { - Name = Expression.Column.Name - }); - - _context.Expressions.Add(index); - - return this; - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ForeignKey(string primaryTableName, string primaryColumnName) - { - return ForeignKey(null, null, primaryTableName, primaryColumnName); - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableName, - string primaryColumnName) - { - return ForeignKey(foreignKeyName, null, primaryTableName, primaryColumnName); - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ForeignKey(string foreignKeyName, string primaryTableSchema, - string primaryTableName, string primaryColumnName) - { - Expression.Column.IsForeignKey = true; - - var fk = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes, new ForeignKeyDefinition - { - Name = foreignKeyName, - PrimaryTable = primaryTableName, - PrimaryTableSchema = primaryTableSchema, - ForeignTable = Expression.TableName, - ForeignTableSchema = Expression.SchemaName - }); - - fk.ForeignKey.PrimaryColumns.Add(primaryColumnName); - fk.ForeignKey.ForeignColumns.Add(Expression.Column.Name); - - _context.Expressions.Add(fk); - CurrentForeignKey = fk.ForeignKey; - return this; - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ForeignKey() - { - Expression.Column.IsForeignKey = true; - return this; - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignTableName, string foreignColumnName) - { - return ReferencedBy(null, null, foreignTableName, foreignColumnName); - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableName, - string foreignColumnName) - { - return ReferencedBy(foreignKeyName, null, foreignTableName, foreignColumnName); - } - - public IAlterColumnOptionForeignKeyCascadeSyntax ReferencedBy(string foreignKeyName, string foreignTableSchema, - string foreignTableName, string foreignColumnName) - { - var fk = new CreateForeignKeyExpression(_context, _supportedDatabaseTypes, new ForeignKeyDefinition - { - Name = foreignKeyName, - PrimaryTable = Expression.TableName, - PrimaryTableSchema = Expression.SchemaName, - ForeignTable = foreignTableName, - ForeignTableSchema = foreignTableSchema - }); - - fk.ForeignKey.PrimaryColumns.Add(Expression.Column.Name); - fk.ForeignKey.ForeignColumns.Add(foreignColumnName); - - _context.Expressions.Add(fk); - CurrentForeignKey = fk.ForeignKey; - return this; - } - - public IAlterColumnOptionForeignKeyCascadeSyntax OnDelete(Rule rule) - { - CurrentForeignKey.OnDelete = rule; - return this; - } - - public IAlterColumnOptionForeignKeyCascadeSyntax OnUpdate(Rule rule) - { - CurrentForeignKey.OnUpdate = rule; - return this; - } - - public IAlterColumnOptionSyntax OnDeleteOrUpdate(Rule rule) - { - OnDelete(rule); - OnUpdate(rule); - return this; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionForeignKeyCascadeSyntax.cs deleted file mode 100644 index ae26b9fd1e..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Column -{ - public interface IAlterColumnOptionForeignKeyCascadeSyntax : - IAlterColumnOptionSyntax, - IForeignKeyCascadeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionSyntax.cs deleted file mode 100644 index a7ac58ac97..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnOptionSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Column -{ - public interface IAlterColumnOptionSyntax : IColumnOptionSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnSyntax.cs deleted file mode 100644 index bd699820ae..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Column -{ - public interface IAlterColumnSyntax : IFluentSyntax - { - IAlterColumnTypeSyntax OnTable(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnTypeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnTypeSyntax.cs deleted file mode 100644 index 4f396f1c16..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Column/IAlterColumnTypeSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Column -{ - public interface IAlterColumnTypeSyntax : IColumnTypeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/IAlterSyntaxBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/IAlterSyntaxBuilder.cs deleted file mode 100644 index e2eb741c1f..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/IAlterSyntaxBuilder.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using Umbraco.Core.Migrations.Syntax.Alter.Column; -using Umbraco.Core.Migrations.Syntax.Alter.Table; - -namespace Umbraco.Core.Migrations.Syntax.Alter -{ - public interface IAlterSyntaxBuilder : IFluentSyntax - { - IAlterTableSyntax Table(string tableName); - - /// - /// The problem with this is that only under particular circumstances is the expression added to the context - /// so you wouldn't actually know if you are using it correctly or not and chances are you are not and therefore - /// the statement won't even execute whereas using the IAlterTableSyntax to modify a column is guaranteed to add - /// the expression to the context. - /// - /// - /// - [Obsolete("Use the IAlterTableSyntax to modify a column instead, this will be removed in future versions")] - IAlterColumnSyntax Column(string columnName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeSyntax.cs deleted file mode 100644 index a43ab18153..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Table -{ - public interface IAlterTableColumnOptionForeignKeyCascadeSyntax : - IAlterTableColumnOptionSyntax, - IForeignKeyCascadeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionSyntax.cs deleted file mode 100644 index fe6e05aff3..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnOptionSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Table -{ - public interface IAlterTableColumnOptionSyntax : - IColumnOptionSyntax, - IAlterTableSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnTypeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnTypeSyntax.cs deleted file mode 100644 index bc76a255c2..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableColumnTypeSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Table -{ - public interface IAlterTableColumnTypeSyntax : IColumnTypeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableSyntax.cs deleted file mode 100644 index 89fea53621..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Alter/Table/IAlterTableSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Alter.Table -{ - public interface IAlterTableSyntax : IFluentSyntax - { - IAlterTableColumnTypeSyntax AddColumn(string name); - IAlterTableColumnTypeSyntax AlterColumn(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOnTableSyntax.cs deleted file mode 100644 index ef2d72a210..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Column -{ - public interface ICreateColumnOnTableSyntax : IColumnTypeSyntax - { - ICreateColumnTypeSyntax OnTable(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs deleted file mode 100644 index 29bacacce4..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Column -{ - public interface ICreateColumnOptionForeignKeyCascadeSyntax : ICreateColumnOptionSyntax, - IForeignKeyCascadeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionSyntax.cs deleted file mode 100644 index b5a1764985..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnOptionSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Column -{ - public interface ICreateColumnOptionSyntax : IColumnOptionSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnTypeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnTypeSyntax.cs deleted file mode 100644 index 7a5e60cb08..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Column/ICreateColumnTypeSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Column -{ - public interface ICreateColumnTypeSyntax : IColumnTypeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintColumnsSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintColumnsSyntax.cs deleted file mode 100644 index 4690e1dc6e..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintColumnsSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Constraint -{ - public interface ICreateConstraintColumnsSyntax : IFluentSyntax - { - void Column(string columnName); - void Columns(string[] columnNames); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintOnTableSyntax.cs deleted file mode 100644 index 0655592a22..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Constraint/ICreateConstraintOnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Constraint -{ - public interface ICreateConstraintOnTableSyntax : IFluentSyntax - { - ICreateConstraintColumnsSyntax OnTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyCascadeSyntax.cs deleted file mode 100644 index 324e5684de..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Data; - -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey -{ - public interface ICreateForeignKeyCascadeSyntax : IFluentSyntax - { - ICreateForeignKeyCascadeSyntax OnDelete(Rule rule); - ICreateForeignKeyCascadeSyntax OnUpdate(Rule rule); - void OnDeleteOrUpdate(Rule rule); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyForeignColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyForeignColumnSyntax.cs deleted file mode 100644 index fb46976c04..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyForeignColumnSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey -{ - public interface ICreateForeignKeyForeignColumnSyntax : IFluentSyntax - { - ICreateForeignKeyToTableSyntax ForeignColumn(string column); - ICreateForeignKeyToTableSyntax ForeignColumns(params string[] columns); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyFromTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyFromTableSyntax.cs deleted file mode 100644 index 676aa891d2..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyFromTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey -{ - public interface ICreateForeignKeyFromTableSyntax : IFluentSyntax - { - ICreateForeignKeyForeignColumnSyntax FromTable(string table); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyPrimaryColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyPrimaryColumnSyntax.cs deleted file mode 100644 index e61a3f4334..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyPrimaryColumnSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey -{ - public interface ICreateForeignKeyPrimaryColumnSyntax : IFluentSyntax - { - ICreateForeignKeyCascadeSyntax PrimaryColumn(string column); - ICreateForeignKeyCascadeSyntax PrimaryColumns(params string[] columns); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyToTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyToTableSyntax.cs deleted file mode 100644 index 813fe6be3d..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ForeignKey/ICreateForeignKeyToTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.ForeignKey -{ - public interface ICreateForeignKeyToTableSyntax : IFluentSyntax - { - ICreateForeignKeyPrimaryColumnSyntax ToTable(string table); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/ICreateBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Create/ICreateBuilder.cs deleted file mode 100644 index 41a06145f8..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/ICreateBuilder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using Umbraco.Core.Migrations.Syntax.Create.Column; -using Umbraco.Core.Migrations.Syntax.Create.Constraint; -using Umbraco.Core.Migrations.Syntax.Create.ForeignKey; -using Umbraco.Core.Migrations.Syntax.Create.Index; -using Umbraco.Core.Migrations.Syntax.Create.Table; - -namespace Umbraco.Core.Migrations.Syntax.Create -{ - public interface ICreateBuilder : IFluentSyntax - { - void Table(bool withoutKeysAndIndexes = false); - void KeysAndIndexes(); - void KeysAndIndexes(Type typeOfDto); - - ICreateTableWithColumnSyntax Table(string tableName); - ICreateColumnOnTableSyntax Column(string columnName); - - ICreateForeignKeyFromTableSyntax ForeignKey(); - ICreateForeignKeyFromTableSyntax ForeignKey(string foreignKeyName); - - ICreateIndexForTableSyntax Index(); - ICreateIndexForTableSyntax Index(string indexName); - - ICreateConstraintOnTableSyntax PrimaryKey(); - ICreateConstraintOnTableSyntax PrimaryKey(string primaryKeyName); - - ICreateConstraintOnTableSyntax UniqueConstraint(); - ICreateConstraintOnTableSyntax UniqueConstraint(string constraintName); - ICreateConstraintOnTableSyntax Constraint(string constraintName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexColumnOptionsSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexColumnOptionsSyntax.cs deleted file mode 100644 index db3bce0387..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexColumnOptionsSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Index -{ - public interface ICreateIndexColumnOptionsSyntax : IFluentSyntax - { - ICreateIndexOnColumnSyntax Ascending(); - ICreateIndexOnColumnSyntax Descending(); - ICreateIndexOnColumnSyntax Unique(); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexForTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexForTableSyntax.cs deleted file mode 100644 index 934a7af023..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexForTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Index -{ - public interface ICreateIndexForTableSyntax : IFluentSyntax - { - ICreateIndexOnColumnSyntax OnTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOnColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOnColumnSyntax.cs deleted file mode 100644 index 1cb8ea8344..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOnColumnSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Index -{ - public interface ICreateIndexOnColumnSyntax : IFluentSyntax - { - ICreateIndexColumnOptionsSyntax OnColumn(string columnName); - ICreateIndexOptionsSyntax WithOptions(); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOptionsSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOptionsSyntax.cs deleted file mode 100644 index 46e76c1c6a..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Index/ICreateIndexOptionsSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Index -{ - public interface ICreateIndexOptionsSyntax : IFluentSyntax - { - ICreateIndexOnColumnSyntax Unique(); - ICreateIndexOnColumnSyntax NonClustered(); - ICreateIndexOnColumnSyntax Clustered(); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnAsTypeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnAsTypeSyntax.cs deleted file mode 100644 index 3ea94316e5..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnAsTypeSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Table -{ - public interface ICreateTableColumnAsTypeSyntax : IColumnTypeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionForeignKeyCascadeSyntax.cs deleted file mode 100644 index 203e653064..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Table -{ - public interface ICreateTableColumnOptionForeignKeyCascadeSyntax : - ICreateTableColumnOptionSyntax, - IForeignKeyCascadeSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionSyntax.cs deleted file mode 100644 index 290e21f599..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableColumnOptionSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Table -{ - public interface ICreateTableColumnOptionSyntax : - IColumnOptionSyntax, - ICreateTableWithColumnSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableWithColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableWithColumnSyntax.cs deleted file mode 100644 index b7b6eeb4ee..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Create/Table/ICreateTableWithColumnSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Create.Table -{ - public interface ICreateTableWithColumnSyntax : IFluentSyntax - { - ICreateTableColumnAsTypeSyntax WithColumn(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Column/DeleteColumnBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Column/DeleteColumnBuilder.cs deleted file mode 100644 index ca298adeba..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Column/DeleteColumnBuilder.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Column -{ - public class DeleteColumnBuilder : ExpressionBuilderBase, IDeleteColumnFromTableSyntax - { - public DeleteColumnBuilder(DeleteColumnExpression expression) : base(expression) - { - } - - public void FromTable(string tableName) - { - Expression.TableName = tableName; - } - - public IDeleteColumnFromTableSyntax Column(string columnName) - { - Expression.ColumnNames.Add(columnName); - return this; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Column/IDeleteColumnFromTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Column/IDeleteColumnFromTableSyntax.cs deleted file mode 100644 index 87f10d7dec..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Column/IDeleteColumnFromTableSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.Column -{ - public interface IDeleteColumnFromTableSyntax : IFluentSyntax - { - void FromTable(string tableName); - IDeleteColumnFromTableSyntax Column(string columnName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/DeleteConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/DeleteConstraintBuilder.cs deleted file mode 100644 index 20287319a5..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/DeleteConstraintBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Constraint -{ - public class DeleteConstraintBuilder : ExpressionBuilderBase, IDeleteConstraintOnTableSyntax - { - public DeleteConstraintBuilder(DeleteConstraintExpression expression) : base(expression) - { - } - - public void FromTable(string tableName) - { - Expression.Constraint.TableName = tableName; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/IDeleteConstraintOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/IDeleteConstraintOnTableSyntax.cs deleted file mode 100644 index c1c5f1428f..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Constraint/IDeleteConstraintOnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.Constraint -{ - public interface IDeleteConstraintOnTableSyntax : IFluentSyntax - { - void FromTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs deleted file mode 100644 index 5ae0b923ef..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.DefaultConstraint -{ - public class DeleteDefaultConstraintBuilder : ExpressionBuilderBase, - IDeleteDefaultConstraintOnTableSyntax, - IDeleteDefaultConstraintOnColumnSyntax - { - public DeleteDefaultConstraintBuilder(DeleteDefaultConstraintExpression expression) - : base(expression) - { - } - - public IDeleteDefaultConstraintOnColumnSyntax OnTable(string tableName) - { - Expression.TableName = tableName; - return this; - } - - public void OnColumn(string columnName) - { - Expression.ColumnName = columnName; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnSyntax.cs deleted file mode 100644 index faacc9e5dc..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.DefaultConstraint -{ - public interface IDeleteDefaultConstraintOnColumnSyntax : IFluentSyntax - { - void OnColumn(string columnName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableSyntax.cs deleted file mode 100644 index 36b08c8e15..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.DefaultConstraint -{ - public interface IDeleteDefaultConstraintOnTableSyntax : IFluentSyntax - { - IDeleteDefaultConstraintOnColumnSyntax OnTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteBuilder.cs deleted file mode 100644 index 4a3847f254..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteBuilder.cs +++ /dev/null @@ -1,98 +0,0 @@ -using NPoco; -using Umbraco.Core.Migrations.Syntax.Delete.Column; -using Umbraco.Core.Migrations.Syntax.Delete.Constraint; -using Umbraco.Core.Migrations.Syntax.Delete.DefaultConstraint; -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; -using Umbraco.Core.Migrations.Syntax.Delete.ForeignKey; -using Umbraco.Core.Migrations.Syntax.Delete.Index; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Delete -{ - public class DeleteBuilder : IDeleteBuilder - { - private readonly IMigrationContext _context; - private readonly DatabaseType[] _supportedDatabaseTypes; - - public DeleteBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) - { - _context = context; - _supportedDatabaseTypes = supportedDatabaseTypes; - } - - public void Table(string tableName) - { - var expression = new DeleteTableExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - _context.Expressions.Add(expression); - } - - public IDeleteColumnFromTableSyntax Column(string columnName) - { - var expression = new DeleteColumnExpression(_context, _supportedDatabaseTypes) {ColumnNames = {columnName}}; - _context.Expressions.Add(expression); - return new DeleteColumnBuilder(expression); - } - - public IDeleteForeignKeyFromTableSyntax ForeignKey() - { - var expression = new DeleteForeignKeyExpression(_context, _supportedDatabaseTypes); - _context.Expressions.Add(expression); - return new DeleteForeignKeyBuilder(expression); - } - - public IDeleteForeignKeyOnTableSyntax ForeignKey(string foreignKeyName) - { - var expression = new DeleteForeignKeyExpression(_context, _supportedDatabaseTypes) {ForeignKey = {Name = foreignKeyName}}; - _context.Expressions.Add(expression); - return new DeleteForeignKeyBuilder(expression); - } - - public IDeleteDataSyntax FromTable(string tableName) - { - var expression = new DeleteDataExpression(_context, _supportedDatabaseTypes) { TableName = tableName }; - _context.Expressions.Add(expression); - return new DeleteDataBuilder(expression); - } - - public IDeleteIndexForTableSyntax Index() - { - var expression = new DeleteIndexExpression(_context, _supportedDatabaseTypes); - _context.Expressions.Add(expression); - return new DeleteIndexBuilder(expression); - } - - public IDeleteIndexForTableSyntax Index(string indexName) - { - var expression = new DeleteIndexExpression(_context, _supportedDatabaseTypes) { Index = { Name = indexName } }; - _context.Expressions.Add(expression); - return new DeleteIndexBuilder(expression); - } - - public IDeleteConstraintOnTableSyntax PrimaryKey(string primaryKeyName) - { - var expression = new DeleteConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.PrimaryKey) - { - Constraint = { ConstraintName = primaryKeyName } - }; - _context.Expressions.Add(expression); - return new DeleteConstraintBuilder(expression); - } - - public IDeleteConstraintOnTableSyntax UniqueConstraint(string constraintName) - { - var expression = new DeleteConstraintExpression(_context, _supportedDatabaseTypes, ConstraintType.Unique) - { - Constraint = { ConstraintName = constraintName } - }; - _context.Expressions.Add(expression); - return new DeleteConstraintBuilder(expression); - } - - public IDeleteDefaultConstraintOnTableSyntax DefaultConstraint() - { - var expression = new DeleteDefaultConstraintExpression(_context, _supportedDatabaseTypes); - _context.Expressions.Add(expression); - return new DeleteDefaultConstraintBuilder(expression); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteDataBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteDataBuilder.cs deleted file mode 100644 index 904f382ea0..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/DeleteDataBuilder.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Delete -{ - public class DeleteDataBuilder : IDeleteDataSyntax - { - private readonly DeleteDataExpression _expression; - - public DeleteDataBuilder(DeleteDataExpression expression) - { - _expression = expression; - } - - public void IsNull(string columnName) - { - _expression.Rows.Add(new DeletionDataDefinition - { - new KeyValuePair(columnName, null) - }); - } - - public IDeleteDataSyntax Row(object dataAsAnonymousType) - { - _expression.Rows.Add(GetData(dataAsAnonymousType)); - return this; - } - - public IDeleteDataSyntax InSchema(string schemaName) - { - _expression.SchemaName = schemaName; - return this; - } - - public void AllRows() - { - _expression.IsAllRows = true; - } - - private static DeletionDataDefinition GetData(object dataAsAnonymousType) - { - var data = new DeletionDataDefinition(); - var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); - - foreach (PropertyDescriptor property in properties) - { - data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); - } - - return data; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs deleted file mode 100644 index 75bc7d6eae..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NPoco; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions -{ - public class DeleteConstraintExpression : MigrationExpressionBase - { - public DeleteConstraintExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes, ConstraintType type) - : base(context, supportedDatabaseTypes) - { - Constraint = new ConstraintDefinition(type); - } - - public ConstraintDefinition Constraint { get; } - - public override string ToString() - { - // Test for MySQL primary key situation. - if (CurrentDatabaseType.IsMySql()) - { - if (Constraint.IsPrimaryKeyConstraint) - { - return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(Constraint.TableName), - "PRIMARY KEY", - ""); - } - else - { - return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(Constraint.TableName), - "FOREIGN KEY", - ""); - } - } - else - { - return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(Constraint.TableName), - SqlSyntax.GetQuotedName(Constraint.ConstraintName)); - } - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs deleted file mode 100644 index 561df84f7d..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using NPoco; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions -{ - public class DeleteDataExpression : MigrationExpressionBase - { - private readonly List _rows = new List(); - - public DeleteDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public virtual string SchemaName { get; set; } - public string TableName { get; set; } - public virtual bool IsAllRows { get; set; } - - public List Rows => _rows; - - public override string ToString() - { - var deleteItems = new List(); - - if (IsAllRows) - { - deleteItems.Add(string.Format(SqlSyntax.DeleteData, SqlSyntax.GetQuotedTableName(TableName), "1 = 1")); - } - else - { - foreach (var row in Rows) - { - var whereClauses = new List(); - foreach (KeyValuePair item in row) - { - whereClauses.Add(string.Format("{0} {1} {2}", - SqlSyntax.GetQuotedColumnName(item.Key), - item.Value == null ? "IS" : "=", - GetQuotedValue(item.Value))); - } - - deleteItems.Add(string.Format(SqlSyntax.DeleteData, - SqlSyntax.GetQuotedTableName(TableName), - String.Join(" AND ", whereClauses.ToArray()))); - } - } - - return String.Join("; ", deleteItems.ToArray()); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs deleted file mode 100644 index 3a12272509..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; -using NPoco; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Expressions -{ - public class DeleteForeignKeyExpression : MigrationExpressionBase - { - public DeleteForeignKeyExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { - ForeignKey = new ForeignKeyDefinition(); - } - - public ForeignKeyDefinition ForeignKey { get; set; } - - public override string ToString() - { - if (IsExpressionSupported() == false) - return string.Empty; - - if (ForeignKey.ForeignTable == null) - throw new ArgumentNullException("Table name not specified, ensure you have appended the OnTable extension. Format should be Delete.ForeignKey(KeyName).OnTable(TableName)"); - - if (CurrentDatabaseType.IsMySql()) - { - //MySql naming "convention" for foreignkeys, which aren't explicitly named - if (string.IsNullOrEmpty(ForeignKey.Name)) - ForeignKey.Name = string.Format("{0}_ibfk_1", ForeignKey.ForeignTable.ToLower()); - - return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(ForeignKey.ForeignTable), - "FOREIGN KEY", - SqlSyntax.GetQuotedName(ForeignKey.Name)); - } - - if (string.IsNullOrEmpty(ForeignKey.Name)) - { - ForeignKey.Name = string.Format("FK_{0}_{1}_{2}", ForeignKey.ForeignTable, ForeignKey.PrimaryTable, ForeignKey.PrimaryColumns.First()); - } - - return string.Format(SqlSyntax.DeleteConstraint, - SqlSyntax.GetQuotedTableName(ForeignKey.ForeignTable), - SqlSyntax.GetQuotedName(ForeignKey.Name)); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyForeignColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyForeignColumnSyntax.cs deleted file mode 100644 index b3d3afdb18..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyForeignColumnSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey -{ - public interface IDeleteForeignKeyForeignColumnSyntax : IFluentSyntax - { - IDeleteForeignKeyToTableSyntax ForeignColumn(string column); - IDeleteForeignKeyToTableSyntax ForeignColumns(params string[] columns); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyFromTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyFromTableSyntax.cs deleted file mode 100644 index f8b198b636..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyFromTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey -{ - public interface IDeleteForeignKeyFromTableSyntax : IFluentSyntax - { - IDeleteForeignKeyForeignColumnSyntax FromTable(string foreignTableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyOnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyOnTableSyntax.cs deleted file mode 100644 index 37edd643f6..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyOnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey -{ - public interface IDeleteForeignKeyOnTableSyntax : IFluentSyntax - { - void OnTable(string foreignTableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnSyntax.cs deleted file mode 100644 index 27f4335b24..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey -{ - public interface IDeleteForeignKeyPrimaryColumnSyntax : IFluentSyntax - { - void PrimaryColumn(string column); - void PrimaryColumns(params string[] columns); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyToTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyToTableSyntax.cs deleted file mode 100644 index 0b351ab73a..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/ForeignKey/IDeleteForeignKeyToTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.ForeignKey -{ - public interface IDeleteForeignKeyToTableSyntax : IFluentSyntax - { - IDeleteForeignKeyPrimaryColumnSyntax ToTable(string table); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteBuilder.cs deleted file mode 100644 index 3319a94d27..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteBuilder.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Column; -using Umbraco.Core.Migrations.Syntax.Delete.Constraint; -using Umbraco.Core.Migrations.Syntax.Delete.DefaultConstraint; -using Umbraco.Core.Migrations.Syntax.Delete.ForeignKey; -using Umbraco.Core.Migrations.Syntax.Delete.Index; - -namespace Umbraco.Core.Migrations.Syntax.Delete -{ - public interface IDeleteBuilder : IFluentSyntax - { - void Table(string tableName); - IDeleteColumnFromTableSyntax Column(string columnName); - IDeleteForeignKeyFromTableSyntax ForeignKey(); - IDeleteForeignKeyOnTableSyntax ForeignKey(string foreignKeyName); - IDeleteDataSyntax FromTable(string tableName); - IDeleteIndexForTableSyntax Index(); - IDeleteIndexForTableSyntax Index(string indexName); - IDeleteConstraintOnTableSyntax PrimaryKey(string primaryKeyName); - IDeleteConstraintOnTableSyntax UniqueConstraint(string constraintName); - IDeleteDefaultConstraintOnTableSyntax DefaultConstraint(); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteDataSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteDataSyntax.cs deleted file mode 100644 index 64709b864a..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/IDeleteDataSyntax.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete -{ - public interface IDeleteDataSyntax : IFluentSyntax - { - IDeleteDataSyntax Row(object dataAsAnonymousType); - void AllRows(); - void IsNull(string columnName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexForTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexForTableSyntax.cs deleted file mode 100644 index 68fd10e237..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexForTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Delete.Index -{ - public interface IDeleteIndexForTableSyntax : IFluentSyntax - { - IDeleteIndexOnColumnSyntax OnTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexOnColumnSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexOnColumnSyntax.cs deleted file mode 100644 index bb97622980..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Index/IDeleteIndexOnColumnSyntax.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Index -{ - public interface IDeleteIndexOnColumnSyntax : IFluentSyntax - { - [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] - void OnColumn(string columnName); - - [Obsolete("I don't think this would ever be used when dropping an index, see DeleteIndexExpression.ToString")] - void OnColumns(params string[] columnNames); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Delete/Table/DeleteTableBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Delete/Table/DeleteTableBuilder.cs deleted file mode 100644 index f9939f2730..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Delete/Table/DeleteTableBuilder.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Delete.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Delete.Table -{ - public class DeleteTableBuilder : ExpressionBuilderBase - { - public DeleteTableBuilder(DeleteTableExpression expression) : base(expression) - { - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Execute/ExecuteBuilderExtensions.cs b/src/Umbraco.Core/Migrations/Syntax/Execute/ExecuteBuilderExtensions.cs deleted file mode 100644 index 9b6e6756d6..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Execute/ExecuteBuilderExtensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Linq; -using Umbraco.Core.Persistence.SqlSyntax; - -namespace Umbraco.Core.Migrations.Syntax.Execute -{ - public static class ExecuteBuilderExtensions - { - public static void DropKeysAndIndexes(this IExecuteBuilder execute, string tableName) - { - execute.Code(context => DropKeysAndIndexes(context, tableName)); - } - - public static void DropKeysAndIndexes(this IExecuteBuilder execute) - { - execute.Code(DropKeysAndIndexes); - } - - private static string DropKeysAndIndexes(IMigrationContext context, string tableName) - { - var local = context.GetLocalMigration(); - - // 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_"))) - local.Delete.ForeignKey(key.Item2).OnTable(key.Item1); - foreach (var key in keys.Where(x => x.Item1 == tableName && x.Item2.StartsWith("PK_"))) - local.Delete.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)) - local.Delete.Index(index.IndexName).OnTable(index.TableName); - - return local.GetSql(); - } - - private static string DropKeysAndIndexes(IMigrationContext context) - { - var local = context.GetLocalMigration(); - - // 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_"))) - local.Delete.ForeignKey(key.Item2).OnTable(key.Item1); - foreach (var key in keys.Where(x => x.Item2.StartsWith("PK_"))) - local.Delete.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) - local.Delete.Index(index.IndexName).OnTable(index.TableName); - - return local.GetSql(); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Execute/IExecuteBuilder.cs deleted file mode 100644 index 3b8e1021bb..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Execute/IExecuteBuilder.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Umbraco.Core.Migrations.Syntax.Execute -{ - public interface IExecuteBuilder : IFluentSyntax - { - void Sql(string sqlStatement); - void Code(Func codeStatement); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilder.cs deleted file mode 100644 index 4aca632b3f..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilder.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System.Data; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax -{ - public abstract class ExpressionBuilder : ExpressionBuilderBase - where ExpressionT : IMigrationExpression - where NextT : IFluentSyntax - { - protected ExpressionBuilder(ExpressionT expression) - : base(expression) - { - } - - public abstract ColumnDefinition GetColumnForType(); - - private ColumnDefinition Column - { - get { return GetColumnForType(); } - } - - public NextT AsAnsiString() - { - Column.Type = DbType.AnsiString; - return (NextT)(object)this; - } - - public NextT AsAnsiString(int size) - { - Column.Type = DbType.AnsiString; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsBinary() - { - Column.Type = DbType.Binary; - return (NextT)(object)this; - } - - public NextT AsBinary(int size) - { - Column.Type = DbType.Binary; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsBoolean() - { - Column.Type = DbType.Boolean; - return (NextT)(object)this; - } - - public NextT AsByte() - { - Column.Type = DbType.Byte; - return (NextT)(object)this; - } - - public NextT AsCurrency() - { - Column.Type = DbType.Currency; - return (NextT)(object)this; - } - - public NextT AsDate() - { - Column.Type = DbType.Date; - return (NextT)(object)this; - } - - public NextT AsDateTime() - { - Column.Type = DbType.DateTime; - return (NextT)(object)this; - } - - public NextT AsDecimal() - { - Column.Type = DbType.Decimal; - return (NextT)(object)this; - } - - public NextT AsDecimal(int size, int precision) - { - Column.Type = DbType.Decimal; - Column.Size = size; - Column.Precision = precision; - return (NextT)(object)this; - } - - public NextT AsDouble() - { - Column.Type = DbType.Double; - return (NextT)(object)this; - } - - public NextT AsFixedLengthString(int size) - { - Column.Type = DbType.StringFixedLength; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsFixedLengthAnsiString(int size) - { - Column.Type = DbType.AnsiStringFixedLength; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsFloat() - { - Column.Type = DbType.Single; - return (NextT)(object)this; - } - - public NextT AsGuid() - { - Column.Type = DbType.Guid; - return (NextT)(object)this; - } - - public NextT AsInt16() - { - Column.Type = DbType.Int16; - return (NextT)(object)this; - } - - public NextT AsInt32() - { - Column.Type = DbType.Int32; - return (NextT)(object)this; - } - - public NextT AsInt64() - { - Column.Type = DbType.Int64; - return (NextT)(object)this; - } - - public NextT AsString() - { - Column.Type = DbType.String; - return (NextT)(object)this; - } - - public NextT AsString(int size) - { - Column.Type = DbType.String; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsTime() - { - Column.Type = DbType.Time; - return (NextT)(object)this; - } - - public NextT AsXml() - { - Column.Type = DbType.Xml; - return (NextT)(object)this; - } - - public NextT AsXml(int size) - { - Column.Type = DbType.Xml; - Column.Size = size; - return (NextT)(object)this; - } - - public NextT AsCustom(string customType) - { - Column.Type = null; - Column.CustomType = customType; - return (NextT)(object)this; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilderBase.cs b/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilderBase.cs deleted file mode 100644 index b4d8938fd1..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/ExpressionBuilderBase.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax -{ - public abstract class ExpressionBuilderBase - where T : IMigrationExpression - { - public T Expression { get; private set; } - - protected ExpressionBuilderBase(T expression) - { - Expression = expression; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/IFluentSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/IFluentSyntax.cs deleted file mode 100644 index c1b6d7c2e5..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/IFluentSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax -{ - public interface IFluentSyntax - { - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/IForeignKeyCascadeSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/IForeignKeyCascadeSyntax.cs deleted file mode 100644 index 36fc624631..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/IForeignKeyCascadeSyntax.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Data; - -namespace Umbraco.Core.Migrations.Syntax -{ - public interface IForeignKeyCascadeSyntax : IFluentSyntax - where TNext : IFluentSyntax - where TNextFk : IFluentSyntax - { - TNextFk OnDelete(Rule rule); - TNextFk OnUpdate(Rule rule); - TNext OnDeleteOrUpdate(Rule rule); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IIfDatabaseBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IIfDatabaseBuilder.cs deleted file mode 100644 index e26e6ff45d..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IIfDatabaseBuilder.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Create; -using Umbraco.Core.Migrations.Syntax.Delete; -using Umbraco.Core.Migrations.Syntax.Execute; -using Umbraco.Core.Migrations.Syntax.Rename; -using Umbraco.Core.Migrations.Syntax.Update; - -namespace Umbraco.Core.Migrations.Syntax.IfDatabase -{ - public interface IIfDatabaseBuilder : IFluentSyntax - { - ICreateBuilder Create { get; } - IExecuteBuilder Execute { get; } - IDeleteBuilder Delete { get; } - IRenameBuilder Rename { get; } - IUpdateBuilder Update { get; } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IfDatabaseBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IfDatabaseBuilder.cs deleted file mode 100644 index 02d1483c0a..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/IfDatabase/IfDatabaseBuilder.cs +++ /dev/null @@ -1,31 +0,0 @@ -using NPoco; -using Umbraco.Core.Migrations.Syntax.Create; -using Umbraco.Core.Migrations.Syntax.Delete; -using Umbraco.Core.Migrations.Syntax.Execute; -using Umbraco.Core.Migrations.Syntax.Rename; -using Umbraco.Core.Migrations.Syntax.Update; - -namespace Umbraco.Core.Migrations.Syntax.IfDatabase -{ - public class IfDatabaseBuilder : IIfDatabaseBuilder - { - private readonly IMigrationContext _context; - private readonly DatabaseType[] _supportedDatabaseTypes; - - public IfDatabaseBuilder(IMigrationContext context, params DatabaseType[] supportedDatabaseTypes) - { - _context = context; - _supportedDatabaseTypes = supportedDatabaseTypes; - } - - public ICreateBuilder Create => new CreateBuilder(_context, _supportedDatabaseTypes); - - public IExecuteBuilder Execute => new ExecuteBuilder(_context, _supportedDatabaseTypes); - - public IDeleteBuilder Delete => new DeleteBuilder(_context, _supportedDatabaseTypes); - - public IRenameBuilder Rename => new RenameBuilder(_context, _supportedDatabaseTypes); - - public IUpdateBuilder Update => new UpdateBuilder(_context, _supportedDatabaseTypes); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Insert/Expressions/InsertDataExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Insert/Expressions/InsertDataExpression.cs deleted file mode 100644 index c7022f7d15..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Insert/Expressions/InsertDataExpression.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System.Collections.Generic; -using System.Text; -using NPoco; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Insert.Expressions -{ - public class InsertDataExpression : MigrationExpressionBase - { - private readonly List _rows = new List(); - - public InsertDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public string SchemaName { get; set; } - public string TableName { get; set; } - public bool EnabledIdentityInsert { get; set; } - - public List Rows => _rows; - - public override string ToString() - { - if (IsExpressionSupported() == false) - return string.Empty; - - var sb = new StringBuilder(); - - if (EnabledIdentityInsert && SqlSyntax.SupportsIdentityInsert()) - { - sb.AppendLine(string.Format("SET IDENTITY_INSERT {0} ON;", SqlSyntax.GetQuotedTableName(TableName))); - if (CurrentDatabaseType.IsSqlServerOrCe()) - { - sb.AppendLine("GO"); - } - } - - try - { - foreach (var item in Rows) - { - var cols = ""; - var vals = ""; - foreach (var keyVal in item) - { - cols += SqlSyntax.GetQuotedColumnName(keyVal.Key) + ","; - vals += GetQuotedValue(keyVal.Value) + ","; - } - cols = cols.TrimEnd(','); - vals = vals.TrimEnd(','); - - - var sql = string.Format(SqlSyntax.InsertData, - SqlSyntax.GetQuotedTableName(TableName), - cols, vals); - - sb.AppendLine(string.Format("{0};", sql)); - if (CurrentDatabaseType.IsSqlServerOrCe()) - { - sb.AppendLine("GO"); - } - } - } - finally - { - if (EnabledIdentityInsert && SqlSyntax.SupportsIdentityInsert()) - { - sb.AppendLine(string.Format("SET IDENTITY_INSERT {0} OFF;", SqlSyntax.GetQuotedTableName(TableName))); - if (CurrentDatabaseType.IsSqlServerOrCe()) - { - sb.AppendLine("GO"); - } - } - } - - return sb.ToString(); - } - - - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertBuilder.cs deleted file mode 100644 index eb5ba5ac90..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertBuilder.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Insert -{ - public interface IInsertBuilder : IFluentSyntax - { - IInsertDataSyntax IntoTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertDataSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertDataSyntax.cs deleted file mode 100644 index b875640dc2..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Insert/IInsertDataSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Insert -{ - public interface IInsertDataSyntax : IFluentSyntax - { - IInsertDataSyntax EnableIdentityInsert(); - IInsertDataSyntax Row(object dataAsAnonymousType); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Insert/InsertDataBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Insert/InsertDataBuilder.cs deleted file mode 100644 index 734e6be39d..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Insert/InsertDataBuilder.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using Umbraco.Core.Migrations.Syntax.Insert.Expressions; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Migrations.Syntax.Insert -{ - public class InsertDataBuilder : IInsertDataSyntax - { - private readonly InsertDataExpression _expression; - - public InsertDataBuilder(InsertDataExpression expression) - { - _expression = expression; - } - - public IInsertDataSyntax EnableIdentityInsert() - { - _expression.EnabledIdentityInsert = true; - return this; - } - - public IInsertDataSyntax Row(object dataAsAnonymousType) - { - _expression.Rows.Add(GetData(dataAsAnonymousType)); - return this; - } - - private static InsertionDataDefinition GetData(object dataAsAnonymousType) - { - var data = new InsertionDataDefinition(); - var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); - - foreach (PropertyDescriptor property in properties) - { - data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); - } - - return data; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnTableSyntax.cs deleted file mode 100644 index 340749947b..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Rename.Column -{ - public interface IRenameColumnTableSyntax : IFluentSyntax - { - IRenameColumnToSyntax OnTable(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnToSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnToSyntax.cs deleted file mode 100644 index 166a07e05c..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/IRenameColumnToSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Rename.Column -{ - public interface IRenameColumnToSyntax : IFluentSyntax - { - void To(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/RenameColumnBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Column/RenameColumnBuilder.cs deleted file mode 100644 index e432abb9e2..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Column/RenameColumnBuilder.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Rename.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Rename.Column -{ - public class RenameColumnBuilder : ExpressionBuilderBase, IRenameColumnToSyntax, IRenameColumnTableSyntax - { - public RenameColumnBuilder(RenameColumnExpression expression) : base(expression) - { - } - - public void To(string name) - { - Expression.NewName = name; - } - - public IRenameColumnToSyntax OnTable(string tableName) - { - Expression.TableName = tableName; - return this; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs deleted file mode 100644 index c390cd4c54..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs +++ /dev/null @@ -1,54 +0,0 @@ -using NPoco; -using Umbraco.Core.Persistence; - -namespace Umbraco.Core.Migrations.Syntax.Rename.Expressions -{ - public class RenameColumnExpression : MigrationExpressionBase - { - public RenameColumnExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public virtual string SchemaName { get; set; } - public virtual string TableName { get; set; } - public virtual string OldName { get; set; } - public virtual string NewName { get; set; } - - public override string Process(IMigrationContext context) - { - if (CurrentDatabaseType.IsMySql()) - { - string columnDefinitionSql = string.Format(@" -SELECT CONCAT( - CAST(COLUMN_TYPE AS CHAR), - IF(ISNULL(CHARACTER_SET_NAME), - '', - CONCAT(' CHARACTER SET ', CHARACTER_SET_NAME)), - IF(ISNULL(COLLATION_NAME), - '', - CONCAT(' COLLATE ', COLLATION_NAME)), - ' ', - IF(IS_NULLABLE = 'NO', 'NOT NULL ', ''), - IF(IS_NULLABLE = 'NO' AND COLUMN_DEFAULT IS NULL, - '', - CONCAT('DEFAULT ', QUOTE(COLUMN_DEFAULT), ' ')), - UPPER(extra)) - FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_NAME = '{0}' AND COLUMN_NAME = '{1}'", TableName, OldName); - - var columnDefinition = context.Database.ExecuteScalar(columnDefinitionSql); - return this.ToString() + " " + columnDefinition; - } - - return this.ToString(); - } - - public override string ToString() - { - if (IsExpressionSupported() == false) - return string.Empty; - - return SqlSyntax.FormatColumnRename(TableName, OldName, NewName); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs deleted file mode 100644 index fc854a9e4d..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs +++ /dev/null @@ -1,23 +0,0 @@ -using NPoco; - -namespace Umbraco.Core.Migrations.Syntax.Rename.Expressions -{ - public class RenameTableExpression : MigrationExpressionBase - { - public RenameTableExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public virtual string SchemaName { get; set; } - public virtual string OldName { get; set; } - public virtual string NewName { get; set; } - - public override string ToString() - { - if (IsExpressionSupported() == false) - return string.Empty; - - return SqlSyntax.FormatTableRename(OldName, NewName); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/IRenameBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/IRenameBuilder.cs deleted file mode 100644 index baad503753..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/IRenameBuilder.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Rename.Column; -using Umbraco.Core.Migrations.Syntax.Rename.Table; - -namespace Umbraco.Core.Migrations.Syntax.Rename -{ - public interface IRenameBuilder : IFluentSyntax - { - IRenameTableSyntax Table(string oldName); - IRenameColumnTableSyntax Column(string oldName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Table/IRenameTableSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Table/IRenameTableSyntax.cs deleted file mode 100644 index 77962d0f78..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Table/IRenameTableSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Rename.Table -{ - public interface IRenameTableSyntax : IFluentSyntax - { - void To(string name); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Rename/Table/RenameTableBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Rename/Table/RenameTableBuilder.cs deleted file mode 100644 index c1e2700028..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Rename/Table/RenameTableBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Umbraco.Core.Migrations.Syntax.Rename.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Rename.Table -{ - public class RenameTableBuilder : ExpressionBuilderBase, IRenameTableSyntax - { - public RenameTableBuilder(RenameTableExpression expression) : base(expression) - { - } - - public void To(string name) - { - Expression.NewName = name; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs b/src/Umbraco.Core/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs deleted file mode 100644 index 0de91c5c2a..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Collections.Generic; -using NPoco; - -namespace Umbraco.Core.Migrations.Syntax.Update.Expressions -{ - public class UpdateDataExpression : MigrationExpressionBase - { - public UpdateDataExpression(IMigrationContext context, DatabaseType[] supportedDatabaseTypes) - : base(context, supportedDatabaseTypes) - { } - - public string SchemaName { get; set; } - public string TableName { get; set; } - - public List> Set { get; set; } - public List> Where { get; set; } - public bool IsAllRows { get; set; } - - public override string ToString() - { - if (IsExpressionSupported() == false) - return string.Empty; - - var updateItems = new List(); - var whereClauses = new List(); - - foreach (var item in Set) - { - updateItems.Add(string.Format("{0} = {1}", - SqlSyntax.GetQuotedColumnName(item.Key), - GetQuotedValue(item.Value))); - } - - if (IsAllRows) - { - whereClauses.Add("1 = 1"); - } - else - { - foreach (var item in Where) - { - whereClauses.Add(string.Format("{0} {1} {2}", - SqlSyntax.GetQuotedColumnName(item.Key), - item.Value == null ? "IS" : "=", - GetQuotedValue(item.Value))); - } - } - return string.Format(SqlSyntax.UpdateData, - SqlSyntax.GetQuotedTableName(TableName), - string.Join(", ", updateItems.ToArray()), - string.Join(" AND ", whereClauses.ToArray())); - } - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateBuilder.cs deleted file mode 100644 index 01e7c33961..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateBuilder.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Update -{ - public interface IUpdateBuilder : IFluentSyntax - { - IUpdateSetSyntax Table(string tableName); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateSetSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateSetSyntax.cs deleted file mode 100644 index 1d9f2f05b7..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateSetSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Update -{ - public interface IUpdateSetSyntax - { - IUpdateWhereSyntax Set(object dataAsAnonymousType); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateWhereSyntax.cs b/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateWhereSyntax.cs deleted file mode 100644 index a3ca0d814f..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Update/IUpdateWhereSyntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Core.Migrations.Syntax.Update -{ - public interface IUpdateWhereSyntax - { - void Where(object dataAsAnonymousType); - void AllRows(); - } -} diff --git a/src/Umbraco.Core/Migrations/Syntax/Update/UpdateDataBuilder.cs b/src/Umbraco.Core/Migrations/Syntax/Update/UpdateDataBuilder.cs deleted file mode 100644 index c7811acea9..0000000000 --- a/src/Umbraco.Core/Migrations/Syntax/Update/UpdateDataBuilder.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using Umbraco.Core.Migrations.Syntax.Update.Expressions; - -namespace Umbraco.Core.Migrations.Syntax.Update -{ - public class UpdateDataBuilder : IUpdateSetSyntax, IUpdateWhereSyntax - { - private readonly UpdateDataExpression _expression; - private readonly IMigrationContext _context; - - public UpdateDataBuilder(UpdateDataExpression expression, IMigrationContext context) - { - _context = context; - _expression = expression; - } - - public IUpdateWhereSyntax Set(object dataAsAnonymousType) - { - _expression.Set = GetData(dataAsAnonymousType); - return this; - } - - public void Where(object dataAsAnonymousType) - { - _expression.Where = GetData(dataAsAnonymousType); - } - - public void AllRows() - { - _expression.IsAllRows = true; - } - - private static List> GetData(object dataAsAnonymousType) - { - var data = new List>(); - var properties = TypeDescriptor.GetProperties(dataAsAnonymousType); - - foreach (PropertyDescriptor property in properties) - { - data.Add(new KeyValuePair(property.Name, property.GetValue(dataAsAnonymousType))); - } - - return data; - } - } -} diff --git a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs index 74c1c99dc6..ceb4e2d486 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/TargetVersionEight/VariantsMigration.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using Umbraco.Core.Migrations.Expressions.Execute; using Umbraco.Core.Migrations.Install; -using Umbraco.Core.Migrations.Syntax.Execute; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; @@ -24,40 +24,35 @@ namespace Umbraco.Core.Migrations.Upgrade.TargetVersionEight public override void Up() { // delete *all* keys and indexes - because of FKs - //Execute.DropKeysAndIndexes(PreTables.PropertyData); - Execute.DropKeysAndIndexes(); + Delete.KeysAndIndexes(); MigratePropertyData(); MigrateContentAndPropertyTypes(); MigrateContent(); MigrateVersions(); - Execute.Code(context => - { - if (context.Database.Fetch(@"SELECT uContentVersion.nodeId, COUNT(uContentVersion.id) + if (Database.Fetch(@"SELECT uContentVersion.nodeId, COUNT(uContentVersion.id) FROM uContentVersion JOIN uDocumentVersion ON uContentVersion.id=uDocumentVersion.id WHERE uDocumentVersion.published=1 GROUP BY uContentVersion.nodeId HAVING COUNT(uContentVersion.id) > 1").Any()) - { - Debugger.Break(); - throw new Exception("Migration failed: duplicate 'published' document versions."); - } - if (context.Database.Fetch(@"SELECT v1.nodeId, v1.id, COUNT(v2.id) + { + Debugger.Break(); + throw new Exception("Migration failed: duplicate 'published' document versions."); + } + + if (Database.Fetch(@"SELECT v1.nodeId, v1.id, COUNT(v2.id) FROM uContentVersion v1 LEFT JOIN uContentVersion v2 ON v1.nodeId=v2.nodeId AND v2.[current]=1 GROUP BY v1.nodeId, v1.id HAVING COUNT(v2.id) <> 1").Any()) - { - Debugger.Break(); - throw new Exception("Migration failed: missing or duplicate 'current' content versions."); - } - return string.Empty; - }); + { + Debugger.Break(); + throw new Exception("Migration failed: missing or duplicate 'current' content versions."); + } // re-create *all* keys and indexes - //Create.KeysAndIndexes(); foreach (var x in DatabaseSchemaCreator.OrderedTables) Create.KeysAndIndexes(x.Value); } @@ -90,14 +85,10 @@ HAVING COUNT(v2.id) <> 1").Any()) if (ColumnType(PreTables.PropertyData, "versionId") == "uniqueidentifier") { Execute.Sql($"ALTER TABLE {PreTables.PropertyData} ADD COLUMN versionId2 INT NULL;"); - Execute.Code(context => - { - // SQLCE does not support UPDATE...FROM - var temp = context.Database.Fetch($"SELECT id, versionId FROM {PreTables.ContentVersion}"); - foreach (var t in temp) - context.Database.Execute($"UPDATE {PreTables.PropertyData} SET versionId2=@v2 WHERE versionId=@v1", new { v1 = t.versionId, v2 = t.id }); - return string.Empty; - }); + // 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); ReplaceColumn(PreTables.PropertyData, "versionId2", "versionId"); } @@ -173,30 +164,22 @@ HAVING COUNT(v2.id) <> 1").Any()) ReplaceColumn(PreTables.ContentVersion, "ContentId", "nodeId"); // populate contentVersion text, current and userId columns for documents - Execute.Code(context => - { - // SQLCE does not support UPDATE...FROM - var temp = context.Database.Fetch($"SELECT versionId, text, newest, documentUser FROM {PreTables.Document}"); - foreach (var t in temp) - context.Database.Execute($@"UPDATE {PreTables.ContentVersion} SET text=@text, {SqlSyntax.GetQuotedColumnName("current")}=@current, userId=@userId WHERE versionId=@versionId", - new { text = t.text, current = t.newest, userId=t.documentUser, versionId=t.versionId }); - return string.Empty; - }); + // SQLCE does not support UPDATE...FROM + var temp1 = Database.Fetch($"SELECT versionId, text, newest, documentUser FROM {PreTables.Document}"); + foreach (var t in temp1) + Database.Execute($@"UPDATE {PreTables.ContentVersion} SET text=@text, {SqlSyntax.GetQuotedColumnName("current")}=@current, userId=@userId WHERE versionId=@versionId", + new { text = t.text, current = t.newest, userId=t.documentUser, versionId=t.versionId }); // populate contentVersion text and current columns for non-documents, userId is default - Execute.Code(context => - { - // SQLCE does not support UPDATE...FROM - var temp = context.Database.Fetch($@"SELECT cver.versionId, n.text + // SQLCE does not support UPDATE...FROM + var temp2 = Database.Fetch($@"SELECT cver.versionId, n.text FROM {PreTables.ContentVersion} cver JOIN {SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.Node)} n ON cver.nodeId=n.id WHERE cver.versionId NOT IN (SELECT versionId FROM {SqlSyntax.GetQuotedTableName(PreTables.Document)})"); - foreach (var t in temp) - context.Database.Execute($@"UPDATE {PreTables.ContentVersion} SET text=@text, {SqlSyntax.GetQuotedColumnName("current")}=1, userId=0 WHERE versionId=@versionId", - new { text = t.text, versionId=t.versionId }); - return string.Empty; - }); + foreach (var t in temp2) + Database.Execute($@"UPDATE {PreTables.ContentVersion} SET text=@text, {SqlSyntax.GetQuotedColumnName("current")}=1, userId=0 WHERE versionId=@versionId", + new { text = t.text, versionId=t.versionId }); // create table Create.Table(withoutKeysAndIndexes: true); @@ -210,34 +193,30 @@ JOIN {SqlSyntax.GetQuotedTableName(PreTables.Document)} doc ON doc.nodeId=cver.n // need to add extra rows for where published=newest // 'cos INSERT above has inserted the 'published' document version // and v8 always has a 'edited' document version too - Execute.Code(context => - { - var temp = context.Database.Fetch($@"SELECT doc.nodeId, doc.updateDate, doc.documentUser, doc.text, doc.templateId, cver.id versionId + var temp3 = Database.Fetch($@"SELECT doc.nodeId, doc.updateDate, doc.documentUser, doc.text, doc.templateId, cver.id versionId FROM {SqlSyntax.GetQuotedTableName(PreTables.Document)} doc JOIN {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} cver ON doc.nodeId=cver.nodeId AND doc.versionId=cver.versionId WHERE doc.newest=1 AND doc.published=1"); - var getIdentity = context.SqlContext.DatabaseType.IsMySql() - ? "LAST_INSERT_ID()" - : "@@@@IDENTITY"; - foreach (var t in temp) - { - context.Database.Execute($@"INSERT INTO {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} (nodeId, versionId, versionDate, userId, {SqlSyntax.GetQuotedColumnName("current")}, text) + var getIdentity = Database.SqlContext.DatabaseType.IsMySql() + ? "LAST_INSERT_ID()" + : "@@@@IDENTITY"; + foreach (var t in temp3) + { + Database.Execute($@"INSERT INTO {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} (nodeId, versionId, versionDate, userId, {SqlSyntax.GetQuotedColumnName("current")}, text) VALUES (@nodeId, @versionId, @versionDate, @userId, 1, @text)", new { nodeId=t.nodeId, versionId=Guid.NewGuid(), versionDate=t.updateDate, userId=t.documentUser, text=t.text }); - var id = context.Database.ExecuteScalar("SELECT " + getIdentity); - context.Database.Execute($"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET {SqlSyntax.GetQuotedColumnName("current")}=0 WHERE nodeId=@0 AND id<>@1", (int) t.nodeId, id); - context.Database.Execute($@"INSERT INTO {SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DocumentVersion)} (id, templateId, published) + var id = Database.ExecuteScalar("SELECT " + getIdentity); + Database.Execute($"UPDATE {SqlSyntax.GetQuotedTableName(PreTables.ContentVersion)} SET {SqlSyntax.GetQuotedColumnName("current")}=0 WHERE nodeId=@0 AND id<>@1", (int) t.nodeId, id); + Database.Execute($@"INSERT INTO {SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DocumentVersion)} (id, templateId, published) VALUES (@id, @templateId, 0)", new { id=id, templateId=t.templateId }); - var versionId = (int) t.versionId; - var pdatas = context.Database.Fetch(Sql().Select().From().Where(x => x.VersionId == versionId)); - foreach (var pdata in pdatas) - { - pdata.VersionId = id; - context.Database.Insert(pdata); - } + var versionId = (int) t.versionId; + var pdatas = Database.Fetch(Sql().Select().From().Where(x => x.VersionId == versionId)); + foreach (var pdata in pdatas) + { + pdata.VersionId = id; + Database.Insert(pdata); } - return string.Empty; - }); + } // reduce document to 1 row per content Execute.Sql($@"DELETE FROM {PreTables.Document} @@ -260,12 +239,10 @@ WHERE versionId NOT IN (SELECT (versionId) FROM {PreTables.ContentVersion} WHERE } // set 'edited' to true whenever a 'non-published' property data is != a published one - Execute.Code(context => - { - // cannot compare NTEXT values in TSQL - // cannot cast NTEXT to NVARCHAR(MAX) in SQLCE - // ... bah ... - var temp = context.Database.Fetch($@"SELECT n.id, + // cannot compare NTEXT values in TSQL + // cannot cast NTEXT to NVARCHAR(MAX) in SQLCE + // ... bah ... + var temp = Database.Fetch($@"SELECT n.id, v1.intValue intValue1, v1.decimalValue decimalValue1, v1.dateValue dateValue1, v1.varcharValue varcharValue1, v1.textValue textValue1, v2.intValue intValue2, v2.decimalValue decimalValue2, v2.dateValue dateValue2, v2.varcharValue varcharValue2, v2.textValue textValue2 FROM {Constants.DatabaseSchema.Tables.Node} n @@ -276,12 +253,9 @@ JOIN {Constants.DatabaseSchema.Tables.DocumentVersion} dv ON cv2.id=dv.id AND dv JOIN {Constants.DatabaseSchema.Tables.PropertyData} v2 ON cv2.id=v2.versionId WHERE v1.propertyTypeId=v2.propertyTypeId AND v1.languageId=v2.languageId AND v1.segment=v2.segment"); - foreach (var t in temp) - if (t.intValue1 != t.intValue2 || t.decimalValue1 != t.decimalValue2 || t.dateValue1 != t.dateValue2 || t.varcharValue1 != t.varcharValue2 || t.textValue1 != t.textValue2) - context.Database.Execute("UPDATE {SqlSyntax.GetQuotedTableName(PreTables.Document)} SET edited=1 WHERE nodeId=@nodeIdd", new { t.id }); - - return string.Empty; - }); + foreach (var t in temp) + if (t.intValue1 != t.intValue2 || t.decimalValue1 != t.decimalValue2 || t.dateValue1 != t.dateValue2 || t.varcharValue1 != t.varcharValue2 || t.textValue1 != t.textValue2) + 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); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1a89bffa0a..853e91c8f4 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -898,113 +898,105 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs index 7b71201a66..92ec8c6cf9 100644 --- a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs @@ -4,8 +4,8 @@ using NUnit.Framework; using Semver; using Umbraco.Core.Logging; using Umbraco.Core.Migrations; +using Umbraco.Core.Migrations.Expressions.Execute; using Umbraco.Core.Migrations.Install; -using Umbraco.Core.Migrations.Syntax.Execute; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; @@ -208,7 +208,7 @@ namespace Umbraco.Tests.Migrations //Execute.DropKeysAndIndexes("umbracoNode"); // drops *all* tables keys and indexes - Execute.DropKeysAndIndexes(); + Delete.KeysAndIndexes(); } } @@ -256,7 +256,7 @@ namespace Umbraco.Tests.Migrations public override void Up() { // cannot delete the column without this, of course - Execute.DropKeysAndIndexes(); + Delete.KeysAndIndexes(); Delete.Column("id").FromTable("umbracoNode"); diff --git a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs index fb73ea6270..9799553ed2 100644 --- a/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationRunnerTests.cs @@ -8,7 +8,7 @@ using Semver; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Migrations; -using Umbraco.Core.Migrations.Syntax.Alter.Expressions; +using Umbraco.Core.Migrations.Expressions.Alter.Expressions; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Services; diff --git a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs index cf9f8d791b..dec861dc37 100644 --- a/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs +++ b/src/Umbraco.Tests/Persistence/SyntaxProvider/SqlCeSyntaxProviderTests.cs @@ -6,8 +6,8 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Migrations; -using Umbraco.Core.Migrations.Syntax.Create.Index; -using Umbraco.Core.Migrations.Syntax.Expressions; +using Umbraco.Core.Migrations.Expressions.Common.Expressions; +using Umbraco.Core.Migrations.Expressions.Create.Index; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseAnnotations;