1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.dbunit.operation;
23
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import org.dbunit.database.IDatabaseConnection;
28 import org.dbunit.dataset.Column;
29 import org.dbunit.dataset.DataSetException;
30 import org.dbunit.dataset.ITable;
31 import org.dbunit.dataset.ITableMetaData;
32
33 import java.util.BitSet;
34
35
36
37
38
39
40
41
42
43
44
45 public class InsertOperation extends AbstractBatchOperation
46 {
47
48
49
50
51 private static final Logger logger = LoggerFactory.getLogger(InsertOperation.class);
52
53 InsertOperation()
54 {
55 }
56
57
58
59
60 public OperationData getOperationData(ITableMetaData metaData,
61 BitSet ignoreMapping, IDatabaseConnection connection) throws DataSetException
62 {
63 if (logger.isDebugEnabled())
64 {
65 logger.debug("getOperationData(metaData={}, ignoreMapping={}, connection={}) - start",
66 metaData, ignoreMapping, connection);
67 }
68
69 Column[] columns = metaData.getColumns();
70
71
72 final StringBuilder sqlBuffer = new StringBuilder(128);
73 sqlBuffer.append("insert into ");
74 sqlBuffer.append(getQualifiedName(connection.getSchema(),
75 metaData.getTableName(), connection));
76
77
78 sqlBuffer.append(" (");
79 String columnSeparator = "";
80 for (int i = 0; i < columns.length; i++)
81 {
82 if (!ignoreMapping.get(i))
83 {
84
85 String columnName = getQualifiedName(null,
86 columns[i].getColumnName(), connection);
87 sqlBuffer.append(columnSeparator);
88 sqlBuffer.append(columnName);
89 columnSeparator = ", ";
90 }
91 }
92
93
94 sqlBuffer.append(") values (");
95 String valueSeparator = "";
96 for (int i = 0; i < columns.length; i++)
97 {
98 if (!ignoreMapping.get(i))
99 {
100 sqlBuffer.append(valueSeparator);
101 sqlBuffer.append("?");
102 valueSeparator = ", ";
103 }
104 }
105 sqlBuffer.append(")");
106
107 return new OperationData(sqlBuffer.toString(), columns);
108 }
109
110 protected BitSet getIgnoreMapping(ITable table, int row) throws DataSetException
111 {
112 logger.debug("getIgnoreMapping(table={}, row={}) - start", table, row);
113
114 Column[] columns = table.getTableMetaData().getColumns();
115
116 BitSet ignoreMapping = new BitSet();
117 for (int i = 0; i < columns.length; i++)
118 {
119 Column column = columns[i];
120 Object value = table.getValue(row, column.getColumnName());
121 if (value == ITable.NO_VALUE
122 || (value == null && column.isNotNullable() && column.hasDefaultValue()))
123 {
124 ignoreMapping.set(i);
125 }
126 }
127 return ignoreMapping;
128 }
129
130 protected boolean equalsIgnoreMapping(BitSet ignoreMapping, ITable table,
131 int row) throws DataSetException
132 {
133 logger.debug("equalsIgnoreMapping(ignoreMapping={}, table={}, row={}) - start",
134 ignoreMapping, table, row);
135
136 Column[] columns = table.getTableMetaData().getColumns();
137
138 for (int i = 0; i < columns.length; i++)
139 {
140 boolean bit = ignoreMapping.get(i);
141 Object value = table.getValue(row, columns[i].getColumnName());
142 if ((bit && value != ITable.NO_VALUE) || (!bit && value == ITable.NO_VALUE))
143 {
144 return false;
145 }
146 }
147
148 return true;
149 }
150 }