Execute true Sql<ISqlContext> in Migrations

This commit is contained in:
Stephan
2018-07-04 14:48:44 +02:00
parent 7b3cded115
commit 68ee1181cb
6 changed files with 98 additions and 23 deletions

View File

@@ -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;
}
}
}

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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)