From c1695c2f7f29886caa8d965b0bb4165814196e4e Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 20 Dec 2012 11:36:20 -0100 Subject: [PATCH] Updating expressions to output sql for use with the fluent migrations, so it can be used for db upgrades. --- .../ForeignKeyDefinition.cs | 3 + .../Expressions/AlterColumnExpression.cs | 6 +- .../AlterDefaultConstraintExpression.cs | 14 +-- .../Alter/Expressions/AlterTableExpression.cs | 2 +- .../Expressions/CreateConstraintExpression.cs | 20 +++- .../Expressions/CreateTableExpression.cs | 6 +- .../Expressions/DeleteColumnExpression.cs | 14 ++- .../Expressions/DeleteConstraintExpression.cs | 6 +- .../Expressions/DeleteDataExpression.cs | 34 ++++++- .../DeleteDefaultConstraintExpression.cs | 13 ++- .../Expressions/DeleteForeignKeyExpression.cs | 13 ++- .../Expressions/DeleteIndexExpression.cs | 9 +- .../Expressions/DeleteTableExpression.cs | 9 +- .../Expressions/CreateColumnExpression.cs | 10 +- .../Expressions/CreateForeignKeyExpression.cs | 12 +-- .../Expressions/CreateIndexExpression.cs | 6 +- .../Expressions/RenameColumnExpression.cs | 7 +- .../Expressions/RenameTableExpression.cs | 7 +- .../Expressions/UpdateDataExpression.cs | 33 +++++++ .../SqlSyntax/ISqlSyntaxProvider.cs | 5 + .../SqlSyntax/MySqlSyntaxProvider.cs | 13 ++- .../SqlSyntax/SqlCeSyntaxProvider.cs | 2 + .../SqlSyntax/SqlServerSyntaxProvider.cs | 38 ++++++++ .../SqlSyntax/SqlSyntaxProviderBase.cs | 95 ++++++++++++++----- 24 files changed, 287 insertions(+), 90 deletions(-) diff --git a/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/ForeignKeyDefinition.cs b/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/ForeignKeyDefinition.cs index 4d6f1989f3..3012c57b0e 100644 --- a/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/ForeignKeyDefinition.cs +++ b/src/Umbraco.Core/Persistence/DatabaseModelDefinitions/ForeignKeyDefinition.cs @@ -9,6 +9,9 @@ namespace Umbraco.Core.Persistence.DatabaseModelDefinitions { ForeignColumns = new List(); PrimaryColumns = new List(); + //Set to None by Default + OnDelete = Rule.None; + OnUpdate = Rule.None; } public virtual string Name { get; set; } diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs index 7df3463dea..ba13bbcbfe 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterColumnExpression.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Alter.Expressions { @@ -15,8 +16,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Alter.Expressions public override string ToString() { - //TODO Implement usage of the SqlSyntax provider here to generate the sql statement for this expression. - return TableName + " " + Column.Name + " " + Column.Type ?? Column.CustomType; + return string.Format(SyntaxConfig.SqlSyntaxProvider.AlterColumn, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(Column.Name)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs index a310f850b8..c4c28119ea 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterDefaultConstraintExpression.cs @@ -1,3 +1,5 @@ +using Umbraco.Core.Persistence.SqlSyntax; + namespace Umbraco.Core.Persistence.Migrations.Syntax.Alter.Expressions { public class AlterDefaultConstraintExpression : IMigrationExpression @@ -5,16 +7,16 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Alter.Expressions public virtual string SchemaName { get; set; } public virtual string TableName { get; set; } public virtual string ColumnName { get; set; } + public virtual string ConstraintName { get; set; } public virtual object DefaultValue { get; set; } public override string ToString() { - return base.ToString() + - string.Format("{0}.{1} {2} {3}", - SchemaName, - TableName, - ColumnName, - DefaultValue); + //NOTE Should probably investigate if Deleting a Default Constraint is different from deleting a 'regular' constraint + + return string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteConstraint, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedName(ConstraintName)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs index bcff2fbc25..b9482e07e9 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Alter/Expressions/AlterTableExpression.cs @@ -11,7 +11,7 @@ public override string ToString() { - return base.ToString() + TableName; + return string.Format("ALTER TABLE {0}", TableName); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs index 32a69e7591..e2d1b0c6e6 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateConstraintExpression.cs @@ -1,4 +1,6 @@ -using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using System.Linq; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Create.Expressions { @@ -13,8 +15,20 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Create.Expressions public override string ToString() { - //TODO replace with sql syntax provider - return base.ToString() + Constraint.ConstraintName; + var constraintType = (Constraint.IsPrimaryKeyConstraint) ? "PRIMARY KEY" : "UNIQUE"; + + string[] columns = new string[Constraint.Columns.Count]; + + for (int i = 0; i < Constraint.Columns.Count; i++) + { + columns[i] = SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(Constraint.Columns.ElementAt(i)); + } + + return string.Format(SyntaxConfig.SqlSyntaxProvider.CreateConstraint, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(Constraint.TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedName(Constraint.ConstraintName), + constraintType, + string.Join(", ", columns)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs index 69c057fd74..8400eeca42 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Create/Expressions/CreateTableExpression.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Create.Expressions { @@ -16,8 +17,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Create.Expressions public override string ToString() { - //TODO replace with sql syntax provider - return base.ToString() + TableName; + return string.Format(SyntaxConfig.SqlSyntaxProvider.CreateTable, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.Format(Columns)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs index cf11fc7119..a8ec8f3edc 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteColumnExpression.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; using System.Linq; +using System.Text; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { @@ -16,8 +18,16 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions public override string ToString() { - //TODO Change to use sql syntax provider - return base.ToString() + TableName + " " + ColumnNames.Aggregate((a, b) => a + ", " + b); + var sb = new StringBuilder(); + foreach (string columnName in ColumnNames) + { + if (ColumnNames.First() != columnName) sb.AppendLine(";"); + sb.AppendFormat(SyntaxConfig.SqlSyntaxProvider.DropColumn, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(columnName)); + } + + return sb.ToString(); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs index ff449d306c..7833f92ac4 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteConstraintExpression.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { @@ -13,8 +14,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions public override string ToString() { - //TODO change to use sql syntax provider - return base.ToString() + Constraint.ConstraintName; + return string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteConstraint, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(Constraint.TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedName(Constraint.ConstraintName)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs index aa61e8cd6e..a37abf0650 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDataExpression.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { @@ -14,5 +16,35 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { get { return _rows; } } + + public override string ToString() + { + var deleteItems = new List(); + + if (IsAllRows) + { + deleteItems.Add(string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteData, SyntaxConfig.SqlSyntaxProvider.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}", + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(item.Key), + item.Value == null ? "IS" : "=", + SyntaxConfig.SqlSyntaxProvider.GetQuotedValue(item.Value.ToString()))); + } + + deleteItems.Add(string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteData, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + String.Join(" AND ", whereClauses.ToArray()))); + } + } + + return String.Join("; ", deleteItems.ToArray()); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs index 55ee11ca3c..c84d5922da 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteDefaultConstraintExpression.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { public class DeleteDefaultConstraintExpression : IMigrationExpression { @@ -8,12 +10,9 @@ public override string ToString() { - //TODO Change to use sql syntax provider - return base.ToString() + - string.Format("{0}.{1} {2}", - SchemaName, - TableName, - ColumnName); + return string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteDefaultConstraint, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(ColumnName)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs index 3136beefab..8fb4f9e0f7 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteForeignKeyExpression.cs @@ -1,5 +1,6 @@ -using System.Linq; +using System; using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { @@ -14,10 +15,12 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions public override string ToString() { - //TODO Change to use sql syntax provider - return base.ToString() + ForeignKey.Name + " " - + ForeignKey.ForeignTable + " (" + string.Join(", ", ForeignKey.ForeignColumns.ToArray()) + ") " - + ForeignKey.PrimaryTable + " (" + string.Join(", ", ForeignKey.PrimaryColumns.ToArray()) + ")"; + 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)"); + + return string.Format(SyntaxConfig.SqlSyntaxProvider.DeleteConstraint, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(ForeignKey.ForeignTable), + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(ForeignKey.Name)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs index ee9cff2807..38fe9c3563 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteIndexExpression.cs @@ -1,5 +1,5 @@ -using System.Linq; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { @@ -14,8 +14,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions public override string ToString() { - //TODO Change to use sql syntax provider - return base.ToString() + Index.TableName + " (" + string.Join(", ", Index.Columns.Select(x => x.Name).ToArray()) + ")"; + return string.Format(SyntaxConfig.SqlSyntaxProvider.DropIndex, + SyntaxConfig.SqlSyntaxProvider.GetQuotedName(Index.Name), + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(Index.TableName)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs index 67f2418ec5..017244060f 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Delete/Expressions/DeleteTableExpression.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Syntax.Delete.Expressions { public class DeleteTableExpression : IMigrationExpression { @@ -7,9 +9,8 @@ public override string ToString() { - //TODO implement the use of sql syntax provider - - return base.ToString() + TableName; + return string.Format(SyntaxConfig.SqlSyntaxProvider.DropTable, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateColumnExpression.cs index 5980bbe75d..31fa681340 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateColumnExpression.cs @@ -1,5 +1,4 @@ -using System; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions @@ -18,10 +17,9 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions public override string ToString() { - var output = String.Format(SyntaxConfig.SqlSyntaxProvider.AddColumn, - SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), - SyntaxConfig.SqlSyntaxProvider.Format(Column)); - return output; + return string.Format(SyntaxConfig.SqlSyntaxProvider.AddColumn, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + SyntaxConfig.SqlSyntaxProvider.Format(Column)); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs index 7dafffcfbd..c9666654b0 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateForeignKeyExpression.cs @@ -1,5 +1,5 @@ -using System.Linq; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions { @@ -14,13 +14,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions public override string ToString() { - return base.ToString() + - string.Format("{0} {1}({2}) {3}({4})", - ForeignKey.Name, - ForeignKey.ForeignTable, - string.Join(", ", ForeignKey.ForeignColumns.ToArray()), - ForeignKey.PrimaryTable, - string.Join(", ", ForeignKey.PrimaryColumns.ToArray())); + return SyntaxConfig.SqlSyntaxProvider.Format(ForeignKey); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateIndexExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateIndexExpression.cs index 3b55c655c4..d15d1a0d97 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateIndexExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Expressions/CreateIndexExpression.cs @@ -1,5 +1,5 @@ -using System.Linq; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions { @@ -14,7 +14,7 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Expressions public override string ToString() { - return base.ToString() + Index.TableName + " (" + string.Join(", ", Index.Columns.Select(x => x.Name).ToArray()) + ")"; + return SyntaxConfig.SqlSyntaxProvider.Format(Index); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs index 62edf37851..795b65c0ef 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameColumnExpression.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions { public class RenameColumnExpression : IMigrationExpression { @@ -9,8 +11,7 @@ public override string ToString() { - //TODO Implement usage of sql syntax provider - return base.ToString() + TableName + " " + OldName + " to " + NewName; + return SyntaxConfig.SqlSyntaxProvider.FormatColumnRename(TableName, OldName, NewName); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs index 28e733f949..3e3c5d8aee 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Rename/Expressions/RenameTableExpression.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Core.Persistence.Migrations.Syntax.Rename.Expressions { public class RenameTableExpression : IMigrationExpression { @@ -8,8 +10,7 @@ public override string ToString() { - //TODO Implement usage of sql syntax provider - return base.ToString() + OldName + " " + NewName; + return SyntaxConfig.SqlSyntaxProvider.FormatTableRename(OldName, NewName); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs b/src/Umbraco.Core/Persistence/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs index 06e78f7106..cac88440e8 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Syntax/Update/Expressions/UpdateDataExpression.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Syntax.Update.Expressions { @@ -10,5 +11,37 @@ namespace Umbraco.Core.Persistence.Migrations.Syntax.Update.Expressions public List> Set { get; set; } public List> Where { get; set; } public bool IsAllRows { get; set; } + + public override string ToString() + { + var updateItems = new List(); + var whereClauses = new List(); + + foreach (var item in Set) + { + updateItems.Add(string.Format("{0} = {1}", + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(item.Key), + SyntaxConfig.SqlSyntaxProvider.GetQuotedValue(item.Value.ToString()))); + } + + if (IsAllRows) + { + whereClauses.Add("1 = 1"); + } + else + { + foreach (var item in Where) + { + whereClauses.Add(string.Format("{0} {1} {2}", + SyntaxConfig.SqlSyntaxProvider.GetQuotedColumnName(item.Key), + item.Value == null ? "IS" : "=", + SyntaxConfig.SqlSyntaxProvider.GetQuotedValue(item.Value.ToString()))); + } + } + return string.Format(SyntaxConfig.SqlSyntaxProvider.UpdateData, + SyntaxConfig.SqlSyntaxProvider.GetQuotedTableName(TableName), + string.Join(", ", updateItems.ToArray()), + string.Join(" AND ", whereClauses.ToArray())); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 9eef406cb1..b59bcf3ec8 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -33,6 +33,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax string CreateConstraint { get; } string DeleteConstraint { get; } string CreateForeignKeyConstraint { get; } + string DeleteDefaultConstraint { get; } string Format(TableDefinition table); string Format(IEnumerable columns); List Format(IEnumerable indexes); @@ -40,5 +41,9 @@ namespace Umbraco.Core.Persistence.SqlSyntax string FormatPrimaryKey(TableDefinition table); string GetQuotedValue(string value); string Format(ColumnDefinition column); + string Format(IndexDefinition index); + string Format(ForeignKeyDefinition foreignKey); + string FormatColumnRename(string tableName, string oldName, string newName); + string FormatTableRename(string oldName, string newName); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs index edb9f7b9b2..a17b2339e3 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using Umbraco.Core.Persistence.DatabaseAnnotations; using Umbraco.Core.Persistence.DatabaseModelDefinitions; @@ -142,10 +143,20 @@ namespace Umbraco.Core.Persistence.SqlSyntax return null; } + public override string DeleteDefaultConstraint + { + get + { + throw new NotSupportedException("Default constraints are not supported in MySql"); + } + } + public override string AlterColumn { get { return "ALTER TABLE {0} MODIFY COLUMN {1}"; } } public override string DeleteConstraint { get { return "ALTER TABLE {0} DROP {1}{2}"; } } + public override string DropIndex { get { return "DROP INDEX {0} ON {1}"; } } + public override string CreateTable { get { return "CREATE TABLE {0} ({1}) ENGINE = INNODB"; } } public override string CreateIndex { get { return "CREATE INDEX {0} ON {1} ({2})"; } } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs index 2bcc82b330..6fb5a123c5 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs @@ -129,5 +129,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax } public override string AddColumn { get { return "ALTER TABLE {0} ADD {1}"; } } + + public override string DropIndex { get { return "DROP INDEX {1}.{0}"; } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs index f0f353840a..995320a037 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs @@ -58,6 +58,16 @@ namespace Umbraco.Core.Persistence.SqlSyntax return result > 0; } + public override string FormatColumnRename(string tableName, string oldName, string newName) + { + return string.Format(RenameColumn, tableName, oldName, newName); + } + + public override string FormatTableRename(string oldName, string newName) + { + return string.Format(RenameTable, oldName, newName); + } + protected override string FormatIdentity(ColumnDefinition column) { return column.IsIdentity ? GetIdentityString(column) : string.Empty; @@ -85,6 +95,34 @@ namespace Umbraco.Core.Persistence.SqlSyntax return null; } + public override string DeleteDefaultConstraint + { + get + { + return "DECLARE @default sysname, @sql nvarchar(max);\r\n\r\n" + + "-- get name of default constraint\r\n" + + "SELECT @default = name\r\n" + + "FROM sys.default_constraints\r\n" + + "WHERE parent_object_id = object_id('{0}')\r\n" + "" + + "AND type = 'D'\r\n" + "" + + "AND parent_column_id = (\r\n" + "" + + "SELECT column_id\r\n" + + "FROM sys.columns\r\n" + + "WHERE object_id = object_id('{0}')\r\n" + + "AND name = '{1}'\r\n" + + ");\r\n\r\n" + + "-- create alter table command to drop contraint as string and run it\r\n" + + "SET @sql = N'ALTER TABLE {0} DROP CONSTRAINT ' + @default;\r\n" + + "EXEC sp_executesql @sql;"; + } + } + public override string AddColumn { get { return "ALTER TABLE {0} ADD {1}"; } } + + public override string DropIndex { get { return "DROP INDEX {0} ON {1}"; } } + + public override string RenameColumn { get { return "sp_rename '{0}.{1}', '{2}', 'COLUMN'"; } } + + public override string RenameTable { get { return "sp_rename '{0}', '{1}'"; } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index ca1a899e3e..15b84189a0 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -158,34 +158,11 @@ namespace Umbraco.Core.Persistence.SqlSyntax public virtual string Format(TableDefinition table) { - var statement = string.Format(CreateTable, table.Name, Format(table.Columns)); + var statement = string.Format(CreateTable, GetQuotedTableName(table.Name), Format(table.Columns)); return statement; } - public virtual string FormatPrimaryKey(TableDefinition table) - { - var columnDefinition = table.Columns.FirstOrDefault(x => x.IsPrimaryKey); - if (columnDefinition == null) - return string.Empty; - - string constraintName = string.IsNullOrEmpty(columnDefinition.PrimaryKeyName) - ? string.Format("PK_{0}", table.Name) - : columnDefinition.PrimaryKeyName; - - string columns = string.IsNullOrEmpty(columnDefinition.PrimaryKeyColumns) - ? GetQuotedColumnName(columnDefinition.Name) - : columnDefinition.PrimaryKeyColumns; - - string primaryKeyPart = string.Concat("PRIMARY KEY", columnDefinition.IsIndexed ? " CLUSTERED" : " NONCLUSTERED"); - - return string.Format(CreateConstraint, - GetQuotedTableName(table.Name), - GetQuotedName(constraintName), - primaryKeyPart, - columns); - } - public virtual List Format(IEnumerable indexes) { return indexes.Select(Format).ToList(); @@ -222,7 +199,8 @@ namespace Umbraco.Core.Persistence.SqlSyntax GetQuotedColumnName(foreignKey.ForeignColumns.First()), GetQuotedTableName(foreignKey.PrimaryTable), GetQuotedColumnName(foreignKey.PrimaryColumns.First()), - "", ""); + FormatCascade("DELETE", foreignKey.OnDelete), + FormatCascade("UPDATE", foreignKey.OnUpdate)); } public virtual string Format(IEnumerable columns) @@ -249,7 +227,64 @@ namespace Umbraco.Core.Persistence.SqlSyntax return string.Join(" ", clauses.ToArray()); } - public virtual string FormatString(ColumnDefinition column) + public virtual string FormatPrimaryKey(TableDefinition table) + { + var columnDefinition = table.Columns.FirstOrDefault(x => x.IsPrimaryKey); + if (columnDefinition == null) + return string.Empty; + + string constraintName = string.IsNullOrEmpty(columnDefinition.PrimaryKeyName) + ? string.Format("PK_{0}", table.Name) + : columnDefinition.PrimaryKeyName; + + string columns = string.IsNullOrEmpty(columnDefinition.PrimaryKeyColumns) + ? GetQuotedColumnName(columnDefinition.Name) + : columnDefinition.PrimaryKeyColumns; + + string primaryKeyPart = string.Concat("PRIMARY KEY", columnDefinition.IsIndexed ? " CLUSTERED" : " NONCLUSTERED"); + + return string.Format(CreateConstraint, + GetQuotedTableName(table.Name), + GetQuotedName(constraintName), + primaryKeyPart, + columns); + } + + public virtual string FormatColumnRename(string tableName, string oldName, string newName) + { + return string.Format(RenameColumn, + GetQuotedTableName(tableName), + GetQuotedColumnName(oldName), + GetQuotedColumnName(newName)); + } + + public virtual string FormatTableRename(string oldName, string newName) + { + return string.Format(RenameTable, GetQuotedTableName(oldName), GetQuotedTableName(newName)); + } + + protected virtual string FormatCascade(string onWhat, Rule rule) + { + string action = "NO ACTION"; + switch (rule) + { + case Rule.None: + return ""; + case Rule.Cascade: + action = "CASCADE"; + break; + case Rule.SetNull: + action = "SET NULL"; + break; + case Rule.SetDefault: + action = "SET DEFAULT"; + break; + } + + return string.Format(" ON {0} {1}", onWhat, action); + } + + protected virtual string FormatString(ColumnDefinition column) { return GetQuotedColumnName(column.Name); } @@ -332,6 +367,14 @@ namespace Umbraco.Core.Persistence.SqlSyntax protected abstract string FormatIdentity(ColumnDefinition column); + public virtual string DeleteDefaultConstraint + { + get + { + throw new NotSupportedException("Default constraints are not supported"); + } + } + public virtual string CreateTable { get { return "CREATE TABLE {0} ({1})"; } } public virtual string DropTable { get { return "DROP TABLE {0}"; } }