3 using System.Collections;
\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
13 using ${glPackageBaseCommon};
\r
14 using ${glPackageBaseCommonUtil};
\r
16 namespace ${glPackageBaseCommonS2DaoInternalSqlHandler} {
\r
18 public abstract class ${glInternalAbstractAutoHandler} : ${glInternalBasicHandler} {
\r
20 // ===============================================================================
\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
31 // ===============================================================================
\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
42 // ===============================================================================
\r
45 public int Execute(Object[] args) {
\r
46 IDbConnection connection = Connection;
\r
48 return Execute(connection, args[0]);
\r
50 ConnectionHolderDataSource holderDataSoure = DataSource as ConnectionHolderDataSource;
\r
51 holderDataSoure.ReleaseConnection();
\r
52 holderDataSoure.CloseConnection(connection);
\r
56 public virtual int Execute(Object[] args, Type[] argTypes) {
\r
57 return Execute(args);
\r
60 public virtual int Execute(Object[] args, Type[] argTypes, String[] argNames) {
\r
61 return Execute(args);
\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
71 BindArgs(cmd, _bindVariables, _bindVariableTypes);
\r
72 ret = ExecuteUpdate(cmd);
\r
76 PostUpdateBean(bean, ret);
\r
80 // ===============================================================================
\r
83 protected virtual void PreUpdateBean(Object bean) {
\r
86 protected virtual void PostUpdateBean(Object bean, int ret) {
\r
89 protected abstract void SetupBindVariables(object bean);
\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
101 varList.Add(ConversionUtil.ConvertTargetType(VersionNo, pt.PropertyInfo.PropertyType));
\r
103 varList.Add(pt.PropertyInfo.GetValue(bean, null));
\r
105 varTypeList.Add(pt.PropertyInfo.PropertyType);
\r
107 BindVariables = varList.ToArray();
\r
108 BindVariableTypes = (Type[]) varTypeList.ToArray(typeof(Type));
\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
123 Object value = pt.PropertyInfo.GetValue(bean, null);
\r
124 if (value == null) {
\r
125 continue;// because of 'VERSION_NO = VERSION_NO + 1'
\r
127 SetupVersionNoValiableList(varList, pt, bean);
\r
129 varList.Add(pt.PropertyInfo.GetValue(bean, null));
\r
131 varTypeList.Add(pt.PropertyInfo.PropertyType);
\r
133 AddAutoUpdateWhereBindVariables(varList, varTypeList, bean);
\r
134 BindVariables = varList.ToArray();
\r
135 BindVariableTypes = (Type[]) varTypeList.ToArray(typeof(Type));
\r
138 protected bool IsVersionNoAutoIncrementOnMemory() {
\r
139 return _versionNoAutoIncrementOnMemory;
\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
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
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
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
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
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
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
194 throw new WrongPropertyTypeOfTimestampException(pt.PropertyName, pt.PropertyType.Name);
\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
206 throw new WrongPropertyTypeOfTimestampException(pi.Name, pi.PropertyType.Name);
\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
217 protected void SetupVersionNoPropertyInfo(PropertyInfo pi, object bean) {
\r
218 pi.SetValue(bean, ConversionUtil.ConvertTargetType(VersionNo, pi.PropertyType), null);
\r
221 // ===============================================================================
\r
224 public new IDataSource DataSource {// Attension! This is new method!
\r
225 get { return base.DataSource; }
\r
227 if (value is ConnectionHolderDataSource) {
\r
228 base.DataSource = value;
\r
230 base.DataSource = new ConnectionHolderDataSource(value);
\r
235 public IBeanMetaData BeanMetaData {
\r
236 get { return _beanMetaData; }
\r
239 protected object[] BindVariables {
\r
240 get { return _bindVariables; }
\r
241 set { _bindVariables = value; }
\r
244 protected Type[] BindVariableTypes {
\r
245 get { return _bindVariableTypes; }
\r
246 set { _bindVariableTypes = value; }
\r
249 protected DateTime Timestamp {
\r
250 get { return _timestamp; }
\r
251 set { _timestamp = value; }
\r
254 protected int VersionNo {
\r
255 get { return _versionNo; }
\r
256 set { _versionNo = value; }
\r
259 protected IPropertyType[] PropertyTypes {
\r
260 get { return _propertyTypes; }
\r
261 set { _propertyTypes = value; }
\r
264 public bool VersionNoAutoIncrementOnMemory {
\r
265 set { _versionNoAutoIncrementOnMemory = value; }
\r