OSDN Git Service

46fca679eb7d2ebf0d6806c4ce818c97be1d21b2
[ea2ddl/ea2ddl.git] / ea2ddl-gen / dbflute / templates / om / csharp / allcommon / s2dao / internal / sqlhandler / InternalAbstractAutoHandler.vmnet
1 \r
2 using System;\r
3 using System.Collections;\r
4 using System.Data;\r
5 using System.Data.SqlTypes;\r
6 using System.Reflection;\r
7 using Seasar.Extension.ADO;\r
8 using Seasar.Extension.ADO.Impl;\r
9 using Seasar.Framework.Log;\r
10 using Seasar.Framework.Util;\r
11 using Seasar.Dao;\r
12 \r
13 using ${glPackageBaseCommon};\r
14 using ${glPackageBaseCommonUtil};\r
15 \r
16 namespace ${glPackageBaseCommonS2DaoInternalSqlHandler} {\r
17 \r
18     public abstract class ${glInternalAbstractAutoHandler} : ${glInternalBasicHandler} {\r
19 \r
20         // ===============================================================================\r
21         //                                                                       Attribute\r
22         //                                                                       =========\r
23         protected readonly IBeanMetaData _beanMetaData;\r
24         protected Object[] _bindVariables;\r
25         protected Type[] _bindVariableTypes;\r
26         protected DateTime _timestamp = DateTime.MinValue;\r
27         protected Int32 _versionNo = Int32.MinValue;\r
28         protected IPropertyType[] _propertyTypes;\r
29         protected bool _versionNoAutoIncrementOnMemory = true;\r
30 \r
31         // ===============================================================================\r
32         //                                                                     Constructor\r
33         //                                                                     ===========\r
34         public ${glInternalAbstractAutoHandler}(IDataSource dataSource, ICommandFactory commandFactory,\r
35             IBeanMetaData beanMetaData, IPropertyType[] propertyTypes) : base(dataSource, null, commandFactory) {\r
36             // The property of Sql is treated as lazy setting at this class!\r
37             DataSource = dataSource;// This is for this new method! \r
38             _beanMetaData = beanMetaData;\r
39             _propertyTypes = propertyTypes;\r
40         }\r
41 \r
42         // ===============================================================================\r
43         //                                                                         Execute\r
44         //                                                                         =======\r
45         public int Execute(Object[] args) {\r
46             IDbConnection connection = Connection;\r
47             try {\r
48                 return Execute(connection, args[0]);\r
49             } finally {\r
50                 ConnectionHolderDataSource holderDataSoure = DataSource as ConnectionHolderDataSource;\r
51                 holderDataSoure.ReleaseConnection();\r
52                 holderDataSoure.CloseConnection(connection);\r
53             }\r
54         }\r
55 \r
56         public virtual int Execute(Object[] args, Type[] argTypes) {\r
57             return Execute(args);\r
58         }\r
59 \r
60         public virtual int Execute(Object[] args, Type[] argTypes, String[] argNames) {\r
61             return Execute(args);\r
62         }\r
63 \r
64         protected virtual int Execute(IDbConnection connection, object bean) {\r
65             PreUpdateBean(bean);\r
66             SetupBindVariables(bean);\r
67             LogSql(_bindVariables, _bindVariableTypes);\r
68             IDbCommand cmd = Command(connection);\r
69             int ret = -1;\r
70             try {\r
71                 BindArgs(cmd, _bindVariables, _bindVariableTypes);\r
72                 ret = ExecuteUpdate(cmd);\r
73             } finally {\r
74                 Close(cmd);\r
75             }\r
76             PostUpdateBean(bean, ret);\r
77             return ret;\r
78         }\r
79 \r
80         // ===============================================================================\r
81         //                                                                   Assist Helper\r
82         //                                                                   =============\r
83         protected virtual void PreUpdateBean(Object bean) {\r
84         }\r
85 \r
86         protected virtual void PostUpdateBean(Object bean, int ret) {\r
87         }\r
88 \r
89         protected abstract void SetupBindVariables(object bean);\r
90 \r
91         protected void SetupInsertBindVariables(object bean) {\r
92             ArrayList varList = new ArrayList();\r
93             ArrayList varTypeList = new ArrayList();\r
94             for (int i = 0; i < _propertyTypes.Length; ++i) {\r
95                 IPropertyType pt = _propertyTypes[i];\r
96                 if (string.Compare(pt.PropertyName, BeanMetaData.TimestampPropertyName, true) == 0) {\r
97                     Timestamp = DateTime.Now;\r
98                     SetupTimestampVariableList(varList, pt);\r
99                 } else if (pt.PropertyName.Equals(BeanMetaData.VersionNoPropertyName)) {\r
100                     VersionNo = 0;\r
101                     varList.Add(ConversionUtil.ConvertTargetType(VersionNo, pt.PropertyInfo.PropertyType));\r
102                 } else {\r
103                     varList.Add(pt.PropertyInfo.GetValue(bean, null));\r
104                 }\r
105                 varTypeList.Add(pt.PropertyInfo.PropertyType);\r
106             }\r
107             BindVariables = varList.ToArray();\r
108             BindVariableTypes = (Type[]) varTypeList.ToArray(typeof(Type));\r
109         }\r
110 \r
111         protected void SetupUpdateBindVariables(Object bean) {\r
112             ArrayList varList = new ArrayList();\r
113             ArrayList varTypeList = new ArrayList();\r
114             for (int i = 0; i < _propertyTypes.Length; ++i) {\r
115                 IPropertyType pt = _propertyTypes[i];\r
116                 if (string.Compare(pt.PropertyName, BeanMetaData.TimestampPropertyName, true) == 0) {\r
117                     Timestamp = DateTime.Now;\r
118                     SetupTimestampVariableList(varList, pt);\r
119                 } else if (String.Compare(pt.PropertyName, BeanMetaData.VersionNoPropertyName, true) == 0) {\r
120                     if (!IsVersionNoAutoIncrementOnMemory()) {\r
121                         continue;// because of always 'VERSION_NO = VERSION_NO + 1'\r
122                     }\r
123                     Object value = pt.PropertyInfo.GetValue(bean, null);\r
124                     if (value == null) {\r
125                         continue;// because of 'VERSION_NO = VERSION_NO + 1'\r
126                     }\r
127                     SetupVersionNoValiableList(varList, pt, bean);\r
128                 } else {\r
129                     varList.Add(pt.PropertyInfo.GetValue(bean, null));\r
130                 }\r
131                 varTypeList.Add(pt.PropertyInfo.PropertyType);\r
132             }\r
133             AddAutoUpdateWhereBindVariables(varList, varTypeList, bean);\r
134             BindVariables = varList.ToArray();\r
135             BindVariableTypes = (Type[]) varTypeList.ToArray(typeof(Type));\r
136         }\r
137 \r
138         protected bool IsVersionNoAutoIncrementOnMemory() {\r
139             return _versionNoAutoIncrementOnMemory;\r
140         }\r
141 \r
142         protected void SetupDeleteBindVariables(object bean) {\r
143             ArrayList varList = new ArrayList();\r
144             ArrayList varTypeList = new ArrayList();\r
145             AddAutoUpdateWhereBindVariables(varList, varTypeList, bean);\r
146             BindVariables = varList.ToArray();\r
147             BindVariableTypes = (Type[]) varTypeList.ToArray(typeof(Type));\r
148         }\r
149 \r
150         protected void AddAutoUpdateWhereBindVariables(ArrayList varList, ArrayList varTypeList, Object bean) {\r
151             IBeanMetaData bmd = BeanMetaData;\r
152             for (int i = 0; i < bmd.PrimaryKeySize; ++i) {\r
153                 IPropertyType pt = bmd.GetPropertyTypeByColumnName(bmd.GetPrimaryKey(i));\r
154                 PropertyInfo pi = pt.PropertyInfo;\r
155                 varList.Add(pi.GetValue(bean, null));\r
156                 varTypeList.Add(pi.PropertyType);\r
157             }\r
158             if (bmd.HasVersionNoPropertyType) {\r
159                 IPropertyType pt = bmd.VersionNoPropertyType;\r
160                 PropertyInfo pi = pt.PropertyInfo;\r
161                 varList.Add(pi.GetValue(bean, null));\r
162                 varTypeList.Add(pi.PropertyType);\r
163             }\r
164             if (bmd.HasTimestampPropertyType) {\r
165                 IPropertyType pt = bmd.TimestampPropertyType;\r
166                 PropertyInfo pi = pt.PropertyInfo;\r
167                 varList.Add(pi.GetValue(bean, null));\r
168                 varTypeList.Add(pi.PropertyType);\r
169             }\r
170         }\r
171 \r
172         protected void UpdateTimestampIfNeed(Object bean) {\r
173             if (Timestamp != DateTime.MinValue) {\r
174                 PropertyInfo pi = BeanMetaData.TimestampPropertyType.PropertyInfo;\r
175                 SetupTimestampPropertyInfo(pi, bean);\r
176             }\r
177         }\r
178 \r
179         protected void UpdateVersionNoIfNeed(object bean) {\r
180             if (VersionNo != Int32.MinValue) {\r
181                 PropertyInfo pi = BeanMetaData.VersionNoPropertyType.PropertyInfo;\r
182                 SetupVersionNoPropertyInfo(pi, bean);\r
183             }\r
184         }\r
185 \r
186         protected void SetupTimestampVariableList(IList varList, IPropertyType pt) {\r
187             if (pt.PropertyType == typeof(DateTime)) {\r
188                 varList.Add(Timestamp);\r
189             } else if (pt.PropertyType == typeof(DateTime?)) {\r
190                 varList.Add(Timestamp);\r
191             } else if (pt.PropertyType == typeof(SqlDateTime)) {\r
192                 varList.Add(new SqlDateTime(Timestamp));\r
193             } else {\r
194                 throw new WrongPropertyTypeOfTimestampException(pt.PropertyName, pt.PropertyType.Name);\r
195             }\r
196         }\r
197 \r
198         protected void SetupTimestampPropertyInfo(PropertyInfo pi, object bean) {\r
199             if (pi.PropertyType == typeof(DateTime)) {\r
200                 pi.SetValue(bean, Timestamp, null);\r
201             } else if (pi.PropertyType == typeof(DateTime?)) {\r
202                 pi.SetValue(bean, new DateTime?(Timestamp), null);\r
203             } else if (pi.PropertyType == typeof(SqlDateTime)) {\r
204                 pi.SetValue(bean, new SqlDateTime(Timestamp), null);\r
205             } else {\r
206                 throw new WrongPropertyTypeOfTimestampException(pi.Name, pi.PropertyType.Name);\r
207             }\r
208         }\r
209 \r
210         protected void SetupVersionNoValiableList(IList varList, IPropertyType pt, object bean) {\r
211             object value = pt.PropertyInfo.GetValue(bean, null);\r
212             int intValue = Convert.ToInt32(value) + 1;\r
213             VersionNo = intValue;\r
214             varList.Add(ConversionUtil.ConvertTargetType(VersionNo, pt.PropertyInfo.PropertyType));\r
215         }\r
216 \r
217         protected void SetupVersionNoPropertyInfo(PropertyInfo pi, object bean) {\r
218             pi.SetValue(bean, ConversionUtil.ConvertTargetType(VersionNo, pi.PropertyType), null);\r
219         }\r
220 \r
221         // ===============================================================================\r
222         //                                                                        Accessor\r
223         //                                                                        ========\r
224         public new IDataSource DataSource {// Attension! This is new method!\r
225             get { return base.DataSource; }\r
226             set {\r
227                 if (value is ConnectionHolderDataSource) {\r
228                     base.DataSource = value;\r
229                 } else {\r
230                     base.DataSource = new ConnectionHolderDataSource(value);\r
231                 }\r
232             }\r
233         }\r
234 \r
235         public IBeanMetaData BeanMetaData {\r
236             get { return _beanMetaData; }\r
237         }\r
238 \r
239         protected object[] BindVariables {\r
240             get { return _bindVariables; }\r
241             set { _bindVariables = value; }\r
242         }\r
243 \r
244         protected Type[] BindVariableTypes {\r
245             get { return _bindVariableTypes; }\r
246             set { _bindVariableTypes = value; }\r
247         }\r
248 \r
249         protected DateTime Timestamp {\r
250             get { return _timestamp; }\r
251             set { _timestamp = value; }\r
252         }\r
253 \r
254         protected int VersionNo {\r
255             get { return _versionNo; }\r
256             set { _versionNo = value; }\r
257         }\r
258 \r
259         protected IPropertyType[] PropertyTypes {\r
260             get { return _propertyTypes; }\r
261             set { _propertyTypes = value; }\r
262         }\r
263 \r
264         public bool VersionNoAutoIncrementOnMemory {\r
265             set { _versionNoAutoIncrementOnMemory = value; }\r
266         }\r
267     }\r
268 }