annotate Source/Data/Sql/SqlProvider/MySqlSqlProvider.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.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Text;
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 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public class MySqlSqlProvider : BasicSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public override int CommandCount(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 protected override void BuildCommand(int commandNumber, StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 sb.AppendLine("SELECT LAST_INSERT_ID()");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 return new MySqlSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 protected override string LimitFormat { get { return "LIMIT {0}"; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public override bool IsNestedJoinParenthesisRequired { get { return true; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 protected override void BuildOffsetLimit(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 if (SqlQuery.Select.SkipValue == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 base.BuildOffsetLimit(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 AppendIndent(sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 .AppendFormat(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 "LIMIT {0},{1}",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 SqlQuery.Select.TakeValue == null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 long.MaxValue.ToString() :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 BuildExpression(new StringBuilder(), SqlQuery.Select.TakeValue).ToString())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 .AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 public override ISqlExpression ConvertExpression(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 expr = base.ConvertExpression(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 var be = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 switch (be.Operation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 case "+":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (be.SystemType == typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 if (be.Expr1 is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 var func = (SqlFunction)be.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 if (func.Name == "Concat")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 var list = new List<ISqlExpression>(func.Parameters) { be.Expr2 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 return new SqlFunction(be.SystemType, "Concat", list.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 return new SqlFunction(be.SystemType, "Concat", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 var func = (SqlFunction) expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 var ftype = TypeHelper.GetUnderlyingType(func.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 if (ftype == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 var ex = AlternativeConvertToBoolean(func, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 if (ex != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 return ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 if ((ftype == typeof(double) || ftype == typeof(float)) && TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType) == typeof(decimal))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 return func.Parameters[1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
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 SqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 var e = (SqlExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 if (e.Expr.StartsWith("Extract(DayOfYear"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 return new SqlFunction(e.SystemType, "DayOfYear", e.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (e.Expr.StartsWith("Extract(WeekDay"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 return Inc(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 new SqlFunction(e.SystemType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 "WeekDay",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 new SqlFunction(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 "Date_Add",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 e.Parameters[0],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 new SqlExpression(null, "interval 1 day"))));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 protected override void BuildDataType(StringBuilder sb, SqlDataType type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 switch (type.SqlDbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 case SqlDbType.Int :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 case SqlDbType.SmallInt : sb.Append("Signed"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 case SqlDbType.TinyInt : sb.Append("Unsigned"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 case SqlDbType.Money : sb.Append("Decimal(19,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 case SqlDbType.SmallMoney : sb.Append("Decimal(10,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 case SqlDbType.DateTime2 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 case SqlDbType.SmallDateTime : sb.Append("DateTime"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 case SqlDbType.Bit : sb.Append("Boolean"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 case SqlDbType.Float :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 case SqlDbType.Real : base.BuildDataType(sb, SqlDataType.Decimal); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 case SqlDbType.VarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 case SqlDbType.NVarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 sb.Append("Char");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 if (type.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 sb.Append('(').Append(type.Length).Append(')');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 default: base.BuildDataType(sb, type); break;
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 protected override void BuildDeleteClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 var table = SqlQuery.Delete.Table != null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 (SqlQuery.From.FindTableSource(SqlQuery.Delete.Table) ?? SqlQuery.Delete.Table) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 SqlQuery.From.Tables[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 AppendIndent(sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 .Append("DELETE ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 .Append(Convert(GetTableAlias(table), ConvertType.NameToQueryTableAlias))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 .AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 protected override void BuildUpdateClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 sb.Remove(0, 4).Insert(0, "UPDATE");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 base.BuildUpdateSet(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 public static char ParameterSymbol { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 public static bool TryConvertParameterSymbol { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 private static string _commandParameterPrefix = "";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 public static string CommandParameterPrefix
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 get { return _commandParameterPrefix; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 set { _commandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 private static string _sprocParameterPrefix = "";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 public static string SprocParameterPrefix
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 get { return _sprocParameterPrefix; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 set { _sprocParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 private static List<char> _convertParameterSymbols;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 public static List<char> ConvertParameterSymbols
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 get { return _convertParameterSymbols; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 set { _convertParameterSymbols = value ?? new List<char>(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 throw new ArgumentNullException("value");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 return ParameterSymbol + value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 case ConvertType.NameToCommandParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 return ParameterSymbol + CommandParameterPrefix + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 case ConvertType.NameToSprocParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 var valueStr = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 if(string.IsNullOrEmpty(valueStr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 throw new ArgumentException("Argument 'value' must represent parameter name.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 if (valueStr[0] == ParameterSymbol)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 valueStr = valueStr.Substring(1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 if (valueStr.StartsWith(SprocParameterPrefix, StringComparison.Ordinal))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 valueStr = valueStr.Substring(SprocParameterPrefix.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 return ParameterSymbol + SprocParameterPrefix + valueStr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 case ConvertType.SprocParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 var str = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 str = (str.Length > 0 && (str[0] == ParameterSymbol || (TryConvertParameterSymbol && ConvertParameterSymbols.Contains(str[0])))) ? str.Substring(1) : str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 if (!string.IsNullOrEmpty(SprocParameterPrefix) && str.StartsWith(SprocParameterPrefix))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 str = str.Substring(SprocParameterPrefix.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 case ConvertType.NameToQueryFieldAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 case ConvertType.NameToQueryTableAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 if (name.Length > 0 && name[0] == '`')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 return "`" + value + "`";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 case ConvertType.NameToDatabase:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 case ConvertType.NameToOwner:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 if (name.Length > 0 && name[0] == '`')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (name.IndexOf('.') > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 value = string.Join("`.`", name.Split('.'));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 return "`" + value + "`";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 protected override StringBuilder BuildExpression(StringBuilder sb, ISqlExpression expr, bool buildTableName, bool checkParentheses, string alias, ref bool addAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 return base.BuildExpression(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 sb,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 expr,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 buildTableName && SqlQuery.QueryType != QueryType.InsertOrUpdate,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 checkParentheses,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 alias,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 ref addAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 BuildInsertQuery(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 AppendIndent(sb).AppendLine("ON DUPLICATE KEY UPDATE");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 Indent++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 var first = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 foreach (var expr in SqlQuery.Update.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 if (!first)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 sb.Append(',').AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 first = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 AppendIndent(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 BuildExpression(sb, expr.Column, false, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 sb.Append(" = ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 BuildExpression(sb, expr.Expression, false, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 Indent--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 protected override void BuildEmptyInsert(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 sb.AppendLine("() VALUES ()");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 public static bool GenerateOldGuid = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 public override void BuildValue(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 if (GenerateOldGuid && value is Guid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 var bytes = ((Guid)value).ToByteArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 sb.Append("X'").Append(ByteArrayToHex(bytes)).Append('\'');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 base.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 static string ByteArrayToHex(byte[] barray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 var c = new char[barray.Length * 2];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 for (var i = 0; i < barray.Length; ++i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 var b = ((byte)(barray[i] >> 4));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 b = ((byte)(barray[i] & 0xF));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 c[i * 2 + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 return new string(c);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 protected override void BuildString(StringBuilder sb, string value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 base.BuildString(sb, value.Replace("\\", "\\\\"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 protected override void BuildChar(StringBuilder sb, char value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 if (value == '\\')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 sb.Append("\\\\");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 base.BuildChar(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 }