annotate Source/ServiceModel/LinqServiceSerializer.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +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;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Globalization;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace BLToolkit.ServiceModel
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using Data.Sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 static class LinqServiceSerializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 #region Public Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public static string Serialize(SqlQuery query, SqlParameter[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 return new QuerySerializer().Serialize(query, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public static LinqServiceQuery Deserialize(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 return new QueryDeserializer().Deserialize(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 public static string Serialize(LinqServiceResult result)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 return new ResultSerializer().Serialize(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 public static LinqServiceResult DeserializeResult(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 return new ResultDeserializer().DeserializeResult(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public static string Serialize(string[] data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 return new StringArraySerializer().Serialize(data);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 public static string[] DeserializeStringArray(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 return new StringArrayDeserializer().Deserialize(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 #region SerializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 const int _paramIndex = -1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 const int _typeIndex = -2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 const int _typeArrayIndex = -3;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 class SerializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 protected readonly StringBuilder Builder = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 protected readonly Dictionary<object,int> Dic = new Dictionary<object,int>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 protected int Index;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 string ConvertToString(Type type, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 switch (Type.GetTypeCode(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 case TypeCode.Decimal : return ((decimal) value).ToString(CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 case TypeCode.Double : return ((double) value).ToString(CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 case TypeCode.Single : return ((float) value).ToString(CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 case TypeCode.DateTime : return ((DateTime)value).ToString("o");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 if (type == typeof(DateTimeOffset))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 return ((DateTimeOffset)value).ToString("o");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 return Common.Convert.ToString(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 protected void Append(Type type, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 Append(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 Append((string)null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 else if (!type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 Append(ConvertToString(type, value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 var elementType = type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 Builder.Append(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 var len = Builder.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 var cnt = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 if (elementType.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 foreach (var val in (IEnumerable)value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 Append(elementType, val);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 cnt++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 foreach (var val in (IEnumerable)value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 if (val == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 Append((string)null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 Append(ConvertToString(val.GetType(), val));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 cnt++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 Builder.Insert(len, cnt.ToString(CultureInfo.CurrentCulture));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 protected void Append(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 Builder.Append(' ').Append(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 protected void Append(Type value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 Builder.Append(' ').Append(value == null ? 0 : GetType(value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 protected void Append(bool value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 Builder.Append(' ').Append(value ? '1' : '0');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 protected void Append(IQueryElement element)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 Builder.Append(' ').Append(element == null ? 0 : Dic[element]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 protected void Append(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 Builder.Append(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 if (str == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 Builder.Append('-');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 else if (str.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 Builder.Append('0');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 Builder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 .Append(str.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 .Append(':')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 .Append(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 protected int GetType(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 int idx;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 if (!Dic.TryGetValue(type, out idx))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 if (type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 var elementType = GetType(type.GetElementType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 Dic.Add(type, idx = ++Index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 Builder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 .Append(idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 .Append(_typeArrayIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 .Append(elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 Dic.Add(type, idx = ++Index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 Builder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 .Append(idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 .Append(_typeIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 Append(type.FullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 return idx;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 #region DeserializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 public class DeserializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 protected readonly Dictionary<int,object> Dic = new Dictionary<int,object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 protected string Str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 protected int Pos;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 protected char Peek()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 return Str[Pos];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 char Next()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 return Str[++Pos];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 protected bool Get(char c)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 if (Peek() == c)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 protected int ReadInt()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 Get(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 var minus = Get('-');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 var value = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 for (var c = Peek(); char.IsDigit(c); c = Next())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 value = value * 10 + (c - '0');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 return minus ? -value : value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 protected int? ReadCount()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 Get(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 if (Get('-'))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 var value = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 for (var c = Peek(); char.IsDigit(c); c = Next())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 value = value * 10 + (c - '0');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 protected string ReadString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 Get(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 var c = Peek();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 if (c == '-')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 if (c == '0')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 return string.Empty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 var len = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 var value = Str.Substring(++Pos, len);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 Pos += len;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 protected bool ReadBool()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 Get(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 var value = Peek() == '1';
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 protected T Read<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 var idx = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 return idx == 0 ? null : (T)Dic[idx];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 protected T[] ReadArray<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 var count = ReadCount();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 if (count == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 var items = new T[count.Value];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 for (var i = 0; i < count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 items[i] = Read<T>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 return items;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 protected List<T> ReadList<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 var count = ReadCount();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 if (count == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 var items = new List<T>(count.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 for (var i = 0; i < count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 items.Add(Read<T>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 return items;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 protected void NextLine()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 while (Pos < Str.Length && (Peek() == '\n' || Peek() == '\r'))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 interface IDeserializerHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 object GetArray(DeserializerBase deserializer);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 class DeserializerHelper<T> : IDeserializerHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 public object GetArray(DeserializerBase deserializer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 var count = deserializer.ReadCount();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 if (count == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 var arr = new T[count.Value];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 var type = typeof(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 for (var i = 0; i < count.Value; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 arr[i] = (T)deserializer.ReadValue(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 return arr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 static readonly Dictionary<Type,Func<DeserializerBase,object>> _arrayDeserializers =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 new Dictionary<Type,Func<DeserializerBase,object>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 protected object ReadValue(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 return ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 if (type.IsArray)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 var elem = type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 Func<DeserializerBase,object> deserializer;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 lock (_arrayDeserializers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 if (!_arrayDeserializers.TryGetValue(elem, out deserializer))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 var helper = (IDeserializerHelper)Activator.CreateInstance(typeof(DeserializerHelper<>).MakeGenericType(elem));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 _arrayDeserializers.Add(elem, deserializer = helper.GetArray);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 return deserializer(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 var str = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 switch (Type.GetTypeCode(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 case TypeCode.Decimal : return decimal. Parse(str, CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 case TypeCode.Double : return double. Parse(str, CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 case TypeCode.Single : return float. Parse(str, CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 case TypeCode.DateTime : return DateTime.ParseExact(str, "o", CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 if (type == typeof(DateTimeOffset))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 return DateTimeOffset.ParseExact(str, "o", CultureInfo.InvariantCulture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 return Common.Convert.ChangeTypeFromString(str, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 protected readonly List<string> UnresolvedTypes = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 protected Type ResolveType(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 if (str == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 var type = Type.GetType(str, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 if (str == "System.Data.Linq.Binary")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 return typeof(System.Data.Linq.Binary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 type = LinqService.TypeResolver(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 UnresolvedTypes.Add(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 Debug.WriteLine(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 string.Format("Type '{0}' cannot be resolved. Use LinqService.TypeResolver to resolve unknown types.", str),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 "LinqServiceSerializer");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 #region QuerySerializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 class QuerySerializer : SerializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 public string Serialize(SqlQuery query, SqlParameter[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 var visitor = new QueryVisitor();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 visitor.Visit(query, Visit);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 foreach (var parameter in parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 if (!Dic.ContainsKey(parameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 Visit(parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 Builder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 .Append(++Index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 .Append(_paramIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 Append(parameters.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 foreach (var parameter in parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 Append(parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 return Builder.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 void Visit(IQueryElement e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 switch (e.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 case QueryElementType.SqlField :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 var fld = (SqlField)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 if (fld != fld.Table.All)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 GetType(fld.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 if (fld.MemberMapper != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 GetType(fld.MemberMapper.MemberAccessor.TypeAccessor.OriginalType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 case QueryElementType.SqlParameter :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 var p = (SqlParameter)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 var t = p.Value == null ? p.SystemType : p.Value.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 if (p.Value == null || t.IsArray || t == typeof(string) || !(p.Value is IEnumerable))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 GetType(t);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 var elemType = TypeHelper.GetElementType(t);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 GetType(GetArrayType(elemType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 //if (p.EnumTypes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 // foreach (var type in p.EnumTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 // GetType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 case QueryElementType.SqlFunction : GetType(((SqlFunction) e).SystemType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 case QueryElementType.SqlExpression : GetType(((SqlExpression) e).SystemType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 case QueryElementType.SqlBinaryExpression : GetType(((SqlBinaryExpression)e).SystemType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 case QueryElementType.SqlDataType : GetType(((SqlDataType) e).Type); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 case QueryElementType.SqlValue : GetType(((SqlValue) e).SystemType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 case QueryElementType.SqlTable : GetType(((SqlTable) e).ObjectType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 Dic.Add(e, ++Index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 Builder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 .Append(Index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 .Append((int)e.ElementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 switch (e.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 case QueryElementType.SqlField :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 var elem = (SqlField)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 Append(elem.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 Append(elem.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 Append(elem.PhysicalName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 Append(elem.Nullable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 Append(elem.PrimaryKeyOrder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 Append(elem.IsIdentity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 Append(elem.IsUpdatable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 Append(elem.IsInsertable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 Append(elem.MemberMapper == null ? null : elem.MemberMapper.MemberAccessor.TypeAccessor.OriginalType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 Append(elem.MemberMapper == null ? null : elem.MemberMapper.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 case QueryElementType.SqlFunction :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 var elem = (SqlFunction)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 Append(elem.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 Append(elem.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 Append(elem.Precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 Append(elem.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 case QueryElementType.SqlParameter :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 var elem = (SqlParameter)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 Append(elem.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 Append(elem.IsQueryParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 Append((int)elem.DbType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 Append(elem.DbSize);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 var type = elem.Value == null ? elem.SystemType : elem.Value.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 if (elem.Value == null || type.IsArray || type == typeof(string) || !(elem.Value is IEnumerable))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 Append(type, elem.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 var elemType = TypeHelper.GetElementType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 var value = ConvertIEnumerableToArray(elem.Value, elemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 Append(GetArrayType(elemType), value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 case QueryElementType.SqlExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 var elem = (SqlExpression)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 Append(elem.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 Append(elem.Expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 Append(elem.Precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 Append(elem.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 case QueryElementType.SqlBinaryExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 var elem = (SqlBinaryExpression)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 Append(elem.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 Append(elem.Operation);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 Append(elem.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 Append(elem.Precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 case QueryElementType.SqlValue :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 var elem = (SqlValue)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 Append(elem.SystemType, elem.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 case QueryElementType.SqlDataType :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 var elem = (SqlDataType)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 Append((int)elem.SqlDbType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 Append(elem.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 Append(elem.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 Append(elem.Precision);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 Append(elem.Scale);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 case QueryElementType.SqlTable :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 var elem = (SqlTable)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 Append(elem.SourceID);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 Append(elem.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 Append(elem.Alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 Append(elem.Database);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 Append(elem.Owner);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 Append(elem.PhysicalName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 Append(elem.ObjectType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 if (elem.SequenceAttributes == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 Builder.Append(" -");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 Append(elem.SequenceAttributes.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 foreach (var a in elem.SequenceAttributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 Append(a.ProviderName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 Append(a.SequenceName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 Append(Dic[elem.All]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 Append(elem.Fields.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 foreach (var field in elem.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 Append(Dic[field.Value]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 Append((int)elem.SqlTableType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 if (elem.SqlTableType != SqlTableType.Table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 if (elem.TableArguments == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 Append(0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 Append(elem.TableArguments.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 foreach (var expr in elem.TableArguments)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 Append(Dic[expr]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 case QueryElementType.ExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 var elem = (SqlQuery.Predicate.Expr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 Append(elem.Precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 case QueryElementType.NotExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 var elem = (SqlQuery.Predicate.NotExpr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 Append(elem.Precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704 case QueryElementType.ExprExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 var elem = (SqlQuery.Predicate.ExprExpr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 Append((int)elem.Operator);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 Append(elem.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715 case QueryElementType.LikePredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717 var elem = (SqlQuery.Predicate.Like)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 Append(elem.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 Append(elem.Escape);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727 case QueryElementType.BetweenPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 var elem = (SqlQuery.Predicate.Between)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733 Append(elem.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 Append(elem.Expr3);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 case QueryElementType.IsNullPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741 var elem = (SqlQuery.Predicate.IsNull)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 case QueryElementType.InSubQueryPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751 var elem = (SqlQuery.Predicate.InSubQuery)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 Append(elem.SubQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 case QueryElementType.InListPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762 var elem = (SqlQuery.Predicate.InList)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 Append(elem.Expr1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 Append(elem.Values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 case QueryElementType.FuncLikePredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773 var elem = (SqlQuery.Predicate.FuncLike)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 Append(elem.Function);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 case QueryElementType.SqlQuery :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780 var elem = (SqlQuery)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782 Append(elem.SourceID);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783 Append((int)elem.QueryType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 Append(elem.From);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 var appendInsert = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787 var appendUpdate = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788 var appendDelete = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789 var appendSelect = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791 switch (elem.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793 case QueryType.InsertOrUpdate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794 appendUpdate = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795 appendInsert = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798 case QueryType.Update :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 appendUpdate = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 case QueryType.Delete :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803 appendDelete = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 appendSelect = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807 case QueryType.Insert :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 appendInsert = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809 if (elem.From.Tables.Count != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810 appendSelect = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 default :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 appendSelect = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818 Append(appendInsert); if (appendInsert) Append(elem.Insert);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 Append(appendUpdate); if (appendUpdate) Append(elem.Update);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820 Append(appendDelete); if (appendDelete) Append(elem.Delete);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821 Append(appendSelect); if (appendSelect) Append(elem.Select);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823 Append(elem.Where);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824 Append(elem.GroupBy);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 Append(elem.Having);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826 Append(elem.OrderBy);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827 Append(elem.ParentSql == null ? 0 : elem.ParentSql.SourceID);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 Append(elem.IsParameterDependent);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830 if (!elem.HasUnion)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831 Builder.Append(" -");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 Append(elem.Unions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 Append(elem.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837 if (Dic.ContainsKey(elem.All))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838 Append(Dic[elem.All]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840 Builder.Append(" -");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 case QueryElementType.Column :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847 var elem = (SqlQuery.Column) e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849 Append(elem.Parent.SourceID);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 Append(elem.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851 Append(elem._alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856 case QueryElementType.SearchCondition :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 Append(((SqlQuery.SearchCondition)e).Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860 case QueryElementType.Condition :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862 var elem = (SqlQuery.Condition)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 Append(elem.IsNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 Append(elem.Predicate);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866 Append(elem.IsOr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871 case QueryElementType.TableSource :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873 var elem = (SqlQuery.TableSource)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875 Append(elem.Source);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876 Append(elem._alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 Append(elem.Joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 case QueryElementType.JoinedTable :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884 var elem = (SqlQuery.JoinedTable)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886 Append((int)elem.JoinType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887 Append(elem.Table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888 Append(elem.IsWeak);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889 Append(elem.Condition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 case QueryElementType.SelectClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 var elem = (SqlQuery.SelectClause)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898 Append(elem.IsDistinct);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899 Append(elem.SkipValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900 Append(elem.TakeValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901 Append(elem.Columns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906 case QueryElementType.InsertClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 var elem = (SqlQuery.InsertClause)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910 Append(elem.Items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911 Append(elem.Into);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 Append(elem.WithIdentity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917 case QueryElementType.UpdateClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919 var elem = (SqlQuery.UpdateClause)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921 Append(elem.Items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922 Append(elem.Keys);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 Append(elem.Table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 case QueryElementType.DeleteClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 var elem = (SqlQuery.DeleteClause)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931 Append(elem.Table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935 case QueryElementType.SetExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 var elem = (SqlQuery.SetExpression)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939 Append(elem.Column);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940 Append(elem.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945 case QueryElementType.FromClause : Append(((SqlQuery.FromClause) e).Tables); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946 case QueryElementType.WhereClause : Append(((SqlQuery.WhereClause) e).SearchCondition); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947 case QueryElementType.GroupByClause : Append(((SqlQuery.GroupByClause)e).Items); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948 case QueryElementType.OrderByClause : Append(((SqlQuery.OrderByClause)e).Items); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950 case QueryElementType.OrderByItem :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 var elem = (SqlQuery.OrderByItem)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954 Append(elem.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 Append(elem.IsDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 case QueryElementType.Union :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962 var elem = (SqlQuery.Union)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964 Append(elem.SqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965 Append(elem.IsAll);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974 void Append<T>(ICollection<T> exprs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975 where T : IQueryElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977 if (exprs == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978 Builder.Append(" -");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981 Append(exprs.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983 foreach (var e in exprs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 Append(Dic[e]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991 #region QueryDeserializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993 public class QueryDeserializer : DeserializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995 SqlQuery _query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 SqlParameter[] _parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998 readonly Dictionary<int,SqlQuery> _queries = new Dictionary<int,SqlQuery>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999 readonly List<Action> _actions = new List<Action>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001 public LinqServiceQuery Deserialize(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003 Str = str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 while (Parse()) {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007 foreach (var action in _actions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008 action();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010 return new LinqServiceQuery { Query = _query, Parameters = _parameters };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013 bool Parse()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015 NextLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017 if (Pos >= Str.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 var obj = null as object;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021 var idx = ReadInt(); Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 var type = ReadInt(); Pos++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 switch ((QueryElementType)type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026 case (QueryElementType)_paramIndex : obj = _parameters = ReadArray<SqlParameter>(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027 case (QueryElementType)_typeIndex : obj = ResolveType(ReadString()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028 case (QueryElementType)_typeArrayIndex : obj = GetArrayType(Read<Type>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 case QueryElementType.SqlField :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033 var name = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 var physicalName = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035 var nullable = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 var primaryKeyOrder = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037 var isIdentity = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 var isUpdatable = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 var isInsertable = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 var memberMapperType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041 var memberMapperName = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 var memberMapper = memberMapperType == null ? null : Map.GetObjectMapper(memberMapperType)[memberMapperName];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 obj = new SqlField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045 systemType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046 name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047 physicalName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 nullable,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049 primaryKeyOrder,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 isIdentity
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051 ? new DataAccess.IdentityAttribute()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052 : isInsertable || isUpdatable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053 ? new DataAccess.NonUpdatableAttribute(isInsertable, isUpdatable, false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054 : null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 memberMapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060 case QueryElementType.SqlFunction :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063 var name = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064 var precedence = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065 var parameters = ReadArray<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067 obj = new SqlFunction(systemType, name, precedence, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072 case QueryElementType.SqlParameter :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 var name = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075 var isQueryParameter = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 var dbType = (DbType)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077 var dbSize = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 var value = ReadValue(systemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080 //var enumTypes = ReadList<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 //var takeValues = null as List<int>;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 var count = ReadCount();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 if (count != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 takeValues = new List<int>(count.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 for (var i = 0; i < count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 takeValues.Add(ReadInt());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094 var likeStart = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 var likeEnd = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098 obj = new SqlParameter(systemType, name, value, (MappingSchema)null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100 IsQueryParameter = isQueryParameter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101 DbType = dbType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 DbSize = dbSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 //EnumTypes = enumTypes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104 //TakeValues = takeValues,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105 //LikeStart = likeStart,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106 //LikeEnd = likeEnd,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110 if (enumTypes != null && UnresolvedTypes.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111 foreach (var et in enumTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112 if (et == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113 throw new LinqException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114 "Query cannot be deserialized. The possible reason is that the deserializer could not resolve the following types: {0}. Use LinqService.TypeResolver to resolve types.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115 string.Join(", ", UnresolvedTypes.Select(_ => "'" + _ + "'").ToArray()));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1121 case QueryElementType.SqlExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1123 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1124 var expr = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1125 var precedence = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1126 var parameters = ReadArray<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1128 obj = new SqlExpression(systemType, expr, precedence, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1130 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1133 case QueryElementType.SqlBinaryExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1135 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1136 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1137 var operation = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1138 var expr2 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1139 var precedence = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1141 obj = new SqlBinaryExpression(systemType, expr1, operation, expr2, precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1143 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1146 case QueryElementType.SqlValue :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1148 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1149 var value = ReadValue(systemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1151 obj = new SqlValue(systemType, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1153 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1154 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1156 case QueryElementType.SqlDataType :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1157 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1158 var dbType = (SqlDbType)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1159 var systemType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1160 var length = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1161 var precision = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1162 var scale = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1164 obj = new SqlDataType(dbType, systemType, length, precision, scale);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1166 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1167 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1169 case QueryElementType.SqlTable :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1170 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1171 var sourceID = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1172 var name = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1173 var alias = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1174 var database = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1175 var owner = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1176 var physicalName = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1177 var objectType = Read<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1178 var sequenceAttributes = null as SequenceNameAttribute[];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1180 var count = ReadCount();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1181
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1182 if (count != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1184 sequenceAttributes = new SequenceNameAttribute[count.Value];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1186 for (var i = 0; i < count.Value; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1187 sequenceAttributes[i] = new SequenceNameAttribute(ReadString(), ReadString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1188 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1190 var all = Read<SqlField>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1191 var fields = ReadArray<SqlField>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1192 var flds = new SqlField[fields.Length + 1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1194 flds[0] = all;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1195 Array.Copy(fields, 0, flds, 1, fields.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1197 var sqlTableType = (SqlTableType)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1198 var tableArgs = sqlTableType == SqlTableType.Table ? null : ReadArray<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1200 obj = new SqlTable(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1201 sourceID, name, alias, database, owner, physicalName, objectType, sequenceAttributes, flds,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1202 sqlTableType, tableArgs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1204 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1207 case QueryElementType.ExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1208 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1209 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1210 var precedence = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1212 obj = new SqlQuery.Predicate.Expr(expr1, precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1214 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1215 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1217 case QueryElementType.NotExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1218 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1219 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1220 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1221 var precedence = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1223 obj = new SqlQuery.Predicate.NotExpr(expr1, isNot, precedence);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1225 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1226 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1228 case QueryElementType.ExprExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1230 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1231 var @operator = (SqlQuery.Predicate.Operator)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1232 var expr2 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1234 obj = new SqlQuery.Predicate.ExprExpr(expr1, @operator, expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1236 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1239 case QueryElementType.LikePredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1241 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1242 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1243 var expr2 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1244 var escape = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1246 obj = new SqlQuery.Predicate.Like(expr1, isNot, expr2, escape);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1248 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1249 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1251 case QueryElementType.BetweenPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1253 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1254 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1255 var expr2 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1256 var expr3 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1258 obj = new SqlQuery.Predicate.Between(expr1, isNot, expr2, expr3);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1260 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1263 case QueryElementType.IsNullPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1264 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1265 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1266 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1268 obj = new SqlQuery.Predicate.IsNull(expr1, isNot);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1270 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1271 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1273 case QueryElementType.InSubQueryPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1274 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1275 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1276 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1277 var subQuery = Read<SqlQuery>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1279 obj = new SqlQuery.Predicate.InSubQuery(expr1, isNot, subQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1281 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1284 case QueryElementType.InListPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1285 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1286 var expr1 = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1287 var isNot = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1288 var values = ReadList<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1290 obj = new SqlQuery.Predicate.InList(expr1, isNot, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1292 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1295 case QueryElementType.FuncLikePredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1297 var func = Read<SqlFunction>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1298 obj = new SqlQuery.Predicate.FuncLike(func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1299 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1300 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1302 case QueryElementType.SqlQuery :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1303 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1304 var sid = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1305 var queryType = (QueryType)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1306 var from = Read<SqlQuery.FromClause>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1307 var readInsert = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1308 var insert = readInsert ? Read<SqlQuery.InsertClause>() : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1309 var readUpdate = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1310 var update = readUpdate ? Read<SqlQuery.UpdateClause>() : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1311 var readDelete = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1312 var delete = readDelete ? Read<SqlQuery.DeleteClause>() : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1313 var readSelect = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1314 var select = readSelect ? Read<SqlQuery.SelectClause>() : new SqlQuery.SelectClause(null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1315 var where = Read<SqlQuery.WhereClause>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1316 var groupBy = Read<SqlQuery.GroupByClause>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1317 var having = Read<SqlQuery.WhereClause>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1318 var orderBy = Read<SqlQuery.OrderByClause>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1319 var parentSql = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1320 var parameterDependent = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1321 var unions = ReadArray<SqlQuery.Union>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1322 var parameters = ReadArray<SqlParameter>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1324 var query = _query = new SqlQuery(sid) { QueryType = queryType };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1326 query.Init(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1327 insert,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1328 update,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1329 delete,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1330 select,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1331 from,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1332 where,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1333 groupBy,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1334 having,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1335 orderBy,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1336 unions == null ? null : unions.ToList(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1337 null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1338 parameterDependent,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1339 parameters.ToList());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1341 _queries.Add(sid, _query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1343 if (parentSql != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1344 _actions.Add(() =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1346 SqlQuery sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1347 if (_queries.TryGetValue(parentSql, out sql))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1348 query.ParentSql = sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1349 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1351 query.All = Read<SqlField>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1353 obj = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1355 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1356 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1357
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1358 case QueryElementType.Column :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1359 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1360 var sid = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1361 var expression = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1362 var alias = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1364 var col = new SqlQuery.Column(null, expression, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1366 _actions.Add(() => col.Parent = _queries[sid]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1368 obj = col;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1370 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1371 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1373 case QueryElementType.SearchCondition :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1374 obj = new SqlQuery.SearchCondition(ReadArray<SqlQuery.Condition>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1375 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1377 case QueryElementType.Condition :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1378 obj = new SqlQuery.Condition(ReadBool(), Read<ISqlPredicate>(), ReadBool());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1379 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1380
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1381 case QueryElementType.TableSource :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1382 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1383 var source = Read<ISqlTableSource>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1384 var alias = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1385 var joins = ReadArray<SqlQuery.JoinedTable>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1387 obj = new SqlQuery.TableSource(source, alias, joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1388
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1389 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1390 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1392 case QueryElementType.JoinedTable :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1393 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1394 var joinType = (SqlQuery.JoinType)ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1395 var table = Read<SqlQuery.TableSource>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1396 var isWeak = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1397 var condition = Read<SqlQuery.SearchCondition>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1398
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1399 obj = new SqlQuery.JoinedTable(joinType, table, isWeak, condition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1401 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1402 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1404 case QueryElementType.SelectClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1405 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1406 var isDistinct = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1407 var skipValue = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1408 var takeValue = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1409 var columns = ReadArray<SqlQuery.Column>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1411 obj = new SqlQuery.SelectClause(isDistinct, takeValue, skipValue, columns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1413 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1414 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1415
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1416 case QueryElementType.InsertClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1418 var items = ReadArray<SqlQuery.SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1419 var into = Read<SqlTable>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1420 var wid = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1421
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1422 var c = new SqlQuery.InsertClause { Into = into, WithIdentity = wid };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1423
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1424 c.Items.AddRange(items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1425 obj = c;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1426
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1427 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1430 case QueryElementType.UpdateClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1431 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1432 var items = ReadArray<SqlQuery.SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1433 var keys = ReadArray<SqlQuery.SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1434 var table = Read<SqlTable>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1435 //var wid = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1436
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1437 var c = new SqlQuery.UpdateClause { Table = table };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1438
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1439 c.Items.AddRange(items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1440 c.Keys. AddRange(keys);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1441 obj = c;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1443 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1444 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1445
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1446 case QueryElementType.DeleteClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1447 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1448 var table = Read<SqlTable>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1449 obj = new SqlQuery.DeleteClause { Table = table };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1450 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1451 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1452
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1453 case QueryElementType.SetExpression : obj = new SqlQuery.SetExpression(Read<ISqlExpression>(), Read<ISqlExpression>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1454 case QueryElementType.FromClause : obj = new SqlQuery.FromClause(ReadArray<SqlQuery.TableSource>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1455 case QueryElementType.WhereClause : obj = new SqlQuery.WhereClause(Read<SqlQuery.SearchCondition>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1456 case QueryElementType.GroupByClause : obj = new SqlQuery.GroupByClause(ReadArray<ISqlExpression>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1457 case QueryElementType.OrderByClause : obj = new SqlQuery.OrderByClause(ReadArray<SqlQuery.OrderByItem>()); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1459 case QueryElementType.OrderByItem :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1460 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1461 var expression = Read<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1462 var isDescending = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1464 obj = new SqlQuery.OrderByItem(expression, isDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1465
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1466 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1467 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1468
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1469 case QueryElementType.Union :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1470 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1471 var sqlQuery = Read<SqlQuery>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1472 var isAll = ReadBool();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1473
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1474 obj = new SqlQuery.Union(sqlQuery, isAll);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1475
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1476 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1477 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1478 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1479
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1480 Dic.Add(idx, obj);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1482 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1483 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1484 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1486 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1488 #region ResultSerializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1490 class ResultSerializer : SerializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1491 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1492 public string Serialize(LinqServiceResult result)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1493 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1494 Append(result.FieldCount);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1495 Append(result.VaryingTypes.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1496 Append(result.RowCount);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1497 Append(result.QueryID.ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1498
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1499 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1501 foreach (var name in result.FieldNames)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1502 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1503 Append(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1504 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1505 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1507 foreach (var type in result.FieldTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1508 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1509 Append(type.FullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1510 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1511 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1513 foreach (var type in result.VaryingTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1515 Append(type.FullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1516 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1517 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1518
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1519 foreach (var data in result.Data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1520 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1521 foreach (var str in data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1522 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1523 if (result.VaryingTypes.Length > 0 && !string.IsNullOrEmpty(str) && str[0] == '\0')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1524 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1525 Builder.Append('*');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1526 Append((int)str[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1527 Append(str.Substring(2));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1528 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1529 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1530 Append(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1531 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1532
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1533 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1534 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1535
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1536 return Builder.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1537 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1538 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1540 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1541
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1542 #region ResultDeserializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1544 class ResultDeserializer : DeserializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1546 public LinqServiceResult DeserializeResult(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1547 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1548 Str = str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1549
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1550 var fieldCount = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1551 var varTypesLen = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1553 var result = new LinqServiceResult
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1554 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1555 FieldCount = fieldCount,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1556 RowCount = ReadInt(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1557 VaryingTypes = new Type[varTypesLen],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1558 QueryID = new Guid(ReadString()),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1559 FieldNames = new string[fieldCount],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1560 FieldTypes = new Type [fieldCount],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1561 Data = new List<string[]>(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1562 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1563
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1564 NextLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1566 for (var i = 0; i < fieldCount; i++) { result.FieldNames [i] = ReadString(); NextLine(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1567 for (var i = 0; i < fieldCount; i++) { result.FieldTypes [i] = ResolveType(ReadString()); NextLine(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1568 for (var i = 0; i < varTypesLen; i++) { result.VaryingTypes[i] = ResolveType(ReadString()); NextLine(); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1569
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1570 for (var n = 0; n < result.RowCount; n++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1571 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1572 var data = new string[fieldCount];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1573
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1574 for (var i = 0; i < fieldCount; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1575 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1576 if (varTypesLen > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1577 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1578 Get(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1579
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1580 if (Get('*'))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1581 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1582 var idx = ReadInt();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1583 data[i] = "\0" + (char)idx + ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1584 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1585 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1586 data[i] = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1587 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1588 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1589 data[i] = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1590 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1591
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1592 result.Data.Add(data);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1593
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1594 NextLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1595 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1597 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1598 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1599 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1601 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1602
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1603 #region StringArraySerializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1605 class StringArraySerializer : SerializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1606 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1607 public string Serialize(string[] data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1608 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1609 Append(data.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1610
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1611 foreach (var str in data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1612 Append(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1613
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1614 Builder.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1615
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1616 return Builder.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1617 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1618 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1619
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1620 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1621
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1622 #region StringArrayDeserializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1623
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1624 class StringArrayDeserializer : DeserializerBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1625 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1626 public string[] Deserialize(string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1627 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1628 Str = str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1630 var data = new string[ReadInt()];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1631
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1632 for (var i = 0; i < data.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1633 data[i] = ReadString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1634
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1635 return data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1636 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1637 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1638
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1639 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1640
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1641 #region Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1642
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1643 interface IArrayHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1644 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1645 Type GetArrayType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1646 object ConvertToArray(object list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1647 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1648
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1649 class ArrayHelper<T> : IArrayHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1650 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1651 public Type GetArrayType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1652 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1653 return typeof(T[]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1654 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1655
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1656 public object ConvertToArray(object list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1657 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1658 return ((IEnumerable<T>)list).ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1659 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1660 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1661
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1662 static readonly Dictionary<Type,Type> _arrayTypes = new Dictionary<Type,Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1663 static readonly Dictionary<Type,Func<object,object>> _arrayConverters = new Dictionary<Type,Func<object,object>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1664
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1665 static Type GetArrayType(Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1666 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1667 Type arrayType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1668
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1669 lock (_arrayTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1670 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1671 if (!_arrayTypes.TryGetValue(elementType, out arrayType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1672 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1673 var helper = (IArrayHelper)Activator.CreateInstance(typeof(ArrayHelper<>).MakeGenericType(elementType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1674 _arrayTypes.Add(elementType, arrayType = helper.GetArrayType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1675 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1676 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1678 return arrayType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1679 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1680
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1681 static object ConvertIEnumerableToArray(object list, Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1682 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1683 Func<object,object> converter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1684
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1685 lock (_arrayConverters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1686 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1687 if (!_arrayConverters.TryGetValue(elementType, out converter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1688 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1689 var helper = (IArrayHelper)Activator.CreateInstance(typeof(ArrayHelper<>).MakeGenericType(elementType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1690 _arrayConverters.Add(elementType, converter = helper.ConvertToArray);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1691 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1692 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1693
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1694 return converter(list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1695 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1696
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1697 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1698 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1699 }