3 using System.Collections;
\r
4 using System.Data.SqlTypes;
\r
6 using Seasar.Framework.Exceptions;
\r
7 using Seasar.Extension.ADO;
\r
9 using Seasar.Dao.Impl;
\r
11 using ${glPackageBaseCommonS2DaoInternalSqlHandler};
\r
13 namespace ${glPackageBaseCommonS2DaoInternalSqlCommand} {
\r
15 public class ${glInternalInsertAutoDynamicCommand} : AbstractSqlCommand {
\r
17 // ===============================================================================
\r
20 private const int NO_UPDATE = 0;
\r
21 private readonly IBeanMetaData _beanMetaData;
\r
22 private readonly string[] _propertyNames;
\r
24 // ===============================================================================
\r
27 public ${glInternalInsertAutoDynamicCommand}(IDataSource dataSource, ICommandFactory commandFactory,
\r
28 IBeanMetaData beanMetaData, string[] propertyNames)
\r
29 : base(dataSource, commandFactory) {
\r
30 _beanMetaData = beanMetaData;
\r
31 _propertyNames = propertyNames;
\r
34 // ===============================================================================
\r
37 public override Object Execute(object[] args) {
\r
38 object bean = args[0];
\r
39 IBeanMetaData bmd = BeanMetaData;
\r
40 string[] propertyNames = PropertyNames;
\r
41 IPropertyType[] propertyTypes = CreateTargetPropertyTypes(bmd, bean, propertyNames);
\r
42 if (CanExecute(bean, bmd, propertyTypes, propertyNames) == false) {
\r
45 ${glInternalAbstractAutoHandler} handler = CreateAutoHandler(DataSource, CommandFactory, bmd, propertyTypes);
\r
46 handler.Sql = SetupSql(bmd, propertyTypes);
\r
47 handler.LoggingMessageSqlArgs = args; // Actually set up this property in the handler again.
\r
48 int i = handler.Execute(args);
\r
50 throw new NotSingleRowUpdatedRuntimeException(args[0], i);
\r
55 protected virtual IPropertyType[] CreateTargetPropertyTypes(IBeanMetaData bmd, object bean, string[] propertyNames) {
\r
56 IList types = new ArrayList();
\r
57 string timestampPropertyName = bmd.TimestampPropertyName;
\r
58 string versionNoPropertyName = bmd.VersionNoPropertyName;
\r
59 for (int i = 0; i < propertyNames.Length; ++i)
\r
61 IPropertyType pt = bmd.GetPropertyType(propertyNames[i]);
\r
62 if (IsTargetProperty(pt, timestampPropertyName, versionNoPropertyName, bean)) {
\r
67 IPropertyType[] propertyTypes = new IPropertyType[types.Count];
\r
68 types.CopyTo(propertyTypes, 0);
\r
69 return propertyTypes;
\r
72 protected virtual ${glInternalAbstractAutoHandler} CreateAutoHandler(IDataSource dataSource, ICommandFactory commandFactory,
\r
73 IBeanMetaData beanMetaData, IPropertyType[] propertyTypes) {
\r
74 return new ${glInternalInsertAutoHandler}(dataSource, commandFactory, beanMetaData, propertyTypes);
\r
77 protected virtual string SetupSql(IBeanMetaData bmd, IPropertyType[] propertyTypes) {
\r
78 StringBuilder buf = new StringBuilder(100);
\r
79 buf.Append("INSERT INTO ");
\r
80 buf.Append(bmd.TableName);
\r
82 for (int i = 0; i < propertyTypes.Length; ++i) {
\r
83 IPropertyType pt = propertyTypes[i];
\r
84 String columnName = pt.ColumnName;
\r
89 buf.Append(columnName);
\r
91 buf.Append(") VALUES (");
\r
92 for (int i = 0; i < propertyTypes.Length; ++i) {
\r
99 return buf.ToString();
\r
102 protected virtual bool IsTargetProperty(IPropertyType pt, string timestampPropertyName, string versionNoPropertyName, object bean) {
\r
103 IIdentifierGenerator identifierGenerator = BeanMetaData.IdentifierGenerator;
\r
104 if (pt.IsPrimaryKey) {
\r
105 return identifierGenerator.IsSelfGenerate;
\r
107 string propertyName = pt.PropertyName;
\r
108 if (propertyName.Equals(timestampPropertyName, StringComparison.CurrentCultureIgnoreCase)
\r
109 || propertyName.Equals(versionNoPropertyName, StringComparison.CurrentCultureIgnoreCase))
\r
114 object value = pt.PropertyInfo.GetValue(bean, null);
\r
116 // for normal type include Nullable<T>
\r
121 // for Sytem.Data.SqlTypes.INullable
\r
122 if (value is INullable && ((INullable)value).IsNull)
\r
129 protected virtual bool CanExecute(object bean, IBeanMetaData bmd, IPropertyType[] propertyTypes, string[] propertyNames)
\r
131 if (propertyTypes.Length == 0) {
\r
132 throw new SRuntimeException("EDAO0014");
\r
138 public IBeanMetaData BeanMetaData
\r
140 get { return _beanMetaData; }
\r
143 public string[] PropertyNames
\r
145 get { return _propertyNames; }
\r