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 }