diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs
index 0637d2e597..0ba2499c44 100644
--- a/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs
+++ b/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs
@@ -1,6 +1,7 @@
using NPoco;
using Umbraco.Core.Migrations.Expressions.Common;
using Umbraco.Core.Migrations.Expressions.Execute.Expressions;
+using Umbraco.Core.Persistence;
namespace Umbraco.Core.Migrations.Expressions.Execute
{
@@ -12,7 +13,16 @@ namespace Umbraco.Core.Migrations.Expressions.Execute
{ }
///
- public void Do() => Expression.Execute();
+ public void Do()
+ {
+ // slightly awkward, but doing it right would mean a *lot*
+ // of changes for MigrationExpressionBase
+
+ if (Expression.SqlObject == null)
+ Expression.Execute();
+ else
+ Expression.ExecuteSqlObject();
+ }
///
public IExecutableBuilder Sql(string sqlStatement)
@@ -20,5 +30,12 @@ namespace Umbraco.Core.Migrations.Expressions.Execute
Expression.SqlStatement = sqlStatement;
return this;
}
+
+ ///
+ public IExecutableBuilder Sql(Sql sql)
+ {
+ Expression.SqlObject = sql;
+ return this;
+ }
}
}
diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs
index b5c1fbdf6b..8b5da4f270 100644
--- a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs
+++ b/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs
@@ -1,4 +1,5 @@
using NPoco;
+using Umbraco.Core.Persistence;
namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions
{
@@ -10,6 +11,13 @@ namespace Umbraco.Core.Migrations.Expressions.Execute.Expressions
public virtual string SqlStatement { get; set; }
+ public virtual Sql SqlObject { get; set; }
+
+ public void ExecuteSqlObject()
+ {
+ Execute(SqlObject);
+ }
+
protected override string GetSql()
{
return SqlStatement;
diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs
index 5747eb2c1a..7f575fd3f8 100644
--- a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs
+++ b/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs
@@ -1,4 +1,6 @@
-using Umbraco.Core.Migrations.Expressions.Common;
+using NPoco;
+using Umbraco.Core.Migrations.Expressions.Common;
+using Umbraco.Core.Persistence;
namespace Umbraco.Core.Migrations.Expressions.Execute
{
@@ -12,5 +14,10 @@ namespace Umbraco.Core.Migrations.Expressions.Execute
/// Specifies the Sql statement to execute.
///
IExecutableBuilder Sql(string sqlStatement);
+
+ ///
+ /// Specifies the Sql statement to execute.
+ ///
+ IExecutableBuilder Sql(Sql sql);
}
}
diff --git a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs
index 6ac92a07aa..8b5d9cc78c 100644
--- a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs
+++ b/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Text;
using NPoco;
using Umbraco.Core.Logging;
@@ -88,6 +87,31 @@ namespace Umbraco.Core.Migrations
expression.Execute();
}
+ protected void Execute(Sql sql)
+ {
+ if (_executed)
+ throw new InvalidOperationException("This expression has already been executed.");
+ _executed = true;
+
+ if (sql == null)
+ {
+ Logger.Info(GetType(), $"SQL [{Context.Index}]: ");
+ }
+ else
+ {
+ Logger.Info(GetType(), $"SQL [{Context.Index}]: {sql.ToText()}");
+ Database.Execute(sql);
+ }
+
+ Context.Index++;
+
+ if (_expressions == null)
+ return;
+
+ foreach (var expression in _expressions)
+ expression.Execute();
+ }
+
private void ExecuteStatement(StringBuilder stmtBuilder)
{
var stmt = stmtBuilder.ToString();
diff --git a/src/Umbraco.Core/Persistence/NPocoSqlExtensions.cs b/src/Umbraco.Core/Persistence/NPocoSqlExtensions.cs
index a5ab62d25f..6f814a7174 100644
--- a/src/Umbraco.Core/Persistence/NPocoSqlExtensions.cs
+++ b/src/Umbraco.Core/Persistence/NPocoSqlExtensions.cs
@@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence
var (s, a) = sql.SqlContext.VisitDto(predicate, alias);
return sql.Where(s, a);
}
-
+
///
/// Appends a WHERE clause to the Sql statement.
///
@@ -1117,10 +1117,40 @@ namespace Umbraco.Core.Persistence
internal static void WriteToConsole(this Sql sql)
{
- Console.WriteLine(sql.SQL);
+ Console.Write(sql.ToText());
+ }
+
+ internal static string ToText(this Sql sql)
+ {
+ var text = new StringBuilder();
+ sql.ToText(text);
+ return text.ToString();
+ }
+
+ internal static void ToText(this Sql sql, StringBuilder text)
+ {
+ ToText(sql.SQL, sql.Arguments, text);
+ }
+
+ internal static void ToText(string sql, object[] arguments, StringBuilder text)
+ {
+ text.AppendLine(sql);
+
+ if (arguments.Length == 0)
+ return;
+
+ text.Append(" --");
+
var i = 0;
- foreach (var arg in sql.Arguments)
- Console.WriteLine($" @{i++}: {arg}");
+ foreach (var arg in arguments)
+ {
+ text.Append(" @");
+ text.Append(i++);
+ text.Append(":");
+ text.Append(arg);
+ }
+
+ text.AppendLine();
}
#endregion
diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs
index 64e4c0adca..9ec043d684 100644
--- a/src/Umbraco.Core/Persistence/UmbracoDatabase.cs
+++ b/src/Umbraco.Core/Persistence/UmbracoDatabase.cs
@@ -228,24 +228,13 @@ namespace Umbraco.Core.Persistence
private string CommandToString(string sql, object[] args)
{
- var sb = new StringBuilder();
+ var text = new StringBuilder();
#if DEBUG_DATABASES
- sb.Append(InstanceId);
- sb.Append(": ");
+ text.Append(InstanceId);
+ text.Append(": ");
#endif
- sb.Append(sql);
- if (args.Length > 0)
- sb.Append(" --");
- var i = 0;
- foreach (var arg in args)
- {
- sb.Append(" @");
- sb.Append(i++);
- sb.Append(":");
- sb.Append(arg);
- }
-
- return sb.ToString();
+ NPocoSqlExtensions.ToText(sql, args, text);
+ return text.ToString();
}
protected override void OnExecutedCommand(DbCommand cmd)