annotate Source/Data/Sql/SqlValueBase.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 namespace BLToolkit.Data.Sql
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public abstract class SqlValueBase: IValueContainer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 [CLSCompliant(false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 protected object _value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public virtual object Value
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 var valueConverter = ValueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 return valueConverter == null ? _value : valueConverter(_value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 set { _value = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 #region Value Converter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 internal List<Type> EnumTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 internal List<int> TakeValues;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 internal string LikeStart, LikeEnd;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 private Converter<object,object> _valueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public Converter<object,object> ValueConverter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 if (_valueConverter == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 if (EnumTypes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 foreach (var type in EnumTypes.ToArray())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 SetEnumConverter(type, Map.DefaultSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 else if (TakeValues != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 foreach (var take in TakeValues.ToArray())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 SetTakeConverter(take);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 else if (LikeStart != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 SetLikeConverter(LikeStart, LikeEnd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 return _valueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 set { _valueConverter = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 bool _isEnumConverterSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 internal void SetEnumConverter(Type type, MappingSchema ms)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 if (!_isEnumConverterSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 _isEnumConverterSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 if (EnumTypes == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 EnumTypes = new List<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 EnumTypes.Add(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 SetEnumConverterInternal(type, ms);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 internal void SetEnumConverter(MemberAccessor ma, MappingSchema ms)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 if (!_isEnumConverterSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 _isEnumConverterSet = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 if (EnumTypes == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 EnumTypes = new List<Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 EnumTypes.Add(ma.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 SetEnumConverterInternal(ma, ms);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 void SetEnumConverterInternal(MemberAccessor ma, MappingSchema ms)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 if (_valueConverter == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 _valueConverter = o => ms.MapEnumToValue(o, ma, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 var converter = _valueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 _valueConverter = o => ms.MapEnumToValue(converter(o), ma, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 // update system type in SqlValue :-/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 var tmp = Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 void SetEnumConverterInternal(Type type, MappingSchema ms)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 if (_valueConverter == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 _valueConverter = o => ms.MapEnumToValue(o, type, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 var converter = _valueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 _valueConverter = o => ms.MapEnumToValue(converter(o), type, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 // update system type in SqlValue :-/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 var tmp = Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 internal void SetTakeConverter(int take)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 if (TakeValues == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 TakeValues = new List<int>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 TakeValues.Add(take);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 SetTakeConverterInternal(take);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 void SetTakeConverterInternal(int take)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 var conv = _valueConverter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 if (conv == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 _valueConverter = v => v == null ? null : (object)((int)v + take);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 _valueConverter = v => v == null ? null : (object)((int)conv(v) + take);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 internal void SetLikeConverter(string start, string end)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 LikeStart = start;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 LikeEnd = end;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 _valueConverter = GetLikeEscaper(start, end);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 static Converter<object, object> GetLikeEscaper(string start, string end)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 return value =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 if (value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 value = "";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 throw new SqlException("NULL cannot be used as a LIKE predicate parameter.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 var text = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 if (text.IndexOfAny(new[] { '%', '_', '[' }) < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 return start + text + end;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var sb = new StringBuilder(start, text.Length + start.Length + end.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 foreach (var c in text)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 if (c == '%' || c == '_' || c == '[')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 sb.Append('[');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 sb.Append(c);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 sb.Append(']');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 sb.Append(c);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 return sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }