annotate Source/Data/DataProvider/Interpreters/OracleDataProviderInterpreter.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
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.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace BLToolkit.Data.DataProvider.Interpreters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public class OracleDataProviderInterpreter : DataProviderInterpreterBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public override void SetParameterValue(IDbDataParameter parameter, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 if (value is TimeSpan)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 parameter.Value = ((TimeSpan)value).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 base.SetParameterValue(parameter, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public override List<string> GetInsertBatchSqlList<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 bool withIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 //return GetInsertBatchSqlListWithInsertAll(insertText, collection, members, maxBatchSize);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 return GetInsertBatchSqlListUnionAll(insertText, collection, members, maxBatchSize, withIdentity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private List<string> GetInsertBatchSqlListUnionAll<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 bool withIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 var sp = new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 var sqlList = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 var indexValuesWord = insertText.IndexOf(" VALUES (", StringComparison.Ordinal);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 var initQuery = insertText.Substring(0, indexValuesWord) + Environment.NewLine;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 var valuesQuery = insertText.Substring(indexValuesWord + 9);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 var indexEndValuesQuery = valuesQuery.IndexOf(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 valuesQuery = valuesQuery.Substring(0, indexEndValuesQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 .Replace("\r", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 .Replace("\n", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 .Replace("\t", "");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 // 1 = Number of primary keys generated by sequence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 var valuesWihtoutSequence = withIdentity ? valuesQuery.Substring(valuesQuery.IndexOf(",") + 1) : valuesQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 var sb = new StringBuilder(initQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 sb.Append(" SELECT ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 sb.AppendFormat(valuesQuery, members.Select(m => m.Name).ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 sb.AppendLine(" FROM (");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 initQuery = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 sb = new StringBuilder(initQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 bool isFirstValues = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 foreach (var item in collection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 if (!isFirstValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 sb.AppendLine(" UNION ALL ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 sb.Append("SELECT ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 var values = new List<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 foreach (var member in members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 var sbItem = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 var value = member.GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 if (value is DateTime?)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 value = ((DateTime?)value).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 sp.BuildValue(sbItem, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 values.Add(sbItem + " " + member.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 sb.AppendFormat(valuesWihtoutSequence, values.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 sb.Append(" FROM DUAL");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 isFirstValues = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 n++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 if (n > maxBatchSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 sqlList.Add(sb.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 sb = new StringBuilder(initQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 isFirstValues = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 sqlList.Add(sb.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 return sqlList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 private List<string> GetInsertBatchSqlListWithInsertAll<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 int maxBatchSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 var sp = new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 var sqlList = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 foreach (var item in collection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 if (sb.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 sb.AppendLine("INSERT ALL");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 string strItem = "\t" + insertText
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 .Replace("INSERT INTO", "INTO")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 .Replace("\r", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 .Replace("\n", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 .Replace("\t", " ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 .Replace("( ", "(");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 var values = new List<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 foreach (var member in members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 var sbItem = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 var keyGenerator = member.MapMemberInfo.KeyGenerator as SequenceKeyGenerator;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 if (keyGenerator != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 values.Add(NextSequenceQuery(keyGenerator.Sequence));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 var value = member.GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 if (value is DateTime?)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 value = ((DateTime?)value).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 sp.BuildValue(sbItem, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 values.Add(sbItem.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 sb.AppendFormat(strItem, values.ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 n++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 if (n >= maxBatchSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 sb.AppendLine("SELECT * FROM dual");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 var sql = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 sqlList.Add(sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 sb.Length = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 sb.AppendLine("SELECT * FROM dual");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 var sql = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 sqlList.Add(sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 return sqlList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 public override string GetSequenceQuery(string sequenceName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 return string.Format("SELECT {0}.NEXTVAL FROM DUAL", sequenceName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 public override string NextSequenceQuery(string sequenceName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 return string.Format("{0}.NEXTVAL", sequenceName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 public override string GetReturningInto(string columnName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 return string.Format("returning {0} into :IDENTITY_PARAMETER", columnName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 }