diff --git a/src/Umbraco.Core/Persistence/Querying/QueryHelper.cs b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs similarity index 63% rename from src/Umbraco.Core/Persistence/Querying/QueryHelper.cs rename to src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs index f69e106f57..70d89d7940 100644 --- a/src/Umbraco.Core/Persistence/Querying/QueryHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs @@ -6,9 +6,9 @@ namespace Umbraco.Core.Persistence.Querying /// /// Logic that is shared with the expression helpers /// - internal class QueryHelper + internal class BaseExpressionHelper { - public static string GetQuotedValue(object value, Type fieldType, Func escapeCallback = null, Func shouldQuoteCallback = null) + public virtual string GetQuotedValue(object value, Type fieldType, Func escapeCallback = null, Func shouldQuoteCallback = null) { if (value == null) return "NULL"; @@ -57,14 +57,45 @@ namespace Umbraco.Core.Persistence.Querying : value.ToString(); } - public static string EscapeParam(object paramValue) + public virtual string EscapeParam(object paramValue) { return paramValue.ToString().Replace("'", "''"); } - public static bool ShouldQuoteValue(Type fieldType) + public virtual string EscapeAtArgument(string exp) + { + if (exp.StartsWith("@")) + return string.Concat("@", exp); + + return exp; + } + + public virtual bool ShouldQuoteValue(Type fieldType) { return true; } + + protected virtual string RemoveQuote(string exp) + { + if (exp.StartsWith("'") && exp.EndsWith("'")) + { + exp = exp.Remove(0, 1); + exp = exp.Remove(exp.Length - 1, 1); + } + return exp; + } + + protected virtual string RemoveQuoteFromAlias(string exp) + { + + if ((exp.StartsWith("\"") || exp.StartsWith("`") || exp.StartsWith("'")) + && + (exp.EndsWith("\"") || exp.EndsWith("`") || exp.EndsWith("'"))) + { + exp = exp.Remove(0, 1); + exp = exp.Remove(exp.Length - 1, 1); + } + return exp; + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index 559b978721..3042510b05 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Persistence.Querying { - internal class ModelToSqlExpressionHelper + internal class ModelToSqlExpressionHelper : BaseExpressionHelper { private string sep = " "; private BaseMapper _mapper; @@ -246,7 +246,7 @@ namespace Umbraco.Core.Persistence.Querying case "ToLower": return string.Format("lower({0})", r); case "StartsWith": - return string.Format("upper({0}) like '{1}%'", r, RemoveQuote(args[0].ToString().ToUpper())); + return string.Format("upper({0}) like '{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString().ToUpper()))); case "EndsWith": return string.Format("upper({0}) like '%{1}'", r, RemoveQuote(args[0].ToString()).ToUpper()); case "Contains": @@ -435,41 +435,7 @@ namespace Umbraco.Core.Persistence.Querying public virtual string GetQuotedValue(object value, Type fieldType) { - return QueryHelper.GetQuotedValue(value, fieldType, EscapeParam, ShouldQuoteValue); - } - - public virtual string EscapeParam(object paramValue) - { - return paramValue.ToString().Replace("'", "''"); - } - - public virtual bool ShouldQuoteValue(Type fieldType) - { - return true; - } - - protected string RemoveQuote(string exp) - { - - if (exp.StartsWith("'") && exp.EndsWith("'")) - { - exp = exp.Remove(0, 1); - exp = exp.Remove(exp.Length - 1, 1); - } - return exp; - } - - protected string RemoveQuoteFromAlias(string exp) - { - - if ((exp.StartsWith("\"") || exp.StartsWith("`") || exp.StartsWith("'")) - && - (exp.EndsWith("\"") || exp.EndsWith("`") || exp.EndsWith("'"))) - { - exp = exp.Remove(0, 1); - exp = exp.Remove(exp.Length - 1, 1); - } - return exp; + return GetQuotedValue(value, fieldType, EscapeParam, ShouldQuoteValue); } private string GetTrueExpression() diff --git a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs index f84933b3e7..41057ed6c5 100644 --- a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Querying { - internal class PocoToSqlExpressionHelper + internal class PocoToSqlExpressionHelper : BaseExpressionHelper { private string sep = " "; private Database.PocoData pd; @@ -250,7 +250,7 @@ namespace Umbraco.Core.Persistence.Querying case "ToLower": return string.Format("lower({0})", r); case "StartsWith": - return string.Format("upper({0}) like '{1}%'", r, RemoveQuote(args[0].ToString().ToUpper())); + return string.Format("upper({0}) like '{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString().ToUpper()))); case "EndsWith": return string.Format("upper({0}) like '%{1}'", r, RemoveQuote(args[0].ToString()).ToUpper()); case "Contains": @@ -439,17 +439,7 @@ namespace Umbraco.Core.Persistence.Querying public virtual string GetQuotedValue(object value, Type fieldType) { - return QueryHelper.GetQuotedValue(value, fieldType, EscapeParam, ShouldQuoteValue); - } - - public virtual string EscapeParam(object paramValue) - { - return paramValue.ToString().Replace("'", "''"); - } - - public virtual bool ShouldQuoteValue(Type fieldType) - { - return true; + return GetQuotedValue(value, fieldType, EscapeParam, ShouldQuoteValue); } protected virtual string GetFieldName(Database.PocoData pocoData, string name) @@ -460,30 +450,6 @@ namespace Umbraco.Core.Persistence.Querying SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumnName(column.Value.ColumnName)); } - protected string RemoveQuote(string exp) - { - - if (exp.StartsWith("'") && exp.EndsWith("'")) - { - exp = exp.Remove(0, 1); - exp = exp.Remove(exp.Length - 1, 1); - } - return exp; - } - - protected string RemoveQuoteFromAlias(string exp) - { - - if ((exp.StartsWith("\"") || exp.StartsWith("`") || exp.StartsWith("'")) - && - (exp.EndsWith("\"") || exp.EndsWith("`") || exp.EndsWith("'"))) - { - exp = exp.Remove(0, 1); - exp = exp.Remove(exp.Length - 1, 1); - } - return exp; - } - private string GetTrueExpression() { object o = GetQuotedTrueValue(); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9c37a3dd48..405cf23025 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -459,11 +459,11 @@ + -