1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.dbunit.database;
22
23 import java.sql.Connection;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.sql.Statement;
27
28 import org.dbunit.dataset.AbstractTable;
29 import org.dbunit.dataset.DataSetException;
30 import org.dbunit.dataset.ITableMetaData;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34
35
36
37
38
39 public abstract class AbstractResultSetTable extends AbstractTable
40 implements IResultSetTable
41 {
42
43
44
45
46 private static final Logger logger = LoggerFactory.getLogger(AbstractResultSetTable.class);
47
48 protected ITableMetaData _metaData;
49 private Statement _statement;
50 protected ResultSet _resultSet;
51
52 public AbstractResultSetTable(ITableMetaData metaData, ResultSet resultSet)
53 throws SQLException, DataSetException
54 {
55 _metaData = metaData;
56 _resultSet = resultSet;
57 }
58
59 public AbstractResultSetTable(String tableName, String selectStatement,
60 IDatabaseConnection connection)
61 throws DataSetException, SQLException
62 {
63 this(tableName, selectStatement, connection, false);
64 }
65
66
67
68
69
70
71
72
73
74
75 public AbstractResultSetTable(String tableName, String selectStatement,
76 IDatabaseConnection connection, boolean caseSensitiveTableNames)
77 throws DataSetException, SQLException
78 {
79 this(tableName, selectStatement, connection, caseSensitiveTableNames, ResultSet.TYPE_FORWARD_ONLY);
80 }
81
82
83
84
85
86
87
88
89
90
91
92
93 protected AbstractResultSetTable(String tableName, String selectStatement,
94 IDatabaseConnection connection, boolean caseSensitiveTableNames, int resultSetType)
95 throws DataSetException, SQLException
96 {
97 _statement = createStatement(connection, resultSetType);
98
99 try
100 {
101 _resultSet = _statement.executeQuery(selectStatement);
102 _metaData = new ResultSetTableMetaData(tableName, _resultSet, connection, caseSensitiveTableNames);
103 }
104 catch (SQLException e)
105 {
106 _statement.close();
107 _statement = null;
108 throw e;
109 }
110 }
111
112 public AbstractResultSetTable(ITableMetaData metaData,
113 IDatabaseConnection connection) throws DataSetException, SQLException
114 {
115 this(metaData, connection, ResultSet.TYPE_FORWARD_ONLY);
116 }
117
118
119
120
121
122
123
124
125
126
127 protected AbstractResultSetTable(ITableMetaData metaData,
128 IDatabaseConnection connection, int resultSetType)
129 throws DataSetException, SQLException
130 {
131 _statement = createStatement(connection, resultSetType);
132
133 String escapePattern = (String) connection.getConfig()
134 .getProperty(DatabaseConfig.PROPERTY_ESCAPE_PATTERN);
135
136 try
137 {
138 String schema = connection.getSchema();
139 String selectStatement = getSelectStatement(schema, metaData, escapePattern);
140
141 if (logger.isDebugEnabled())
142 {
143 logger.debug("Query: {}", selectStatement);
144 }
145
146 _resultSet = _statement.executeQuery(selectStatement);
147 _metaData = metaData;
148 }
149 catch (SQLException e)
150 {
151 _statement.close();
152 _statement = null;
153 throw e;
154 }
155 }
156
157 private Statement createStatement(IDatabaseConnection connection) throws SQLException
158 {
159 return createStatement(connection, ResultSet.TYPE_FORWARD_ONLY);
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173 protected Statement createStatement(IDatabaseConnection connection, int resultSetType)
174 throws SQLException
175 {
176 logger.trace("createStatement(resultSetType={}) - start", resultSetType);
177
178 Connection jdbcConnection = connection.getConnection();
179 Statement stmt = jdbcConnection.createStatement(resultSetType, ResultSet.CONCUR_READ_ONLY);
180 connection.getConfig().getConfigurator().configureStatement(stmt);
181 return stmt;
182 }
183
184 static String getSelectStatement(String schema, ITableMetaData metaData, String escapePattern)
185 throws DataSetException
186 {
187 return DatabaseDataSet.getSelectStatement(schema, metaData, escapePattern);
188 }
189
190
191
192
193 public ITableMetaData getTableMetaData()
194 {
195 return _metaData;
196 }
197
198
199
200
201 public void close() throws DataSetException
202 {
203 logger.trace("close() - start");
204
205 try
206 {
207 if (_resultSet != null)
208 {
209 _resultSet.close();
210 _resultSet = null;
211 }
212
213 if (_statement != null)
214 {
215 _statement.close();
216 _statement = null;
217 }
218 }
219 catch (SQLException e)
220 {
221 throw new DataSetException(e);
222 }
223 }
224
225
226
227
228 public String toString()
229 {
230 StringBuilder sb = new StringBuilder(2000);
231
232 sb.append(getClass().getName()).append("[");
233 sb.append("_metaData=[").append(_metaData).append("], ");
234 sb.append("_resultSet=[").append(_resultSet).append("], ");
235 sb.append("_statement=[").append(_statement).append("]");
236 sb.append("]");
237
238 return sb.toString();
239 }
240 }