annotate Source/Data/Sql/SqlProvider/PostgreSQLSqlProvider.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 namespace BLToolkit.Data.Sql.SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class PostgreSQLSqlProvider : BasicSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public override bool IsInsertOrUpdateSupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public override int CommandCount(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 protected override void BuildCommand(int commandNumber, StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 var into = SqlQuery.Insert.Into;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 var attr = GetSequenceNameAttribute(into, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 var name =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 attr != null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 attr.SequenceName :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 Convert(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 string.Format("{0}_{1}_seq", into.PhysicalName, into.GetIdentityField().PhysicalName),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 ConvertType.NameToQueryField);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 AppendIndent(sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 .Append("SELECT currval('")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 .Append(name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 .AppendLine("')");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 return new PostgreSQLSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 protected override string LimitFormat { get { return "LIMIT {0}"; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 protected override string OffsetFormat { get { return "OFFSET {0} "; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 public override ISqlExpression ConvertExpression(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 expr = base.ConvertExpression(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 var be = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 switch (be.Operation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 case "^": return new SqlBinaryExpression(be.SystemType, be.Expr1, "#", be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 var func = (SqlFunction) expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 var ex = AlternativeConvertToBoolean(func, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 if (ex != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 return ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 case "CharIndex" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 return func.Parameters.Length == 2?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 new SqlExpression(func.SystemType, "Position({0} in {1})", Precedence.Primary, func.Parameters[0], func.Parameters[1]):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 Add<int>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 new SqlExpression(func.SystemType, "Position({0} in {1})", Precedence.Primary, func.Parameters[0],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 ConvertExpression(new SqlFunction(typeof(string), "Substring",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 func.Parameters[1],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 func.Parameters[2],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 Sub<int>(ConvertExpression(new SqlFunction(typeof(int), "Length", func.Parameters[1])), func.Parameters[2])))),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 Sub(func.Parameters[2], 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 else if (expr is SqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 var e = (SqlExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 if (e.Expr.StartsWith("Extract(DOW"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 return Inc(new SqlExpression(expr.SystemType, e.Expr.Replace("Extract(DOW", "Extract(Dow"), e.Parameters));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 if (e.Expr.StartsWith("Extract(Millisecond"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 return new SqlExpression(expr.SystemType, "Cast(To_Char({0}, 'MS') as int)", e.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 public override void BuildValue(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 if (value is bool)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 sb.Append(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 base.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 protected override void BuildDataType(StringBuilder sb, SqlDataType type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 switch (type.SqlDbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 case SqlDbType.TinyInt : sb.Append("SmallInt"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 case SqlDbType.Money : sb.Append("Decimal(19,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 case SqlDbType.SmallMoney : sb.Append("Decimal(10,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 #if !MONO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 case SqlDbType.DateTime2 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 case SqlDbType.SmallDateTime :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 case SqlDbType.DateTime : sb.Append("TimeStamp"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 case SqlDbType.Bit : sb.Append("Boolean"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 case SqlDbType.NVarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 sb.Append("VarChar");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (type.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 sb.Append('(').Append(type.Length).Append(')');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 default : base.BuildDataType(sb, type); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 public override SqlQuery Finalize(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 CheckAliases(sqlQuery, int.MaxValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 sqlQuery = base.Finalize(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 switch (sqlQuery.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 default : return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 public static bool QuoteIdentifiers;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 case ConvertType.NameToQueryFieldAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 case ConvertType.NameToQueryTableAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (QuoteIdentifiers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 if (name.Length > 0 && name[0] == '"')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 return '"' + name + '"';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 case ConvertType.NameToCommandParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 case ConvertType.NameToSprocParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 return ":" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 case ConvertType.SprocParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 var str = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 return (str.Length > 0 && str[0] == ':')? str.Substring(1): str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 if (table.SequenceAttributes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 var attr = GetSequenceNameAttribute(table, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 if (attr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 return new SqlExpression("nextval('" + attr.SequenceName+"')", Precedence.Primary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 return base.GetIdentityExpression(table, identityField, forReturning);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 //protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 //{
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 // BuildInsertOrUpdateQueryAsMerge(sb, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 //}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }