annotate Source/DataAccess/DataAccessorBuilder.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.ComponentModel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using BLToolkit.Data.DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using BLToolkit.Properties;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 using BLToolkit.TypeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 using BLToolkit.TypeBuilder.Builders;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 namespace BLToolkit.DataAccess
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public class DataAccessorBuilder : AbstractTypeBuilderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 struct MapOutputParametersValue
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public readonly string ReturnValueMember;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public readonly ParameterInfo ParameterInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public MapOutputParametersValue(string returnValueMember, ParameterInfo parameterInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 ReturnValueMember = returnValueMember;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 ParameterInfo = parameterInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 public override int GetPriority(BuildContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 return TypeBuilderConsts.Priority.DataAccessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 if (context.IsBuildStep)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 if (context.IsAbstractMethod)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 // Give up if there is any builder that builds the method body.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 if (builders.Count > 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 foreach (IAbstractTypeBuilder builder in builders)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 if (builder != this && builder.IsApplied(context, builders))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 // Treat an abstract getter/setter as a regular method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 // when the property has [NoInstance] attribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (context.IsAbstractGetter || context.IsAbstractSetter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 return context.CurrentProperty.IsDefined(typeof(NoInstanceAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 private Dictionary<Type, Type> _actualTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 private Dictionary<Type, Type> ActualTypes
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 if (_actualTypes == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 _actualTypes = new Dictionary<Type, Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 object[] attrs = Context.Type.GetAttributes(typeof(ActualTypeAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 foreach (ActualTypeAttribute attr in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 if (!_actualTypes.ContainsKey(attr.BaseType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 _actualTypes.Add(attr.BaseType, attr.ActualType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 return _actualTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 enum ReturnType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 DataReader,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 DataSet,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 DataTable,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 List,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 Dictionary,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 Enumerable,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 Void,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 Scalar,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 Object
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 static ReturnType GetReturnType(Type returnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 if (returnType == typeof(IDataReader))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 return ReturnType.DataReader;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 if (returnType == typeof(DataSet) || returnType.IsSubclassOf(typeof(DataSet)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 return ReturnType.DataSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (returnType == typeof(DataTable) || returnType.IsSubclassOf(typeof(DataTable)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 return ReturnType.DataTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 if (!returnType.IsArray &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 (IsInterfaceOf(returnType, typeof(IList)) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IList<>)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 return ReturnType.List;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 if (IsInterfaceOf(returnType, typeof(IDictionary)) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 return ReturnType.Dictionary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 if (returnType == typeof(IEnumerable) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 return ReturnType.Enumerable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 if (returnType == typeof(void))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 return ReturnType.Void;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 if (TypeHelper.IsScalar(returnType.IsByRef ? returnType.GetElementType() : returnType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 return ReturnType.Scalar;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 return ReturnType.Object;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 void ThrowTypeBuilderException(string message)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 throw new TypeBuilderException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 string.Format(message, Context.CurrentMethod.DeclaringType.Name, Context.CurrentMethod.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 const BindingFlags _bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 readonly Type _baseType = typeof(DataAccessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 Type _objectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 bool _explicitObjectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 ParameterInfo[] _parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 ArrayList _paramList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 ArrayList _refParamList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 bool _createManager;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 LocalBuilder _locManager;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 LocalBuilder _locObjType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 ArrayList _outputParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 SqlQueryAttribute _sqlQueryAttribute;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 ArrayList _formatParamList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 ParameterInfo _destination;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 ArrayList _mapOutputParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 protected override void BuildAbstractMethod()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 // Any class variable must be initialized before use
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 // as the same instance of the class is utilized to build abstract methods.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 _paramList = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 _refParamList = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 _formatParamList = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 _mapOutputParameters = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 _destination = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 _createManager = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 _objectType = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 _explicitObjectType = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 _parameters = Context.CurrentMethod.GetParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 _locManager = Context.MethodBuilder.Emitter.DeclareLocal(typeof(DbManager));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 _locObjType = Context.MethodBuilder.Emitter.DeclareLocal(typeof(Type));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 _outputParameters = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 _sqlQueryAttribute = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 GetSqlQueryAttribute();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 ProcessParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 var returnType = MethodReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 var rt = GetReturnType(returnType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 CreateDbManager(rt != ReturnType.Enumerable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 SetObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 // Define execution method type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 switch (rt)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 case ReturnType.DataReader : ExecuteReader(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 case ReturnType.DataSet : ExecuteDataSet(returnType); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 case ReturnType.DataTable : ExecuteDataTable(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 case ReturnType.Void : ExecuteNonQuery(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 case ReturnType.Scalar : ExecuteScalar(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 case ReturnType.Enumerable : ExecuteEnumerable(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 case ReturnType.List:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 if (!_explicitObjectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 Type elementType = TypeHelper.GetListItemType(returnType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 if (elementType == typeof(object) && _destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 elementType = TypeHelper.GetListItemType(Context.CurrentMethod.ReturnType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 if (elementType != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 if (ActualTypes.ContainsKey(_objectType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 _objectType = ActualTypes[_objectType];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 if (_objectType == null || _objectType == typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 if (TypeHelper.IsScalar(_objectType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 ExecuteScalarList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 ExecuteList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 case ReturnType.Dictionary:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 Type elementType = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 Type keyType = typeof(object);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 Type[] gTypes = TypeHelper.GetGenericArguments(returnType, typeof(IDictionary));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 if ((gTypes == null || gTypes.Length != 2) && _destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 gTypes = TypeHelper.GetGenericArguments(_destination.ParameterType, typeof(IDictionary));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 if (gTypes != null && gTypes.Length == 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 keyType = gTypes[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 elementType = gTypes[1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 if (elementType == null || _explicitObjectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 elementType = _objectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 if (elementType == null || elementType == typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 bool isIndex = TypeHelper.IsSameOrParent(typeof(CompoundValue), keyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 if (keyType != typeof(object) && !isIndex && !TypeHelper.IsScalar(keyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 ThrowTypeBuilderException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 Resources.DataAccessorBuilder_BadKeyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 MethodInfo mi = Context.CurrentMethod;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 object[] attrs = mi.GetCustomAttributes(typeof(IndexAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 NameOrIndexParameter[] fields = new NameOrIndexParameter[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 fields = ((IndexAttribute)attrs[0]).Fields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 if (fields.Length > 1 && keyType != typeof(object) && !isIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 ThrowTypeBuilderException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 Resources.DataAccessor_InvalidKeyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 if (TypeHelper.IsScalar(elementType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 attrs = mi.GetCustomAttributes(typeof(ScalarFieldNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 ThrowTypeBuilderException(Resources.DataAccessorBuilder_ScalarFieldNameMissing);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 NameOrIndexParameter scalarField = ((ScalarFieldNameAttribute)attrs[0]).NameOrIndex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 if (fields.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 ExecuteScalarDictionaryWithPK(keyType, scalarField, elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 else if (isIndex || fields.Length > 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 ExecuteScalarDictionaryWithMapIndex(fields, scalarField, elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 ExecuteScalarDictionaryWithScalarKey(fields[0], keyType, scalarField, elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 if (!_explicitObjectType && ActualTypes.ContainsKey(elementType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 elementType = ActualTypes[elementType];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 if (fields.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 ExecuteDictionaryWithPK(keyType, elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 else if (isIndex || fields.Length > 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 ExecuteDictionaryWithMapIndex(fields, elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 ExecuteDictionaryWithScalarKey(fields[0], elementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 if (_objectType == null || !TypeHelper.IsSameOrParent(returnType, _objectType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 _objectType = returnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 if (!_explicitObjectType && ActualTypes.ContainsKey(_objectType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 _objectType = ActualTypes[_objectType];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 ExecuteObject();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 GetOutRefParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 if (rt != ReturnType.Enumerable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 Finally();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 protected override void BuildAbstractGetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 BuildAbstractMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 protected override void BuildAbstractSetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 BuildAbstractMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 void GetSqlQueryAttribute()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(SqlQueryAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 _sqlQueryAttribute = (SqlQueryAttribute)attrs[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 void AddParameter(ParameterInfo pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 Type pType = pi.ParameterType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 if (pType.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 pType = pType.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 if (TypeHelper.IsScalar(pType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 #if FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 || pi.IsRefCursor()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 _paramList.Add(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 else if (pType == typeof(DbManager) || pType.IsSubclassOf(typeof(DbManager)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 _createManager = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 _refParamList.Add(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 void ProcessParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 for (int i = 0; i < _parameters.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 ParameterInfo pi = _parameters[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 NoMapAttribute[] attrs = (NoMapAttribute[])pi.GetCustomAttributes(typeof(NoMapAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 AddParameter(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 for (int j = 0; j < attrs.Length; ++j)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 if (!attrs[j].NoMap)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 AddParameter(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 if (attrs[j] is FormatAttribute)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 int index = ((FormatAttribute)attrs[j]).Index;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 if (index < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 index = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 else if (index > _formatParamList.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 index = _formatParamList.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 _formatParamList.Insert(index, pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 else if (attrs[j] is DestinationAttribute)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 throw new TypeBuilderException(Resources.DataAccessorBuilderTooManyDestinations);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 _destination = pi;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 void CreateDbManager(bool beginException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 if (_createManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 .callvirt(_baseType, "GetDbManager")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 .stloc(_locManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 if (beginException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 emit.BeginExceptionBlock();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 for (int i = 0; i < _parameters.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 Type pType = _parameters[i].ParameterType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 if (pType == typeof(DbManager) || pType.IsSubclassOf(typeof(DbManager)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 .ldarg(_parameters[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 .stloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 void SetObjectType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 var mi = Context.CurrentMethod;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 var attrs = mi.GetCustomAttributes(typeof(ObjectTypeAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 attrs = mi.DeclaringType.GetCustomAttributes(typeof(ObjectTypeAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 _explicitObjectType = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 _objectType = ((ObjectTypeAttribute)attrs[0]).ObjectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 if (_objectType == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 var types = TypeHelper.GetGenericArguments(mi.DeclaringType, typeof(DataAccessor));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 if (types != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 _objectType = types[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 #region ExecuteReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 void ExecuteReader()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 var attrs = Context.CurrentMethod.GetCustomAttributes(typeof(CommandBehaviorAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 .callvirt(typeof(DbManager).GetMethod("ExecuteReader", Type.EmptyTypes))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 .ldc_i4_((int)((CommandBehaviorAttribute)attrs[0]).CommandBehavior)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 .callvirt(typeof(DbManager), "ExecuteReader", typeof(CommandBehavior))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 #region ExecuteDataSet
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 void ExecuteDataSet(Type returnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 var emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 if (returnType == typeof(DataSet))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 .callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 .ldNameOrIndex(((DataSetTableAttribute)attrs[0]).NameOrIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 .callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet), typeof(NameOrIndexParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 Label l1 = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 Label l2 = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 .callvirt(typeof(DataSet).GetProperty("Tables").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 .callvirt(typeof(InternalDataCollectionBase).GetProperty("Count").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 .ldc_i4_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 .ble_s(l1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 .ldloc(_locManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 .callvirt(typeof(DataSet).GetProperty("Tables").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 .ldc_i4_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 .callvirt(typeof(DataTableCollection), "get_Item", typeof(int))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 .callvirt(typeof(DataTable).GetProperty("TableName").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 .call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 .ldNameOrIndex(((DataSetTableAttribute)attrs[0]).NameOrIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 .callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet), typeof(NameOrIndexParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 .br_s(l2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 .MarkLabel(l1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 .ldloc(_locManager);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 .callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 .MarkLabel(l2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 #region ExecuteDataTable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 void ExecuteDataTable()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 .callvirt(typeof(DbManager), "ExecuteDataTable", typeof(DataTable))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 // When DataSetTableAttribute is present, simply set table name to the name specified.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 DataSetTableAttribute attr = (DataSetTableAttribute)attrs[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 if (!attr.NameOrIndex.ByName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 Resources.DataAccessorBuilder_DataSetTableMustBeByName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 Context.CurrentMethod.DeclaringType.Name, Context.CurrentMethod.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 .ldstr(attr.NameOrIndex.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 .callvirt(typeof(DataTable), "set_TableName", typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 #region ExecuteScalarList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 void ExecuteScalarList()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ScalarFieldNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 .callvirt(typeof(DbManager), "ExecuteScalarList", typeof(IList), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 .ldNameOrIndex(((ScalarFieldNameAttribute)attrs[0]).NameOrIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 .callvirt(typeof(DbManager), "ExecuteScalarList", typeof(IList), typeof(Type), typeof(NameOrIndexParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 void ExecuteList()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 .CastIfNecessary(typeof(IList), MethodReturnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 .callvirt(typeof(DbManager), "ExecuteList", typeof(IList), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 .end()
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 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 #region ExecuteDictionary
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 public FieldBuilder GetIndexField(NameOrIndexParameter[] namesOrIndexes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 var id = "index$" + string.Join("%",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666 Array.ConvertAll<NameOrIndexParameter, string>(namesOrIndexes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 delegate(NameOrIndexParameter nameOrIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 return nameOrIndex.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 var fieldBuilder = Context.GetField(id);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 if (fieldBuilder == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 fieldBuilder = Context.CreatePrivateStaticField(id, typeof(MapIndex));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681 .ldc_i4_(namesOrIndexes.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 .newarr(typeof(NameOrIndexParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 for (int i = 0; i < namesOrIndexes.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 .ldelema(typeof(NameOrIndexParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 if (namesOrIndexes[i].ByName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 .ldstr(namesOrIndexes[i].Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 .call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 .ldc_i4_(namesOrIndexes[i].Index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 .call(typeof(NameOrIndexParameter), "op_Implicit", typeof(int));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 .stobj(typeof(NameOrIndexParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 .newobj(typeof(MapIndex), typeof(NameOrIndexParameter[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 .stsfld(fieldBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717 return fieldBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 /// Maps primary keys(s) to a scalar field.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723 void ExecuteScalarDictionaryWithPK(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 Type keyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725 NameOrIndexParameter scalarField,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742 .LoadType(keyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 .ldstr(Context.CurrentMethod.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 .ldNameOrIndex(scalarField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745 .LoadType(elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 .callvirt(_baseType, "ExecuteScalarDictionary", _bindingFlags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747 typeof(DbManager), typeof(IDictionary), typeof(Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748 typeof(Type), typeof(string), typeof(NameOrIndexParameter), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 /// Maps a complex index to a scalar field.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 void ExecuteScalarDictionaryWithMapIndex(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 NameOrIndexParameter[] index,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 NameOrIndexParameter scalarField,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 .ldsfld(GetIndexField(index))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 .ldNameOrIndex(scalarField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 .callvirt(typeof(DbManager), "ExecuteScalarDictionary",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773 typeof(IDictionary), typeof(MapIndex),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 typeof(NameOrIndexParameter), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 /// Maps any single field to any (other) single field.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783 void ExecuteScalarDictionaryWithScalarKey(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 NameOrIndexParameter keyField, Type keyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785 NameOrIndexParameter scalarField, Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 .ldNameOrIndex(keyField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797 .LoadType(keyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798 .ldNameOrIndex(scalarField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 .callvirt(typeof(DbManager), "ExecuteScalarDictionary",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801 typeof(IDictionary), typeof(NameOrIndexParameter), typeof(Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 typeof(NameOrIndexParameter), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809 /// Maps primary keys(s) to an object of the specified type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 void ExecuteDictionaryWithPK(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812 Type keyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831 if (IsGenericDestinationOrReturnValue())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 Type[] genericArgs = Context.ReturnValue.LocalType.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834 Type[] types = new Type[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836 typeof(DbManager),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837 typeof(IDictionary<,>).MakeGenericType(genericArgs),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838 typeof(Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 typeof(string),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841 MethodInfo method = _baseType.GetMethod("ExecuteDictionary",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842 _bindingFlags, GenericBinder.Generic, types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844 if (TypeHelper.IsSameOrParent(typeof(CompoundValue), genericArgs[0]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 method = method.MakeGenericMethod(genericArgs[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847 method = method.MakeGenericMethod(genericArgs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851 .ldstr(Context.CurrentMethod.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852 .callvirt(method)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859 .LoadType(keyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860 .ldstr(Context.CurrentMethod.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 .callvirt(_baseType, "ExecuteDictionary", _bindingFlags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862 typeof(DbManager), typeof(IDictionary), typeof(Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863 typeof(Type), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868 /// Maps a complex index to an object of the specified type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870 void ExecuteDictionaryWithMapIndex(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871 NameOrIndexParameter[] index,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883 .ldsfld(GetIndexField(index))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886 .callvirt(typeof(DbManager), "ExecuteDictionary",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887 typeof(IDictionary), typeof(MapIndex), typeof(Type), typeof(object[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 /// Maps any single field to object type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 void ExecuteDictionaryWithScalarKey(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897 NameOrIndexParameter keyField,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898 Type elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902 _objectType = elementType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904 CreateReturnTypeInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 LoadDestinationOrReturnValue();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910 if (IsGenericDestinationOrReturnValue())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 Type[] genericArgs = Context.ReturnValue.LocalType.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913 Type[] types = new Type[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915 typeof(IDictionary<,>).MakeGenericType(genericArgs),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916 typeof(NameOrIndexParameter),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917 typeof(Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918 typeof(object[]),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920 MethodInfo method = typeof(DbManager).GetMethod("ExecuteDictionary", _bindingFlags, GenericBinder.Generic, types, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921 .MakeGenericMethod(genericArgs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924 .ldNameOrIndex(keyField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927 .callvirt(method)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935 .ldNameOrIndex(keyField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938 .callvirt(typeof(DbManager), "ExecuteDictionary", typeof(IDictionary), typeof(NameOrIndexParameter), typeof(Type), typeof(object[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947 #region ExecuteEnumerable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949 public void ExecuteEnumerable()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 Type returnType = Context.CurrentMethod.ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954 if (_objectType == null && returnType.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 _objectType = returnType.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957 if (_objectType == null || _objectType == typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958 ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 Type returnObjectType = returnType.IsGenericType ? returnType.GetGenericArguments()[0] : _objectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 Type[] genericArgs = new Type[] { returnObjectType };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973 Type[] types = new Type[] { typeof(DbManager), typeof(Type), typeof(bool), };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974 MethodInfo method = _baseType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975 .GetMethod("ExecuteEnumerable", _bindingFlags, GenericBinder.Generic, types, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976 .MakeGenericMethod(genericArgs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979 .LoadType(_objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980 .ldc_i4_1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981 .callvirt(method)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988 #region ExecuteNonQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990 public void ExecuteNonQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993 throw new TypeBuilderException(Resources.DataAccessorBuilder_CantExecuteNonQueryToDestination);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999 MethodInfo mi = typeof(DbManager).GetMethod("ExecuteNonQuery", Type.EmptyTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000 LocalBuilder locExec = Context.MethodBuilder.Emitter.DeclareLocal(mi.ReturnType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003 .callvirt(mi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004 .stloc(locExec)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007 if (Context.ReturnValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010 .ldloc(locExec)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018 #region ExecuteScalar
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 public void ExecuteScalar()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023 Type returnType = Context.CurrentMethod.ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 Type scalarType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028 if (_destination.ParameterType.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029 scalarType = _destination.ParameterType.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031 throw new TypeBuilderException(Resources.DataAccessorBuilder_ScalarDestinationIsNotByRef);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033 if (returnType != typeof(void) && !TypeHelper.IsSameOrParent(returnType, scalarType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035 // object Foo(out int num) is valid,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 // IConvertible Foo(ref int num) is also ok,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037 // but string Bar(out DateTime dt) is not
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 Resources.DataAccessorBuilder_IncompatibleDestinationType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041 returnType.FullName, Context.CurrentMethod.Name, scalarType.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045 scalarType = returnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049 .ldarg(_destination)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ScalarSourceAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066 .callvirtNoGenerics(typeof(DbManager), "ExecuteScalar")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071 ScalarSourceAttribute attr = (ScalarSourceAttribute)attrs[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 .ldc_i4_((int)attr.ScalarType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075 .ldNameOrIndex(attr.NameOrIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 .callvirtNoGenerics(typeof(DbManager), "ExecuteScalar", typeof(ScalarSourceType), typeof(NameOrIndexParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 MethodInfo converter = GetConverterMethod(scalarType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 if (converter == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 .LoadType(scalarType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 .callvirt(_baseType, "ConvertChangeType", _bindingFlags, typeof(DbManager), typeof(object), typeof(Type), typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087 .unboxIfValueType(scalarType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 .callvirt(converter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 .stind(scalarType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105 // The return value and a destination both are present
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 if (Context.ReturnValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110 .ldargEx(_destination, false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113 if (scalarType != returnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115 .boxIfValueType(scalarType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116 .CastFromObject(returnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119 emit.stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1121 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1123 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1124 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1125 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1126 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1129 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1131 #region ExecuteObject
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1133 public void ExecuteObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1135 InitObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1136 GetSprocNameOrSqlQueryTest();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1137 CallSetCommand();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1139 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1141 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1143 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1144 .ldarg(_destination)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1145 .callvirt(typeof(DbManager), "ExecuteObject", typeof(Object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1146 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1148 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1150 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1151 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1152 .callvirt(typeof(DbManager), "ExecuteObject", typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1153 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1154 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1156 if (null != Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1157 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1158 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1159 .castclass(_objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1160 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1161 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1163 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1165 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1166 .pop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1167 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1168 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1169 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1170 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1172 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1174 void Finally()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1175 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1176 if (_createManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1177 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1178 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1179 .BeginFinallyBlock()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1180 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1181 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1182 .callvirt(_baseType, "Dispose", _bindingFlags, typeof(DbManager))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1183 .EndExceptionBlock()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1184 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1186 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1188 void CreateReturnTypeInstance()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1189 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1190 if (null == Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1191 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1193 if (null != _destination)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1195 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1196 .ldarg(_destination)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1197 .CastIfNecessary(Context.ReturnValue.LocalType, _destination.ParameterType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1198 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1199 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1201 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1202 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1203 Type returnType = Context.CurrentMethod.ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1205 if (returnType.IsInterface)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1206 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1207 if (IsInterfaceOf(returnType, typeof(IList)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1208 returnType = typeof(ArrayList);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1209 else if (IsInterfaceOf(returnType, typeof(IDictionary)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1210 returnType = typeof(Hashtable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1211 else if (returnType.GetGenericTypeDefinition() == typeof(IList<>))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1212 returnType = typeof(List<>).MakeGenericType(returnType.GetGenericArguments());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1213 else if (returnType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1214 returnType = typeof(Dictionary<,>).MakeGenericType(returnType.GetGenericArguments());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1215 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1217 ConstructorInfo ci = TypeHelper.GetDefaultConstructor(returnType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1219 if (ci == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1220 throw new TypeBuilderException(string.Format(Resources.DataAccessorBuilder_CantCreateTypeInstance,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1221 Context.CurrentMethod.ReturnType.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1223 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1224 .newobj(ci)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1225 .stloc(Context.ReturnValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1226 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1227 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1228 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1230 Type MethodReturnType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1231 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1232 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1233 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1234 return _destination != null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1235 _destination.ParameterType :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1236 Context.CurrentMethod.ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1238 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1240 void LoadDestinationOrReturnValue()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1241 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1242 if (_destination != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1243 Context.MethodBuilder.Emitter.ldarg(_destination);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1244 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1245 Context.MethodBuilder.Emitter.ldloc(Context.ReturnValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1246 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1248 bool IsGenericDestinationOrReturnValue()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1249 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1250 return _destination == null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1251 Context.ReturnValue.LocalType.IsGenericType :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1252 _destination.ParameterType.IsGenericType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1255 void InitObjectType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1256 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1257 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1258 .LoadType(_objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1259 .stloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1260 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1263 static int _nameCounter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1264 static int _uniqueQueryID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1266 void GetSprocNameOrSqlQueryTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1267 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1268 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1270 if (_sqlQueryAttribute != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1272 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1273 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1274 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1276 if (_sqlQueryAttribute.ID != int.MinValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1278 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1279 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1280 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1281 .ldc_i4_(_sqlQueryAttribute.ID)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1282 .ldc_i4_(++_uniqueQueryID)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1283 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1284 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1286 if (_sqlQueryAttribute.IsDynamic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1287 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1288 Type attrType = typeof(SqlQueryAttribute);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1289 FieldBuilder field = Context.CreatePrivateStaticField(attrType + "$" + ++_nameCounter, attrType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1290 Label isNull = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1292 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1293 .ldsfld(field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1294 .brtrue_s(isNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1296 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1297 .call(typeof(MethodBase), "GetCurrentMethod")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1298 .castclass(typeof(MethodInfo))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1299 .callvirt(_baseType, "GetSqlQueryAttribute", _bindingFlags, typeof(MethodInfo))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1301 .stsfld(field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1302 .MarkLabel(isNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1304 .ldsfld(field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1305 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1306 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1307 .callvirt(attrType, "GetSqlText", _bindingFlags, typeof(DataAccessor), typeof(DbManager))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1308 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1310 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1311 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1312 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1313 .ldstr(_sqlQueryAttribute.SqlText)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1314 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1315 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1316
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1317 if (_sqlQueryAttribute.ID != int.MinValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1318 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1319 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1320 .callvirt(_baseType, "PrepareSqlQuery", _bindingFlags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1321 typeof(DbManager), typeof(int), typeof(int), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1322 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1324 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1325 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1326 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1327 object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(SprocNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1329 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1330 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1331 attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ActionNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1333 string actionName = attrs.Length == 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1334 Context.CurrentMethod.Name : ((ActionNameAttribute)attrs[0]).Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1336 // Call GetSpName.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1337 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1338 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1339 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1340 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1341 .ldloc(_locObjType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1342 .ldstr(actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1343 .callvirt(_baseType, "GetSpName", _bindingFlags, typeof(Type), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1344 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1345 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1346 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1347 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1348 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1349 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1350 .ldstr(((SprocNameAttribute)attrs[0]).Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1351 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1352 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1353 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1355 // string.Format
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1356 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1357 if (_formatParamList.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1358 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1359 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1360 .ldc_i4_(_formatParamList.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1361 .newarr(typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1362 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1364 for (int i = 0; i < _formatParamList.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1366 ParameterInfo pi = (ParameterInfo)_formatParamList[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1368 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1369 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1370 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1371 .ldarg(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1372 .boxIfValueType(pi.ParameterType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1373 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1374 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1375 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1376 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1377
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1378 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1379 .call(typeof(string), "Format", typeof(string), typeof(object[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1380 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1381 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1384 void CallSetCommand()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1385 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1386 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1388 // Get DiscoverParametersAttribute.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1389 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1390 object[] attrs =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1391 Context.CurrentMethod.DeclaringType.GetCustomAttributes(typeof(DiscoverParametersAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1392
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1393 bool discoverParams = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1395 if (_sqlQueryAttribute == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1396 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1397 discoverParams = attrs.Length == 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1398 false : ((DiscoverParametersAttribute)attrs[0]).Discover;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1399
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1400 attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DiscoverParametersAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1402 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1403 discoverParams = ((DiscoverParametersAttribute)attrs[0]).Discover;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1404 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1405
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1406 LocalBuilder locParams = discoverParams ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1407 BuildParametersWithDiscoverParameters() :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1408 BuildParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1410 // Call SetSpCommand.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1411 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1412 string methodName = _sqlQueryAttribute == null ? "SetSpCommand" : "SetCommand";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1413 Type paramType = _sqlQueryAttribute == null ? typeof(object[]) : typeof(IDbDataParameter[]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1415 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1416 .ldloc(locParams)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1417 .callvirt(typeof(DbManager), methodName, _bindingFlags, typeof(string), paramType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1418 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1421 LocalBuilder BuildParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1422 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1423 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1425 LocalBuilder retParams = emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1426 .DeclareLocal(typeof(IDbDataParameter[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1427
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1428 LocalBuilder locParams = _refParamList.Count > 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1429 BuildRefParameters() :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1430 BuildSimpleParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1432 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1433 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1434 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1435 .ldloc(locParams)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1436 .callvirt(_baseType, "PrepareParameters", _bindingFlags, typeof(DbManager), typeof(object[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1437 .stloc(retParams)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1438 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1439
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1440 return retParams;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1441 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1443 LocalBuilder BuildSimpleParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1444 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1445 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1446
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1447 // Parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1448 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1449 LocalBuilder locParams = emit.DeclareLocal(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1450 _sqlQueryAttribute == null ? typeof(object[]) : typeof(IDbDataParameter[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1452 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1453 .ldc_i4_(_paramList.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1454 .newarr(_sqlQueryAttribute == null ? typeof(object) : typeof(IDbDataParameter))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1455 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1457 for (int i = 0; i < _paramList.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1458 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1459 ParameterInfo pi = (ParameterInfo)_paramList[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1461 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1462 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1463 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1464 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1465
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1466 BuildParameter(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1468 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1469 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1470 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1471 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1472 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1473
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1474 emit.stloc(locParams);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1475 return locParams;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1476 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1477
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1478 FieldBuilder CreateStringArrayField(object[] attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1479 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1480 if (attrs.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1481 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1483 List<string> list = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1484
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1485 foreach (Direction attr in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1486 if (attr.Members != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1487 list.AddRange(attr.Members);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1488
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1489 if (list.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1490 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1491
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1492 list.Sort(string.CompareOrdinal);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1493
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1494 string[] strings = list.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1496 // There a no limit for a field name length, but Visual Studio Debugger
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1497 // may crash on fields with name longer then 256 symbols.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1498 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1499 string key = "_string_array$" + string.Join("%", strings);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1500 FieldBuilder fieldBuilder = Context.GetField(key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1501
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1502 if (null == fieldBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1503 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1504 fieldBuilder = Context.CreatePrivateStaticField(key, typeof(string[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1505
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1506 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1507
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1508 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1509 .ldc_i4_(strings.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1510 .newarr(typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1511 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1513 for (int i = 0; i < strings.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1515 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1516 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1517 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1518 .ldstr(strings[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1519 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1520 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1521 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1522 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1523
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1524 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1525 .stsfld(fieldBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1526 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1527 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1528
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1529 return fieldBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1530 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1531
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1532 FieldBuilder CreateNullValueField(Type type, string value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1533 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1534 string key = "_null_value$" + type.FullName + "%" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1535 FieldBuilder fieldBuilder = Context.GetField(key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1536
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1537 if (null == fieldBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1538 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1539 fieldBuilder = Context.CreatePrivateStaticField(key, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1540
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1541 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1542
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1543 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1544 .LoadType(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1545 .call(typeof(TypeDescriptor), "GetConverter", typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1546 .ldstr(value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1547 .callvirt(typeof(TypeConverter), "ConvertFromInvariantString", typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1548 .unbox_any(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1549 .stsfld(fieldBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1550 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1551 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1553 return fieldBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1554 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1556 LocalBuilder BuildRefParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1557 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1558 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1559
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1560 // Parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1561 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1562 LocalBuilder locParams = emit.DeclareLocal(typeof(object[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1563
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1564 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1565 .ldc_i4_(_parameters.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1566 .newarr(typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1567 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1569 for (int i = 0; i < _parameters.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1570 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1571 ParameterInfo pi = _parameters[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1572
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1573 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1574 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1575 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1576 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1577
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1578 if (_paramList.Contains(pi))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1579 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1580 BuildParameter(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1581 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1582 else if (_refParamList.Contains(pi))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1583 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1584 var mapOutputParameters = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1585 string returnValueMember = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1586 FieldBuilder fieldBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1587 var type =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1588 pi.ParameterType == typeof(DataRow) || pi.ParameterType.IsSubclassOf(typeof(DataRow)) ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1589 typeof(DataRow) : typeof(object);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1590
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1591 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1592 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1593 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1594 .ldarg(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1595 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1597 fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.OutputAttribute), true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1598
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1599 if (fieldBuilder != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1600 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1601 emit.ldsfld(fieldBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1602 mapOutputParameters = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1603 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1604 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1605 emit.ldnull.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1606
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1607 fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.InputOutputAttribute), true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1608
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1609 if (fieldBuilder != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1610 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1611 emit.ldsfld(fieldBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1612 mapOutputParameters = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1613 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1614 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1615 emit.ldnull.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1617 fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.IgnoreAttribute), true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1619 if (fieldBuilder != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1620 emit.ldsfld(fieldBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1621 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1622 emit.ldnull.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1623
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1624 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1625 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1626 .callvirt(_baseType, "CreateParameters", _bindingFlags,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1627 typeof(DbManager), type, typeof(string[]), typeof(string[]), typeof(string[]), typeof(IDbDataParameter[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1628 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1630 object[] attrs = pi.GetCustomAttributes(typeof(Direction.ReturnValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1631
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1632 if (attrs.Length != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1633 returnValueMember = ((Direction.ReturnValueAttribute)attrs[0]).Member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1634
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1635 if (null != returnValueMember || mapOutputParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1636 _mapOutputParameters.Add(new MapOutputParametersValue(returnValueMember, pi));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1637 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1638 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1639 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1640 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1641 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1642 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1643 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1644 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1646 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1647 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1648 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1649 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1650 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1651
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1652 emit.stloc(locParams);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1653 return locParams;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1654 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1655
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1656 void LoadParameterOrNull(ParameterInfo pi, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1657 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1658 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1659 object[] attrs = pi.GetCustomAttributes(typeof(ParamNullValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1660
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1661 object nullValue = attrs.Length == 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1662 null : ((ParamNullValueAttribute)attrs[0]).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1663
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1664 Label labelNull = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1665 Label labelEndIf = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1667 if (pi.Attributes == ParameterAttributes.Out)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1668 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1669 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1670 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1671 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1672 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1674 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1675 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1676
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1677 if (nullValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1678 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1679 Type nullValueType = type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1680 bool isNullable = TypeHelper.IsNullable(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1682 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1683 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1684 nullValueType = Enum.GetUnderlyingType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1685 nullValue = System.Convert.ChangeType(nullValue, nullValueType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1686 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1687 else if (isNullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1688 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1689 nullValueType = type.GetGenericArguments()[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1690
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1691 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1692 .ldarga(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1693 .call(type, "get_HasValue")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1694 .brfalse(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1695 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1696 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1697
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1698 if (nullValueType == nullValue.GetType() && emit.LoadWellKnownValue(nullValue))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1699 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1700 if (nullValueType == typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1701 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1702 .ldargEx(pi, false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1703 .call(nullValueType, "Equals", nullValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1704 .brtrue(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1705 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1706 else if (isNullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1707 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1708 .ldarga(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1709 .call(type, "get_Value")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1710 .beq(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1711 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1712 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1713 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1714 .ldargEx(pi, false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1715 .beq(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1716 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1717 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1718 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1719 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1720 string nullString = TypeDescriptor.GetConverter(nullValue).ConvertToInvariantString(nullValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1721 FieldBuilder staticField = CreateNullValueField(nullValueType, nullString);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1722 MethodInfo miEquals = new TypeHelper(nullValueType).GetPublicMethod("Equals", nullValueType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1723
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1724 if (miEquals == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1725 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1726 // Is it possible?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1727 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1728 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1729 Resources.DataAccessorBuilder_EqualsMethodIsNotPublic, type.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1730 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1731
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1732 if (isNullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1733 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1734 .ldsflda(staticField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1735 .ldarga(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1736 .call(pi.ParameterType, "get_Value")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1737 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1738 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1739 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1740 .ldsflda(staticField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1741 .ldarg(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1742 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1743
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1744 if (miEquals.GetParameters()[0].ParameterType.IsClass)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1745 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1746 .boxIfValueType(nullValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1747 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1748
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1749 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1750 .call(miEquals)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1751 .brtrue(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1752 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1753 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1754 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1755
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1756 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1757 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1758 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1759 .callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1760 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1761
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1762 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1763 .ldargEx(pi, true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1764 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1765
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1766 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1767 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1768 .ldc_i4_1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1769 .callvirt(typeof(MappingSchema), "MapEnumToValue", typeof(object), typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1770 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1771
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1772 if (nullValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1773 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1774 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1775 .br(labelEndIf)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1776 .MarkLabel(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1777 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1778 .MarkLabel(labelEndIf)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1779 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1780 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1781 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1782
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1783 void BuildParameter(ParameterInfo pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1784 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1785 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1786 Type type = pi.ParameterType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1787 object[] attrs = pi.GetCustomAttributes(typeof(ParamNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1788 string paramName = attrs.Length == 0 ? pi.Name : ((ParamNameAttribute)attrs[0]).Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1789
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1790 ParameterDirection direction = !type.IsByRef ? ParameterDirection.Input :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1791 pi.IsOut ? ParameterDirection.Output : ParameterDirection.InputOutput;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1792
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1793 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1794 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1795 .ldc_i4_((int)direction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1796 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1797
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1798 if (paramName[0] != '@')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1799 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1800 string methodName = _sqlQueryAttribute == null ? "GetSpParameterName" : "GetQueryParameterName";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1801 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1802 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1803 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1804 .ldstr(paramName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1805 .callvirt(_baseType, methodName, _bindingFlags, typeof(DbManager), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1806 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1807 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1808 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1809 emit.ldstr(paramName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1810
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1811 if (type.IsByRef)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1812 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1813 if (_outputParameters == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1814 _outputParameters = new ArrayList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1815
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1816 _outputParameters.Add(pi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1817
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1818 type = type.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1819 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1820
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1821 LoadParameterOrNull(pi, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1822
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1823 // Special case for user-defined types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1824 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1825 attrs = pi.GetCustomAttributes(typeof(ParamTypeNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1826 if (attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1827 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1828 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1829 .ldstr(((ParamTypeNameAttribute)attrs[0]).TypeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1830 .callvirt(typeof(DbManager), "Parameter",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1831 typeof(ParameterDirection), typeof(string), typeof(object), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1832 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1833 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1834 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1835 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1836 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1837 .callvirt(typeof(DbManager), "Parameter",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1838 typeof(ParameterDirection), typeof(string), typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1839 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1840 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1841
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1842 // Check if parameter type/size is specified.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1843 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1844 attrs = pi.GetCustomAttributes(typeof(ParamDbTypeAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1845 if (attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1846 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1847 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1848 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1849 .ldc_i4_((int)((ParamDbTypeAttribute)attrs[0]).DbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1850 .callvirt(typeof(IDataParameter), "set_DbType", typeof(DbType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1851 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1852 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1853
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1854 attrs = pi.GetCustomAttributes(typeof(ParamSizeAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1855 if (attrs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1856 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1857 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1858 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1859 .ldc_i4_(((ParamSizeAttribute)attrs[0]).Size)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1860 .callvirt(typeof(IDbDataParameter), "set_Size", typeof(int))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1861 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1862 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1863 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1864
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1865 LocalBuilder BuildParametersWithDiscoverParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1866 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1867 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1868 LocalBuilder locParams = emit.DeclareLocal(typeof(object[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1869
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1870 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1871 .ldc_i4_(_paramList.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1872 .newarr(typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1873 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1874
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1875 for (int i = 0; i < _paramList.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1876 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1877 ParameterInfo pi = (ParameterInfo)_paramList[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1878
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1879 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1880 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1881 .ldc_i4_(i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1882 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1883
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1884 LoadParameterOrNull(pi, pi.ParameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1885
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1886 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1887 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1888 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1889 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1890 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1891
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1892 emit.stloc(locParams);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1893 return locParams;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1894 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1895
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1896 void StoreParameterValue(LocalBuilder param, ParameterInfo pi, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1897 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1898 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1899 Label labelNull = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1900 Label labelEndIf = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1901
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1902 object[] attrs = pi.GetCustomAttributes(typeof(ParamNullValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1903 object nullValue = attrs.Length == 0 ? null : ((ParamNullValueAttribute)attrs[0]).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1904
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1905 if (nullValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1906 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1907 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1908 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1909 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1910 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1911 .callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1912 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1913 .callvirt(_baseType, "IsNull", _bindingFlags, typeof(DbManager), typeof(object), typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1914 .brtrue(labelNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1915 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1916 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1917
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1918 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1919 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1920 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1921 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1922 .callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1923 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1924 .callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1925 .LoadType(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1926 .callvirt(typeof(MappingSchema), "MapValueToEnum", typeof(object), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1927 .CastFromObject(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1928 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1929 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1930 #if FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1931 else if (pi.IsRefCursor())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1932 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1933 // Make sure the parameter is a List
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1934 if (!type.GetInterfaces().Contains(typeof(IList)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1935 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1936 throw new Exception("The argument '" + pi.Name + "' must be of type 'IList'");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1937 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1938 //Get the generic type of the list
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1939 Type genericType = type.GetGenericArguments().First();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1940
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1941
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1942 // Get the data reader to the ref cursor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1943 var dataReader = emit.DeclareLocal(typeof(IDataReader));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1944 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1945 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1946 .callvirt(typeof(DbManager).GetProperty("DataProvider").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1947 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1948 .callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1949 .callvirt(typeof(DataProviderBase), "GetRefCursorDataReader", typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1950 .CastFromObject(typeof(IDataReader))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1951 .stloc(dataReader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1952 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1953
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1954 // Create the generic methos info to invoke
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1955 var mapDataReaderToListMethodInfo = typeof (MappingSchema).GetMethod("MapDataReaderToList",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1956 new[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1957 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1958 typeof (IDataReader),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1959 typeof (object[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1960 })
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1961 .MakeGenericMethod(genericType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1962
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1963 // Run MapDataReaderToList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1964 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1965 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1966 .callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1967 .ldloc(dataReader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1968 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1969 .callvirt(mapDataReaderToListMethodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1970 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1971 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1972 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1973 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1974 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1975 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1976 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1977 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1978 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1979 .callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1980 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1981
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1982 MethodInfo converter = GetConverterMethod(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1983
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1984 if (converter == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1985 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1986 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1987 .LoadType(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1988 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1989 .callvirt(_baseType, "ConvertChangeType", _bindingFlags, typeof(DbManager), typeof(object), typeof(Type), typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1990 .unboxIfValueType(type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1991 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1992 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1993 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1994 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1995 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1996 .ldloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1997 .callvirt(converter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1998 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1999 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2000 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2001
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2002 if (nullValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2003 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2004 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2005 .br(labelEndIf)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2006 .MarkLabel(labelNull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2007
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2008 if (nullValue.GetType() != type || !emit.LoadWellKnownValue(nullValue))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2009 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2010 string nullString = TypeDescriptor.GetConverter(type).ConvertToInvariantString(nullValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2011 FieldBuilder staticField = CreateNullValueField(type, nullString);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2012
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2013 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2014 .ldsfld(staticField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2015 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2016 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2017
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2018 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2019 .MarkLabel(labelEndIf)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2020 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2021 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2022
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2023 emit.stind(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2024 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2025
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2026 void GetOutRefParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2027 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2028 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2029
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2030 if (_outputParameters != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2031 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2032 LocalBuilder param = emit.DeclareLocal(typeof(IDataParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2033
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2034 foreach (ParameterInfo pi in _outputParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2035 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2036 Type type = pi.ParameterType.GetElementType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2037
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2038 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2039 .ldarg(pi)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2040 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2041
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2042 // Get parameter.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2043 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2044 object[] attrs = pi.GetCustomAttributes(typeof(ParamNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2045
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2046 string paramName = attrs.Length == 0 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2047 pi.Name : ((ParamNameAttribute)attrs[0]).Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2048
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2049 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2050 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2051 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2052 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2053
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2054 if (paramName[0] != '@')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2055 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2056 string methodName = _sqlQueryAttribute == null ? "GetSpParameterName" : "GetQueryParameterName";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2057
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2058 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2059 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2060 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2061 .ldstr(paramName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2062 .callvirt(_baseType, methodName, _bindingFlags, typeof(DbManager), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2063 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2064 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2065 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2066 emit.ldstr(paramName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2067
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2068 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2069 .callvirt(_baseType, "GetParameter", _bindingFlags, typeof(DbManager), typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2070 .stloc(param)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2071 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2073 StoreParameterValue(param, pi, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2074 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2075 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2076
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2077 foreach (MapOutputParametersValue v in _mapOutputParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2078 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2079 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2080 .ldloc(_locManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2081 .ldstrEx(v.ReturnValueMember)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2082 .ldarg(v.ParameterInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2083 .callvirt(typeof(DbManager), "MapOutputParameters", typeof(string), typeof(object));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2084 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2085 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2086
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2087 static bool IsInterfaceOf(Type type, Type interfaceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2088 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2089 Type[] types = type.GetInterfaces();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2090
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2091 foreach (Type t in types)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2092 if (t == interfaceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2093 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2094
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2095 return type == interfaceType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2096 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2097
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2098 private MethodInfo GetConverterMethod(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2099 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2100 if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2101 type = Enum.GetUnderlyingType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2103 Type[] types = new Type[] { typeof(DbManager), typeof(object), typeof(object) };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2104 return _baseType.GetMethod("ConvertTo" + type.Name, _bindingFlags, null, types, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2107 }