Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 4f769ed

Browse files
committed
Refactor any Parameterized SqlExpression features into ParameterizedSqlExpression class
1 parent 7cce217 commit 4f769ed

File tree

7 files changed

+95
-58
lines changed

7 files changed

+95
-58
lines changed

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ public override string GetQuotedValue(object value, Type fieldType)
301301
return base.GetQuotedValue(value, fieldType);
302302
}
303303

304-
public override object GetValue(object value, Type fieldType)
304+
public override object GetParamValue(object value, Type fieldType)
305305
{
306306
if (!ParameterizeStatement)
307307
return GetQuotedValue(value, fieldType);

src/ServiceStack.OrmLite.Oracle/OracleSqlExpression.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace ServiceStack.OrmLite.Oracle
66
{
7-
public class OracleSqlExpression<T> : SqlExpression<T>
7+
public class OracleSqlExpression<T> : ParameterizedSqlExpression<T>
88
{
99
public OracleSqlExpression(IOrmLiteDialectProvider dialectProvider)
1010
: base(dialectProvider) {}
@@ -19,15 +19,12 @@ protected override object VisitColumnAccessMethod(MethodCallExpression m)
1919
if (args.Count == 2)
2020
{
2121
var length = Int32.Parse(args[1].ToString());
22-
return new PartialSqlString(string.Format("subStr({0},{1},{2})",
23-
quotedColName,
24-
startIndex,
25-
length));
22+
return new PartialSqlString(string.Format(
23+
"subStr({0},{1},{2})", quotedColName, startIndex, length));
2624
}
2725

28-
return new PartialSqlString(string.Format("subStr({0},{1})",
29-
quotedColName,
30-
startIndex));
26+
return new PartialSqlString(string.Format(
27+
"subStr({0},{1})", quotedColName, startIndex));
3128
}
3229
return base.VisitColumnAccessMethod(m);
3330
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Linq.Expressions;
3+
4+
namespace ServiceStack.OrmLite
5+
{
6+
public abstract partial class ParameterizedSqlExpression<T> : SqlExpression<T>
7+
{
8+
protected bool visitedExpressionIsTableColumn = false;
9+
protected bool SkipParameterizationForThisExpression { get; set; }
10+
11+
protected ParameterizedSqlExpression(IOrmLiteDialectProvider dialectProvider)
12+
: base(dialectProvider)
13+
{
14+
SkipParameterizationForThisExpression = false;
15+
}
16+
17+
protected internal override object Visit(Expression exp)
18+
{
19+
visitedExpressionIsTableColumn = false;
20+
return base.Visit(exp);
21+
}
22+
23+
protected internal override object VisitJoin(Expression exp)
24+
{
25+
SkipParameterizationForThisExpression = true;
26+
var visitedExpression = Visit(exp);
27+
SkipParameterizationForThisExpression = false;
28+
return visitedExpression;
29+
}
30+
31+
protected virtual void ConvertToPlaceholderAndParameter(ref object right)
32+
{
33+
}
34+
35+
public override object GetValue(object value, Type type)
36+
{
37+
return SkipParameterizationForThisExpression
38+
? DialectProvider.GetQuotedValue(value, type)
39+
: DialectProvider.GetParamValue(value, type);
40+
}
41+
42+
protected override void VisitFilter(string operand, object originalLeft, object originalRight, ref object left, ref object right)
43+
{
44+
if (SkipParameterizationForThisExpression)
45+
return;
46+
47+
if (visitedExpressionIsTableColumn || (originalRight is DateTimeOffset))
48+
return;
49+
50+
var leftEnum = originalLeft as EnumMemberAccess;
51+
var rightEnum = originalRight as EnumMemberAccess;
52+
53+
if (leftEnum != null && rightEnum != null)
54+
return;
55+
56+
if (operand == "AND" || operand == "OR" || operand == "is" || operand == "is not")
57+
return;
58+
59+
ConvertToPlaceholderAndParameter(ref right);
60+
}
61+
62+
protected virtual void OnVisitMemberType(Type modelType)
63+
{
64+
var tableDef = modelType.GetModelDefinition();
65+
if (tableDef != null)
66+
visitedExpressionIsTableColumn = true;
67+
}
68+
}
69+
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 17 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ public abstract partial class SqlExpression<T> : ISqlExpression, IHasUntypedSqlE
2828
protected bool useFieldName = false;
2929
protected bool selectDistinct = false;
3030
protected bool CustomSelect { get; set; }
31-
protected bool SkipParameterizationForThisExpression { get; set; }
32-
private bool visitedExpressionIsTableColumn = false;
3331
private ModelDefinition modelDef;
3432
public bool PrefixFieldWithTableName { get; set; }
3533
public bool WhereStatementWithoutWhereString { get; set; }
@@ -46,7 +44,6 @@ public SqlExpression(IOrmLiteDialectProvider dialectProvider)
4644
modelDef = typeof(T).GetModelDefinition();
4745
PrefixFieldWithTableName = false;
4846
WhereStatementWithoutWhereString = false;
49-
SkipParameterizationForThisExpression = false;
5047
DialectProvider = dialectProvider;
5148
Params = new List<IDbDataParameter>();
5249
tableDefs.Add(modelDef);
@@ -930,8 +927,6 @@ protected internal bool UseFieldName
930927

931928
protected internal virtual object Visit(Expression exp)
932929
{
933-
visitedExpressionIsTableColumn = false;
934-
935930
if (exp == null) return string.Empty;
936931
switch (exp.NodeType)
937932
{
@@ -993,10 +988,7 @@ protected internal virtual object Visit(Expression exp)
993988

994989
protected internal virtual object VisitJoin(Expression exp)
995990
{
996-
SkipParameterizationForThisExpression = true;
997-
var visitedExpression = Visit(exp);
998-
SkipParameterizationForThisExpression = false;
999-
return visitedExpression;
991+
return Visit(exp);
1000992
}
1001993

1002994
protected virtual object VisitLambda(LambdaExpression lambda)
@@ -1015,11 +1007,14 @@ protected virtual object VisitLambda(LambdaExpression lambda)
10151007
return Visit(lambda.Body);
10161008
}
10171009

1018-
protected virtual object VisitBinary(BinaryExpression b)
1010+
public virtual object GetValue(object value, Type type)
10191011
{
1020-
var skipParameterizationForThisVisit = false;
1012+
return DialectProvider.GetQuotedValue(value, type);
1013+
}
10211014

1022-
object left, right;
1015+
protected virtual object VisitBinary(BinaryExpression b)
1016+
{
1017+
object originalLeft = null, originalRight = null, left, right;
10231018
var operand = BindOperant(b.NodeType); //sep= " " ??
10241019
if (operand == "AND" || operand == "OR")
10251020
{
@@ -1050,18 +1045,12 @@ protected virtual object VisitBinary(BinaryExpression b)
10501045
}
10511046
else
10521047
{
1053-
left = Visit(b.Left);
1054-
right = Visit(b.Right);
1055-
1056-
if (visitedExpressionIsTableColumn || (right is DateTimeOffset))
1057-
skipParameterizationForThisVisit = true;
1048+
originalLeft = left = Visit(b.Left);
1049+
originalRight = right = Visit(b.Right);
10581050

10591051
var leftEnum = left as EnumMemberAccess;
10601052
var rightEnum = right as EnumMemberAccess;
10611053

1062-
if (leftEnum != null && rightEnum != null)
1063-
skipParameterizationForThisVisit = true;
1064-
10651054
var rightNeedsCoercing = leftEnum != null && rightEnum == null;
10661055
var leftNeedsCoercing = rightEnum != null && leftEnum == null;
10671056

@@ -1070,9 +1059,7 @@ protected virtual object VisitBinary(BinaryExpression b)
10701059
var rightPartialSql = right as PartialSqlString;
10711060
if (rightPartialSql == null)
10721061
{
1073-
right = SkipParameterizationForThisExpression
1074-
? DialectProvider.GetQuotedValue(right, leftEnum.EnumType)
1075-
: DialectProvider.GetValue(right, leftEnum.EnumType);
1062+
right = GetValue(right, leftEnum.EnumType);
10761063
}
10771064
}
10781065
else if (leftNeedsCoercing)
@@ -1092,19 +1079,14 @@ protected virtual object VisitBinary(BinaryExpression b)
10921079
left = DialectProvider.GetQuotedValue(left, left != null ? left.GetType() : null);
10931080
else if (right as PartialSqlString == null)
10941081
{
1095-
right = SkipParameterizationForThisExpression
1096-
? DialectProvider.GetQuotedValue(right, right != null ? right.GetType() : null)
1097-
: DialectProvider.GetValue(right, right != null ? right.GetType() : null);
1082+
right = GetValue(right, right != null ? right.GetType() : null);
10981083
}
10991084
}
11001085

11011086
if (operand == "=" && right.ToString().Equals("null", StringComparison.OrdinalIgnoreCase)) operand = "is";
11021087
else if (operand == "<>" && right.ToString().Equals("null", StringComparison.OrdinalIgnoreCase)) operand = "is not";
11031088

1104-
if (operand == "AND" || operand == "OR" || operand == "is" || operand == "is not")
1105-
skipParameterizationForThisVisit = true;
1106-
1107-
DoParameterization(skipParameterizationForThisVisit, ref right);
1089+
VisitFilter(operand, originalLeft, originalRight, ref left, ref right);
11081090

11091091
switch (operand)
11101092
{
@@ -1116,16 +1098,7 @@ protected virtual object VisitBinary(BinaryExpression b)
11161098
}
11171099
}
11181100

1119-
private void DoParameterization(bool skipParameterizationForThisVisit, ref object right)
1120-
{
1121-
if (skipParameterizationForThisVisit)
1122-
return;
1123-
1124-
if (SkipParameterizationForThisExpression)
1125-
return;
1126-
1127-
ConvertToPlaceholderAndParameter(ref right);
1128-
}
1101+
protected virtual void VisitFilter(string operand, object originalLeft, object originalRight, ref object left, ref object right) {}
11291102

11301103
protected virtual object VisitMemberAccess(MemberExpression m)
11311104
{
@@ -1144,9 +1117,9 @@ protected virtual object VisitMemberAccess(MemberExpression m)
11441117
}
11451118
}
11461119

1120+
OnVisitMemberType(modelType);
1121+
11471122
var tableDef = modelType.GetModelDefinition();
1148-
if (tableDef != null)
1149-
visitedExpressionIsTableColumn = true;
11501123

11511124
if (propertyInfo.PropertyType.IsEnum)
11521125
return new EnumMemberAccess(
@@ -1161,6 +1134,8 @@ protected virtual object VisitMemberAccess(MemberExpression m)
11611134
return getter();
11621135
}
11631136

1137+
protected virtual void OnVisitMemberType(Type modelType) {}
1138+
11641139
protected virtual object VisitMemberInit(MemberInitExpression exp)
11651140
{
11661141
return Expression.Lambda(exp).Compile().DynamicInvoke();
@@ -1189,7 +1164,6 @@ protected virtual object VisitNew(NewExpression nex)
11891164
}
11901165
return r.ToString();
11911166
}
1192-
11931167
}
11941168

11951169
protected virtual object VisitParameter(ParameterExpression p)
@@ -1654,10 +1628,6 @@ protected virtual object VisitColumnAccessMethod(MethodCallExpression m)
16541628
return new PartialSqlString(statement);
16551629
}
16561630

1657-
protected virtual void ConvertToPlaceholderAndParameter(ref object right)
1658-
{
1659-
}
1660-
16611631
public IDbDataParameter CreateParam(string name,
16621632
object value = null,
16631633
ParameterDirection direction = ParameterDirection.Input,

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public interface IOrmLiteDialectProvider
4343
/// <returns></returns>
4444
string GetQuotedValue(string paramValue);
4545

46-
object GetValue(object value, Type fieldType);
46+
object GetParamValue(object value, Type fieldType);
4747

4848
void SetDbValue(FieldDefinition fieldDef, IDataReader reader, int colIndex, object instance);
4949

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1429,7 +1429,7 @@ public virtual string GetQuotedValue(object value, Type fieldType)
14291429
: value.ToString();
14301430
}
14311431

1432-
public virtual object GetValue(object value, Type fieldType)
1432+
public virtual object GetParamValue(object value, Type fieldType)
14331433
{
14341434
return GetQuotedValue(value, fieldType);
14351435
}

src/ServiceStack.OrmLite/ServiceStack.OrmLite.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
</ItemGroup>
106106
<ItemGroup>
107107
<Compile Include="Expressions\IUntypedSqlExpression.cs" />
108+
<Compile Include="Expressions\ParameterizedSqlExpression.cs" />
108109
<Compile Include="NamingStrategy.cs" />
109110
<Compile Include="OrmLiteCommand.cs" />
110111
<Compile Include="OrmLiteContext.cs" />

0 commit comments

Comments
 (0)