Execute true Sql<ISqlContext> in Migrations
This commit is contained in:
@@ -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
|
||||
{ }
|
||||
|
||||
/// <inheritdoc />
|
||||
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();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IExecutableBuilder Sql(string sqlStatement)
|
||||
@@ -20,5 +30,12 @@ namespace Umbraco.Core.Migrations.Expressions.Execute
|
||||
Expression.SqlStatement = sqlStatement;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IExecutableBuilder Sql(Sql<ISqlContext> sql)
|
||||
{
|
||||
Expression.SqlObject = sql;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ISqlContext> SqlObject { get; set; }
|
||||
|
||||
public void ExecuteSqlObject()
|
||||
{
|
||||
Execute(SqlObject);
|
||||
}
|
||||
|
||||
protected override string GetSql()
|
||||
{
|
||||
return SqlStatement;
|
||||
|
||||
@@ -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.
|
||||
/// </summary>
|
||||
IExecutableBuilder Sql(string sqlStatement);
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the Sql statement to execute.
|
||||
/// </summary>
|
||||
IExecutableBuilder Sql(Sql<ISqlContext> sql);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ISqlContext> sql)
|
||||
{
|
||||
if (_executed)
|
||||
throw new InvalidOperationException("This expression has already been executed.");
|
||||
_executed = true;
|
||||
|
||||
if (sql == null)
|
||||
{
|
||||
Logger.Info(GetType(), $"SQL [{Context.Index}]: <empty>");
|
||||
}
|
||||
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();
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence
|
||||
var (s, a) = sql.SqlContext.VisitDto(predicate, alias);
|
||||
return sql.Where(s, a);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Appends a WHERE clause to the Sql statement.
|
||||
/// </summary>
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user