comparison Source/Data/Sql/SqlValueBase.cs @ 0:f990fcb411a9

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