annotate Source/Data/Sql/SqlProvider/DB2SqlProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 namespace BLToolkit.Data.Sql.SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class DB2SqlProvider : BasicSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public override bool TakeAcceptsParameter { get { return SqlQuery.Select.SkipValue != null; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 SqlField _identityField;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public override int CommandCount(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 if (sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 _identityField = sqlQuery.Insert.Into.GetIdentityField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 if (_identityField == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 return 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 return 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public override int BuildSql(int commandNumber, SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 if (_identityField != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 indent += 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 AppendIndent(sb).AppendLine("SELECT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 AppendIndent(sb).Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 BuildExpression(sb, _identityField, false, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 AppendIndent(sb).AppendLine("FROM");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 AppendIndent(sb).AppendLine("\tNEW TABLE");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 AppendIndent(sb).AppendLine("\t(");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 var ret = base.BuildSql(commandNumber, sqlQuery, sb, indent, nesting, skipAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 if (_identityField != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 sb.AppendLine("\t)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 return ret;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 protected override void BuildCommand(int commandNumber, StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 sb.AppendLine("SELECT identity_val_local() FROM SYSIBM.SYSDUMMY1");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 return new DB2SqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 protected override void BuildSql(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 AlternativeBuildSql(sb, false, base.BuildSql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 protected override void BuildSelectClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 if (SqlQuery.From.Tables.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 AppendIndent(sb).AppendLine("SELECT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 BuildColumns(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 AppendIndent(sb).AppendLine("FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 base.BuildSelectClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 protected override string LimitFormat
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 get { return SqlQuery.Select.SkipValue == null ? "FETCH FIRST {0} ROWS ONLY" : null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 public override ISqlExpression ConvertExpression(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 expr = base.ConvertExpression(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 var be = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 switch (be.Operation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 case "%":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 var expr1 = !TypeHelper.IsIntegerType(be.Expr1.SystemType) ? new SqlFunction(typeof(int), "Int", be.Expr1) : be.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 return new SqlFunction(be.SystemType, "Mod", expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 case "&": return new SqlFunction(be.SystemType, "BitAnd", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 case "|": return new SqlFunction(be.SystemType, "BitOr", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 case "^": return new SqlFunction(be.SystemType, "BitXor", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 var func = (SqlFunction) expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 var ex = AlternativeConvertToBoolean(func, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 if (ex != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 return ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 if (func.Parameters[0] is SqlDataType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 var type = (SqlDataType)func.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (type.Type == typeof(string) && func.Parameters[1].SystemType != typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 return new SqlFunction(func.SystemType, "RTrim", new SqlFunction(typeof(string), "Char", func.Parameters[1]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 if (type.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1], new SqlValue(type.Length));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 if (type.Precision > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1], new SqlValue(type.Precision), new SqlValue(type.Scale));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 if (func.Parameters[0] is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 var f = (SqlFunction)func.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 f.Name == "Char" ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 new SqlFunction(func.SystemType, f.Name, func.Parameters[1]) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 f.Parameters.Length == 1 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 new SqlFunction(func.SystemType, f.Name, func.Parameters[1], f.Parameters[0]) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 new SqlFunction(func.SystemType, f.Name, func.Parameters[1], f.Parameters[0], f.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 var e = (SqlExpression)func.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 return new SqlFunction(func.SystemType, e.Expr, func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 case "Millisecond" : return Div(new SqlFunction(func.SystemType, "Microsecond", func.Parameters), 1000);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 case "SmallDateTime" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 case "DateTime" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 case "DateTime2" : return new SqlFunction(func.SystemType, "TimeStamp", func.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 case "TinyInt" : return new SqlFunction(func.SystemType, "SmallInt", func.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 case "Money" : return new SqlFunction(func.SystemType, "Decimal", func.Parameters[0], new SqlValue(19), new SqlValue(4));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 case "SmallMoney" : return new SqlFunction(func.SystemType, "Decimal", func.Parameters[0], new SqlValue(10), new SqlValue(4));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 case "VarChar" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (TypeHelper.GetUnderlyingType(func.Parameters[0].SystemType) == typeof(decimal))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 return new SqlFunction(func.SystemType, "Char", func.Parameters[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 case "NChar" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 case "NVarChar" : return new SqlFunction(func.SystemType, "Char", func.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 case "DateDiff" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 switch ((Linq.Sql.DateParts)((SqlValue)func.Parameters[0]).Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 case Linq.Sql.DateParts.Day : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 86400", Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 case Linq.Sql.DateParts.Hour : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 3600", Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 case Linq.Sql.DateParts.Minute : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 60", Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 case Linq.Sql.DateParts.Second : return new SqlExpression(typeof(int), "(Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))", Precedence.Additive, func.Parameters[2], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 case Linq.Sql.DateParts.Millisecond : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) * 1000 + (MICROSECOND({0}) - MICROSECOND({1})) / 1000", Precedence.Additive, func.Parameters[2], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 protected override void BuildFunction(StringBuilder sb, SqlFunction func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 func = ConvertFunctionParameters(func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 base.BuildFunction(sb, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 static void SetQueryParameter(IQueryElement element)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 if (element.ElementType == QueryElementType.SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 ((SqlParameter)element).IsQueryParameter = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 public override SqlQuery Finalize(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 new QueryVisitor().Visit(sqlQuery.Select, SetQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 //if (sqlQuery.QueryType == QueryType.InsertOrUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 // foreach (var key in sqlQuery.Insert.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 // if (((SqlField)key.Column).IsPrimaryKey)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 // new QueryVisitor().Visit(key.Expression, SetQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 sqlQuery = base.Finalize(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 switch (sqlQuery.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 default : return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 public override void BuildValue(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 if (value is Guid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 var s = ((Guid)value).ToString("N");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 .Append("Cast(x'")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 .Append(s.Substring( 6, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 .Append(s.Substring( 4, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 .Append(s.Substring( 2, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 .Append(s.Substring( 0, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 .Append(s.Substring(10, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 .Append(s.Substring( 8, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 .Append(s.Substring(14, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 .Append(s.Substring(12, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 .Append(s.Substring(16, 16))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 .Append("' as char(16) for bit data)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 base.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 var wrap = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 if (expr.SystemType == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 if (expr is SqlQuery.SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 wrap = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 var ex = expr as SqlExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 if (wrap) sb.Append("CASE WHEN ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 base.BuildColumnExpression(sb, expr, alias, ref addAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 if (wrap) sb.Append(" THEN 1 ELSE 0 END");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 public static bool QuoteIdentifiers = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 return "@" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 case ConvertType.NameToCommandParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 case ConvertType.NameToSprocParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 return ":" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 case ConvertType.SprocParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 var str = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 return str.Length > 0 && str[0] == ':'? str.Substring(1): str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 case ConvertType.NameToQueryFieldAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 case ConvertType.NameToQueryTableAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 if (QuoteIdentifiers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 if (name.Length > 0 && name[0] == '"')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 return '"' + name + '"';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 BuildInsertOrUpdateQueryAsMerge(sb, "FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 protected override void BuildEmptyInsert(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 sb.Append("VALUES ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 foreach (var col in SqlQuery.Insert.Into.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 sb.Append("(DEFAULT)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 }