OSDN Git Service

4759c9d8fa396521815213bad76aedb5d6af7f37
[ea2ddl/ea2ddl.git] / ea2ddl-gen / dbflute / templates / om / csharp / allcommon / s2dao / internal / sqlcommand / InternalInsertAutoDynamicCommand.vmnet
1 \r
2 using System;\r
3 using System.Collections;\r
4 using System.Data.SqlTypes;\r
5 using System.Text;\r
6 using Seasar.Framework.Exceptions;\r
7 using Seasar.Extension.ADO;\r
8 using Seasar.Dao;\r
9 using Seasar.Dao.Impl;\r
10 \r
11 using ${glPackageBaseCommonS2DaoInternalSqlHandler};\r
12 \r
13 namespace ${glPackageBaseCommonS2DaoInternalSqlCommand} {\r
14 \r
15     public class ${glInternalInsertAutoDynamicCommand} : AbstractSqlCommand {\r
16                 \r
17         // ===============================================================================\r
18         //                                                                       Attribute\r
19         //                                                                       =========\r
20         private const int NO_UPDATE = 0;\r
21         private readonly IBeanMetaData _beanMetaData;\r
22         private readonly string[] _propertyNames;\r
23 \r
24         // ===============================================================================\r
25         //                                                                     Constructor\r
26         //                                                                     ===========\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
32         }\r
33 \r
34         // ===============================================================================\r
35         //                                                                         Execute\r
36         //                                                                         =======\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
43                 return NO_UPDATE;\r
44             }\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
49             if (i < 1) {\r
50                 throw new NotSingleRowUpdatedRuntimeException(args[0], i);\r
51             }\r
52             return i;\r
53         }\r
54 \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
60             {\r
61                 IPropertyType pt = bmd.GetPropertyType(propertyNames[i]);\r
62                 if (IsTargetProperty(pt, timestampPropertyName, versionNoPropertyName, bean)) {\r
63                     types.Add(pt);\r
64                 }\r
65             }\r
66 \r
67             IPropertyType[] propertyTypes = new IPropertyType[types.Count];\r
68             types.CopyTo(propertyTypes, 0);\r
69             return propertyTypes;\r
70         }\r
71                 \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
75         }\r
76 \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
81             buf.Append(" (");\r
82             for (int i = 0; i < propertyTypes.Length; ++i) {\r
83                 IPropertyType pt = propertyTypes[i];\r
84                 String columnName = pt.ColumnName;\r
85                 if (i > 0)\r
86                 {\r
87                     buf.Append(", ");\r
88                 }\r
89                 buf.Append(columnName);\r
90             }\r
91             buf.Append(") VALUES (");\r
92             for (int i = 0; i < propertyTypes.Length; ++i) {\r
93                 if (i > 0) {\r
94                     buf.Append(", ");\r
95                 }\r
96                 buf.Append("?");\r
97             }\r
98             buf.Append(")");\r
99             return buf.ToString();\r
100         }\r
101 \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
106             }\r
107             string propertyName = pt.PropertyName;\r
108             if (propertyName.Equals(timestampPropertyName, StringComparison.CurrentCultureIgnoreCase)\r
109                         || propertyName.Equals(versionNoPropertyName, StringComparison.CurrentCultureIgnoreCase))\r
110             {\r
111                 return true;\r
112             }\r
113 \r
114             object value = pt.PropertyInfo.GetValue(bean, null);\r
115 \r
116             //  for normal type include Nullable<T>\r
117             if (value == null)\r
118             {\r
119                 return false;\r
120             }\r
121             //  for Sytem.Data.SqlTypes.INullable\r
122             if (value is INullable && ((INullable)value).IsNull)\r
123             {\r
124                 return false;\r
125             }\r
126             return true;\r
127         }\r
128 \r
129         protected virtual bool CanExecute(object bean, IBeanMetaData bmd, IPropertyType[] propertyTypes, string[] propertyNames)\r
130         {\r
131             if (propertyTypes.Length == 0) {\r
132                 throw new SRuntimeException("EDAO0014");\r
133             }\r
134             return true;\r
135         }\r
136 \r
137 \r
138         public IBeanMetaData BeanMetaData\r
139         {\r
140             get { return _beanMetaData; }\r
141         }\r
142 \r
143         public string[] PropertyNames\r
144         {\r
145             get { return _propertyNames; }\r
146         }\r
147         }\r
148 }