1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.dbunit.ext.mssql;
22
23 import java.sql.Connection;
24 import java.sql.SQLException;
25 import java.sql.Statement;
26
27 import org.dbunit.DatabaseUnitException;
28 import org.dbunit.database.DatabaseConfig;
29 import org.dbunit.database.IDatabaseConnection;
30 import org.dbunit.dataset.Column;
31 import org.dbunit.dataset.DataSetException;
32 import org.dbunit.dataset.DefaultDataSet;
33 import org.dbunit.dataset.IDataSet;
34 import org.dbunit.dataset.ITable;
35 import org.dbunit.dataset.ITableIterator;
36 import org.dbunit.dataset.ITableMetaData;
37 import org.dbunit.dataset.Column.AutoIncrement;
38 import org.dbunit.dataset.filter.IColumnFilter;
39 import org.dbunit.operation.AbstractOperation;
40 import org.dbunit.operation.CompositeOperation;
41 import org.dbunit.operation.DatabaseOperation;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public class InsertIdentityOperation extends AbstractOperation
65 {
66
67
68
69
70 private static final Logger logger = LoggerFactory.getLogger(InsertIdentityOperation.class);
71
72 public static final DatabaseOperation INSERT =
73 new InsertIdentityOperation(DatabaseOperation.INSERT);
74
75 public static final DatabaseOperation CLEAN_INSERT =
76 new CompositeOperation(DatabaseOperation.DELETE_ALL,
77 new InsertIdentityOperation(DatabaseOperation.INSERT));
78
79 public static final DatabaseOperation REFRESH =
80 new InsertIdentityOperation(DatabaseOperation.REFRESH);
81
82 private static final IColumnFilter DEFAULT_IDENTITY_FILTER = new IColumnFilter()
83 {
84 public boolean accept(String tableName, Column column)
85 {
86 return column.getSqlTypeName().endsWith("identity");
87 }
88 };
89
90
91
92
93
94
95
96
97
98
99
100 public static final IColumnFilter IDENTITY_FILTER_EXTENDED = new IColumnFilter() {
101
102 public boolean accept(String tableName, Column column)
103 {
104 String remarks = column.getRemarks();
105 boolean isIdentityCol = (remarks != null) && (
106 remarks.indexOf("GENERATED BY DEFAULT AS IDENTITY") > -1 ||
107 remarks.indexOf("GENERATED ALWAYS AS IDENTITY") > -1
108 );
109
110
111 if(!isIdentityCol)
112 {
113
114 isIdentityCol = (AutoIncrement.YES == column.getAutoIncrement());
115 }
116
117 return isIdentityCol;
118 }
119 };
120
121
122 private final DatabaseOperation _operation;
123
124
125
126
127
128 public InsertIdentityOperation(DatabaseOperation operation)
129 {
130 _operation = operation;
131 }
132
133 boolean hasIdentityColumn(ITableMetaData metaData, IDatabaseConnection connection)
134 throws DataSetException
135 {
136 logger.debug("hasIdentityColumn(metaData={}, connection={}) - start", metaData, connection);
137
138 DatabaseConfig config = connection.getConfig();
139 IColumnFilter identityFilter = (IColumnFilter)config.getProperty(
140 DatabaseConfig.PROPERTY_IDENTITY_COLUMN_FILTER);
141 if (identityFilter == null)
142 {
143 identityFilter = DEFAULT_IDENTITY_FILTER;
144 }
145
146
147 Column[] columns = metaData.getColumns();
148 for (int i = 0; i < columns.length; i++)
149 {
150 if (identityFilter.accept(metaData.getTableName(), columns[i]))
151 {
152 return true;
153 }
154 }
155
156 return false;
157 }
158
159
160
161
162 public void execute(IDatabaseConnection connection, IDataSet dataSet)
163 throws DatabaseUnitException, SQLException
164 {
165 logger.debug("execute(connection={}, dataSet={}) - start", connection, dataSet);
166
167 Connection jdbcConnection = connection.getConnection();
168 Statement statement = jdbcConnection.createStatement();
169
170 boolean wasAutoCommit = false;
171 try
172 {
173 IDataSet databaseDataSet = connection.createDataSet();
174
175
176
177
178
179
180
181
182
183 if (jdbcConnection.getAutoCommit() == true)
184 {
185 wasAutoCommit = true;
186 jdbcConnection.setAutoCommit(false);
187 }
188
189
190 ITableIterator iterator = dataSet.iterator();
191 while(iterator.next())
192 {
193 ITable table = iterator.getTable();
194 String tableName = table.getTableMetaData().getTableName();
195
196 ITableMetaData metaData =
197 databaseDataSet.getTableMetaData(tableName);
198
199
200 boolean hasIdentityColumn = hasIdentityColumn(metaData, connection);
201
202 if (hasIdentityColumn)
203 {
204 final StringBuilder sqlBuffer = new StringBuilder(128);
205 sqlBuffer.append("SET IDENTITY_INSERT ");
206 sqlBuffer.append(getQualifiedName(connection.getSchema(),
207 metaData.getTableName(), connection));
208 sqlBuffer.append(" ON");
209 statement.execute(sqlBuffer.toString());
210 }
211
212 try
213 {
214 _operation.execute(connection, new DefaultDataSet(table));
215 }
216 finally
217 {
218
219 if (hasIdentityColumn)
220 {
221 final StringBuilder sqlBuffer = new StringBuilder(128);
222 sqlBuffer.append("SET IDENTITY_INSERT ");
223 sqlBuffer.append(getQualifiedName(connection.getSchema(),
224 metaData.getTableName(), connection));
225 sqlBuffer.append(" OFF");
226 statement.execute(sqlBuffer.toString());
227 }
228 if (wasAutoCommit)
229 {
230 jdbcConnection.commit();
231 }
232 }
233 }
234 }
235 finally
236 {
237 if(wasAutoCommit)
238 {
239
240 jdbcConnection.setAutoCommit(true);
241 }
242 statement.close();
243 }
244 }
245 }