Mercurial > pub > bltoolkit
comparison Source/Data/Sql/SqlProvider/SybaseSqlProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Data; | |
3 using System.Text; | |
4 | |
5 namespace BLToolkit.Data.Sql.SqlProvider | |
6 { | |
7 using DataProvider; | |
8 | |
9 public class SybaseSqlProvider : BasicSqlProvider | |
10 { | |
11 public SybaseSqlProvider() | |
12 { | |
13 } | |
14 | |
15 protected override void BuildGetIdentity(StringBuilder sb) | |
16 { | |
17 sb | |
18 .AppendLine() | |
19 .AppendLine("SELECT @@IDENTITY"); | |
20 } | |
21 | |
22 protected override string FirstFormat { get { return "TOP {0}"; } } | |
23 | |
24 public override bool IsSkipSupported { get { return false; } } | |
25 public override bool TakeAcceptsParameter { get { return false; } } | |
26 public override bool IsSubQueryTakeSupported { get { return false; } } | |
27 public override bool IsCountSubQuerySupported { get { return false; } } | |
28 public override bool CanCombineParameters { get { return false; } } | |
29 | |
30 public override ISqlExpression ConvertExpression(ISqlExpression expr) | |
31 { | |
32 expr = base.ConvertExpression(expr); | |
33 | |
34 if (expr is SqlFunction) | |
35 { | |
36 var func = (SqlFunction) expr; | |
37 | |
38 switch (func.Name) | |
39 { | |
40 case "CharIndex" : | |
41 if (func.Parameters.Length == 3) | |
42 return Add<int>( | |
43 ConvertExpression(new SqlFunction(func.SystemType, "CharIndex", | |
44 func.Parameters[0], | |
45 ConvertExpression(new SqlFunction(typeof(string), "Substring", | |
46 func.Parameters[1], | |
47 func.Parameters[2], new SqlFunction(typeof(int), "Len", func.Parameters[1]))))), | |
48 Sub(func.Parameters[2], 1)); | |
49 break; | |
50 | |
51 case "Stuff" : | |
52 if (func.Parameters[3] is SqlValue) | |
53 { | |
54 var value = (SqlValue)func.Parameters[3]; | |
55 | |
56 if (value.Value is string && string.IsNullOrEmpty((string)value.Value)) | |
57 return new SqlFunction( | |
58 func.SystemType, | |
59 func.Name, | |
60 func.Precedence, | |
61 func.Parameters[0], | |
62 func.Parameters[1], | |
63 func.Parameters[1], | |
64 new SqlValue(null)); | |
65 } | |
66 | |
67 break; | |
68 } | |
69 } | |
70 | |
71 return expr; | |
72 } | |
73 | |
74 protected override void BuildFunction(StringBuilder sb, SqlFunction func) | |
75 { | |
76 func = ConvertFunctionParameters(func); | |
77 base.BuildFunction(sb, func); | |
78 } | |
79 | |
80 private bool _isSelect; | |
81 readonly bool _skipAliases; | |
82 | |
83 SybaseSqlProvider(bool skipAliases) | |
84 { | |
85 _skipAliases = skipAliases; | |
86 } | |
87 | |
88 protected override void BuildSelectClause(StringBuilder sb) | |
89 { | |
90 _isSelect = true; | |
91 base.BuildSelectClause(sb); | |
92 _isSelect = false; | |
93 } | |
94 | |
95 protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias) | |
96 { | |
97 var wrap = false; | |
98 | |
99 if (expr.SystemType == typeof(bool)) | |
100 { | |
101 if (expr is SqlQuery.SearchCondition) | |
102 wrap = true; | |
103 else | |
104 { | |
105 var ex = expr as SqlExpression; | |
106 wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition; | |
107 } | |
108 } | |
109 | |
110 if (wrap) sb.Append("CASE WHEN "); | |
111 base.BuildColumnExpression(sb, expr, alias, ref addAlias); | |
112 if (wrap) sb.Append(" THEN 1 ELSE 0 END"); | |
113 | |
114 if (_skipAliases) addAlias = false; | |
115 } | |
116 | |
117 protected override ISqlProvider CreateSqlProvider() | |
118 { | |
119 return new SybaseSqlProvider(_isSelect); | |
120 } | |
121 | |
122 protected override void BuildDataType(StringBuilder sb, SqlDataType type) | |
123 { | |
124 switch (type.SqlDbType) | |
125 { | |
126 #if !MONO | |
127 case SqlDbType.DateTime2 : sb.Append("DateTime"); break; | |
128 #endif | |
129 default : base.BuildDataType(sb, type); break; | |
130 } | |
131 } | |
132 | |
133 protected override void BuildDeleteClause(StringBuilder sb) | |
134 { | |
135 AppendIndent(sb); | |
136 sb.Append("DELETE FROM "); | |
137 // BuildTableName(sb, SqlQuery.From.Tables[0], true, false); | |
138 | |
139 ISqlTableSource table; | |
140 ISqlTableSource source; | |
141 | |
142 if (SqlQuery.Delete.Table != null) | |
143 table = source = SqlQuery.Delete.Table; | |
144 else | |
145 { | |
146 table = SqlQuery.From.Tables[0]; | |
147 source = SqlQuery.From.Tables[0].Source; | |
148 } | |
149 | |
150 var alias = GetTableAlias(table); | |
151 BuildPhysicalTable(sb, source, alias); | |
152 | |
153 sb.AppendLine(); | |
154 } | |
155 | |
156 protected override void BuildUpdateTableName(StringBuilder sb) | |
157 { | |
158 if (SqlQuery.Update.Table != null && SqlQuery.Update.Table != SqlQuery.From.Tables[0].Source) | |
159 BuildPhysicalTable(sb, SqlQuery.Update.Table, null); | |
160 else | |
161 BuildTableName(sb, SqlQuery.From.Tables[0], true, false); | |
162 } | |
163 | |
164 protected override void BuildString(StringBuilder sb, string value) | |
165 { | |
166 foreach (var ch in value) | |
167 { | |
168 if (ch > 127) | |
169 { | |
170 sb.Append("N"); | |
171 break; | |
172 } | |
173 } | |
174 | |
175 base.BuildString(sb, value); | |
176 } | |
177 | |
178 protected override void BuildChar(StringBuilder sb, char value) | |
179 { | |
180 if (value > 127) | |
181 sb.Append("N"); | |
182 | |
183 base.BuildChar(sb, value); | |
184 } | |
185 | |
186 public override object Convert(object value, ConvertType convertType) | |
187 { | |
188 switch (convertType) | |
189 { | |
190 case ConvertType.NameToQueryParameter: | |
191 case ConvertType.NameToCommandParameter: | |
192 case ConvertType.NameToSprocParameter: | |
193 { | |
194 var name = "@" + value; | |
195 | |
196 if (name.Length > 27) | |
197 name = name.Substring(0, 27); | |
198 | |
199 return name; | |
200 } | |
201 | |
202 case ConvertType.NameToQueryField: | |
203 case ConvertType.NameToQueryFieldAlias: | |
204 case ConvertType.NameToQueryTableAlias: | |
205 { | |
206 var name = value.ToString(); | |
207 | |
208 if (name.Length > 28 || name.Length > 0 && name[0] == '[') | |
209 return value; | |
210 } | |
211 | |
212 return "[" + value + "]"; | |
213 | |
214 case ConvertType.NameToDatabase: | |
215 case ConvertType.NameToOwner: | |
216 case ConvertType.NameToQueryTable: | |
217 { | |
218 var name = value.ToString(); | |
219 | |
220 if (name.Length > 28 || name.Length > 0 && (name[0] == '[' || name[0] == '#')) | |
221 return value; | |
222 | |
223 if (name.IndexOf('.') > 0) | |
224 value = string.Join("].[", name.Split('.')); | |
225 } | |
226 | |
227 return "[" + value + "]"; | |
228 | |
229 case ConvertType.SprocParameterToName: | |
230 if (value != null) | |
231 { | |
232 var str = value.ToString(); | |
233 return str.Length > 0 && str[0] == '@'? str.Substring(1): str; | |
234 } | |
235 | |
236 break; | |
237 } | |
238 | |
239 return value; | |
240 } | |
241 | |
242 protected override void BuildInsertOrUpdateQuery(StringBuilder sb) | |
243 { | |
244 BuildInsertOrUpdateQueryAsUpdateInsert(sb); | |
245 } | |
246 | |
247 protected override void BuildEmptyInsert(StringBuilder sb) | |
248 { | |
249 sb.AppendLine("VALUES ()"); | |
250 } | |
251 } | |
252 } |