annotate Source/Data/Sql/SqlProvider/FirebirdSqlProvider.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.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 #region ReSharper disable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 // ReSharper disable SuggestUseVarKeywordEverywhere
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 // ReSharper disable SuggestUseVarKeywordEvident
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace BLToolkit.Data.Sql.SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public class FirebirdSqlProvider : BasicSqlProvider, IMappingSchemaProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 public FirebirdSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 // public override int CommandCount(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 // {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 // return sqlQuery.IsInsert && sqlQuery.Set.WithIdentity ? 2 : 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 // }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 // protected override void BuildCommand(int commandNumber, StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 // {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 // SequenceNameAttribute attr = GetSequenceNameAttribute(true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 // AppendIndent(sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 // .Append("SELECT gen_id(")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 // .Append(attr.SequenceName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 // .AppendLine(", 0) FROM rdb$database");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 // }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 return new FirebirdSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 protected override void BuildSelectClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 if (SqlQuery.From.Tables.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 AppendIndent(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 sb.Append("SELECT").AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 BuildColumns(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 AppendIndent(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 sb.Append("FROM rdb$database").AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 base.BuildSelectClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 protected override bool SkipFirst { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 protected override string SkipFormat { get { return "SKIP {0}"; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 protected override string FirstFormat { get { return "FIRST {0}"; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 public override bool IsIdentityParameterRequired { get { return true; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 protected override void BuildGetIdentity(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 var identityField = SqlQuery.Insert.Into.GetIdentityField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 if (identityField == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 throw new SqlException("Identity field must be defined for '{0}'.", SqlQuery.Insert.Into.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 AppendIndent(sb).AppendLine("RETURNING");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 AppendIndent(sb).Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 BuildExpression(sb, identityField, false, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 if (table.SequenceAttributes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 return new SqlExpression("GEN_ID(" + table.SequenceAttributes[0].SequenceName + ", 1)", Precedence.Primary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 return base.GetIdentityExpression(table, identityField, forReturning);
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 SqlBinaryExpression 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 "%": return new SqlFunction(be.SystemType, "Mod", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 case "&": return new SqlFunction(be.SystemType, "Bin_And", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 case "|": return new SqlFunction(be.SystemType, "Bin_Or", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 case "^": return new SqlFunction(be.SystemType, "Bin_Xor", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 SqlFunction func = (SqlFunction)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 ISqlExpression ex = AlternativeConvertToBoolean(func, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 if (ex != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 return ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 case "DateAdd" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 switch ((Sql.DateParts)((SqlValue)func.Parameters[0]).Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 case Sql.DateParts.Quarter :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Month), Mul(func.Parameters[1], 3), func.Parameters[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 case Sql.DateParts.DayOfYear:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 case Sql.DateParts.WeekDay:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Day), func.Parameters[1], func.Parameters[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 case Sql.DateParts.Week :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Day), Mul(func.Parameters[1], 7), func.Parameters[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 else if (expr is SqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 SqlExpression e = (SqlExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 if (e.Expr.StartsWith("Extract(Quarter"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 return Inc(Div(Dec(new SqlExpression(e.SystemType, "Extract(Month from {0})", e.Parameters)), 3));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 if (e.Expr.StartsWith("Extract(YearDay"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 return Inc(new SqlExpression(e.SystemType, e.Expr.Replace("Extract(YearDay", "Extract(yearDay"), e.Parameters));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 if (e.Expr.StartsWith("Extract(WeekDay"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 return Inc(new SqlExpression(e.SystemType, e.Expr.Replace("Extract(WeekDay", "Extract(weekDay"), e.Parameters));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 protected override void BuildFunction(StringBuilder sb, SqlFunction func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 func = ConvertFunctionParameters(func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 base.BuildFunction(sb, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 protected override void BuildDataType(StringBuilder sb, SqlDataType type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 switch (type.SqlDbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 case SqlDbType.Decimal :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 base.BuildDataType(sb, type.Precision > 18 ? new SqlDataType(type.SqlDbType, type.Type, 18, type.Scale) : type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 case SqlDbType.TinyInt : sb.Append("SmallInt"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 case SqlDbType.Money : sb.Append("Decimal(18,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 case SqlDbType.SmallMoney : sb.Append("Decimal(10,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 case SqlDbType.DateTime2 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 case SqlDbType.SmallDateTime :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 case SqlDbType.DateTime : sb.Append("TimeStamp"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 case SqlDbType.NVarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 sb.Append("VarChar");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 if (type.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 sb.Append('(').Append(type.Length).Append(')');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 default : base.BuildDataType(sb, type); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 static void SetNonQueryParameter(IQueryElement element)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 if (element.ElementType == QueryElementType.SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 ((SqlParameter)element).IsQueryParameter = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 public override SqlQuery Finalize(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 CheckAliases(sqlQuery, int.MaxValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 new QueryVisitor().Visit(sqlQuery.Select, SetNonQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 if (sqlQuery.QueryType == QueryType.InsertOrUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 foreach (var key in sqlQuery.Insert.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 foreach (var key in sqlQuery.Update.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 foreach (var key in sqlQuery.Update.Keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 new QueryVisitor().Visit(sqlQuery, element =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 if (element.ElementType == QueryElementType.InSubQueryPredicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 new QueryVisitor().Visit(((SqlQuery.Predicate.InSubQuery)element).Expr1, SetNonQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 sqlQuery = base.Finalize(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 switch (sqlQuery.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 default : return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 var wrap = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 if (expr.SystemType == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 if (expr is SqlQuery.SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 wrap = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 var ex = expr as SqlExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 if (wrap) sb.Append("CASE WHEN ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 base.BuildColumnExpression(sb, expr, alias, ref addAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 if (wrap) sb.Append(" THEN 1 ELSE 0 END");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 public static bool QuoteIdentifiers = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (QuoteIdentifiers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 string name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 if (name.Length > 0 && name[0] == '"')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 return '"' + name + '"';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 case ConvertType.NameToCommandParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 case ConvertType.NameToSprocParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 return "@" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 case ConvertType.SprocParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 string str = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 return str.Length > 0 && str[0] == '@' ? str.Substring(1) : str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 BuildInsertOrUpdateQueryAsMerge(sb, "FROM rdb$database");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 #region IMappingSchemaProvider Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 readonly FirebirdMappingSchema _mappingSchema = new FirebirdMappingSchema();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 MappingSchema IMappingSchemaProvider.MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 get { return _mappingSchema; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }