|
6 | 6 |
|
7 | 7 | import java.sql.Connection;
|
8 | 8 | import java.sql.DatabaseMetaData;
|
9 |
| -import java.sql.ResultSet; |
10 | 9 | import java.sql.SQLException;
|
11 |
| -import java.sql.Statement; |
12 | 10 | import java.util.List;
|
13 | 11 |
|
14 | 12 | import org.hibernate.HibernateException;
|
| 13 | +import org.hibernate.dialect.Dialect; |
15 | 14 | import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
|
16 | 15 | import org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport;
|
17 | 16 | import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
|
|
20 | 19 | import org.hibernate.tool.schema.extract.spi.ExtractionContext;
|
21 | 20 | import org.hibernate.tool.schema.extract.spi.SequenceInformation;
|
22 | 21 |
|
| 22 | +import static java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE; |
23 | 23 | import static java.util.Collections.emptyList;
|
24 | 24 | import static java.util.stream.StreamSupport.stream;
|
25 | 25 | import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER;
|
| 26 | +import static org.hibernate.engine.jdbc.env.spi.SQLStateType.interpretReportedSQLStateType; |
26 | 27 |
|
27 | 28 | /**
|
28 | 29 | * Standard implementation of {@link ExtractedDatabaseMetaData}
|
@@ -57,50 +58,59 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
57 | 58 |
|
58 | 59 | //Lazily initialized: loading all sequence information upfront has been
|
59 | 60 | //shown to be too slow in some cases. In this way we only load it
|
60 |
| - //when there is actual need for these details. |
| 61 | + //when there is an actual need for these details. |
61 | 62 | private List<SequenceInformation> sequenceInformationList;
|
62 | 63 |
|
63 |
| - private ExtractedDatabaseMetaDataImpl( |
64 |
| - JdbcEnvironment jdbcEnvironment, |
65 |
| - JdbcConnectionAccess connectionAccess, |
66 |
| - String connectionCatalogName, |
67 |
| - String connectionSchemaName, |
68 |
| - String databaseProductName, |
69 |
| - String databaseProductVersion, |
70 |
| - boolean supportsRefCursors, |
71 |
| - boolean supportsNamedParameters, |
72 |
| - boolean supportsScrollableResults, |
73 |
| - boolean supportsGetGeneratedKeys, |
74 |
| - boolean supportsBatchUpdates, |
75 |
| - boolean supportsDataDefinitionInTransaction, |
76 |
| - boolean doesDataDefinitionCauseTransactionCommit, |
77 |
| - SQLStateType sqlStateType, |
78 |
| - int transactionIsolation, |
79 |
| - int defaultTransactionIsolation, |
80 |
| - int defaultFetchSize, |
81 |
| - String url, |
82 |
| - String driver, |
83 |
| - boolean jdbcMetadataIsAccessible) { |
84 |
| - this.jdbcEnvironment = jdbcEnvironment; |
85 |
| - this.connectionAccess = connectionAccess; |
86 |
| - this.connectionCatalogName = connectionCatalogName; |
87 |
| - this.connectionSchemaName = connectionSchemaName; |
88 |
| - this.databaseProductName = databaseProductName; |
89 |
| - this.databaseProductVersion = databaseProductVersion; |
90 |
| - this.supportsRefCursors = supportsRefCursors; |
91 |
| - this.supportsNamedParameters = supportsNamedParameters; |
92 |
| - this.supportsScrollableResults = supportsScrollableResults; |
93 |
| - this.supportsGetGeneratedKeys = supportsGetGeneratedKeys; |
94 |
| - this.supportsBatchUpdates = supportsBatchUpdates; |
95 |
| - this.supportsDataDefinitionInTransaction = supportsDataDefinitionInTransaction; |
96 |
| - this.doesDataDefinitionCauseTransactionCommit = doesDataDefinitionCauseTransactionCommit; |
97 |
| - this.sqlStateType = sqlStateType; |
98 |
| - this.transactionIsolation = transactionIsolation; |
99 |
| - this.defaultTransactionIsolation = defaultTransactionIsolation; |
100 |
| - this.defaultFetchSize = defaultFetchSize; |
101 |
| - this.url = url; |
102 |
| - this.driver = driver; |
103 |
| - this.jdbcMetadataAccessible = jdbcMetadataIsAccessible; |
| 64 | + ExtractedDatabaseMetaDataImpl(JdbcEnvironment environment) { |
| 65 | + jdbcEnvironment = environment; |
| 66 | + connectionAccess = null; |
| 67 | + jdbcMetadataAccessible = false; |
| 68 | + connectionSchemaName = null; |
| 69 | + connectionCatalogName = null; |
| 70 | + databaseProductName = null; |
| 71 | + databaseProductVersion = null; |
| 72 | + supportsRefCursors = false; |
| 73 | + supportsNamedParameters = false; |
| 74 | + supportsScrollableResults = false; |
| 75 | + supportsGetGeneratedKeys = false; |
| 76 | + supportsBatchUpdates = true; |
| 77 | + supportsDataDefinitionInTransaction = false; |
| 78 | + doesDataDefinitionCauseTransactionCommit = false; |
| 79 | + sqlStateType = null; |
| 80 | + url = null; |
| 81 | + driver = null; |
| 82 | + defaultTransactionIsolation = 0; |
| 83 | + transactionIsolation = 0; |
| 84 | + defaultFetchSize = -1; |
| 85 | + } |
| 86 | + |
| 87 | + ExtractedDatabaseMetaDataImpl( |
| 88 | + JdbcEnvironment environment, |
| 89 | + JdbcConnectionAccess connections, |
| 90 | + DatabaseMetaData metaData) |
| 91 | + throws SQLException { |
| 92 | + jdbcEnvironment = environment; |
| 93 | + connectionAccess = connections; |
| 94 | + jdbcMetadataAccessible = true; |
| 95 | + final Dialect dialect = environment.getDialect(); |
| 96 | + final Connection connection = metaData.getConnection(); |
| 97 | + connectionSchemaName = dialect.getSchemaNameResolver().resolveSchemaName( connection, dialect ); |
| 98 | + connectionCatalogName = connection.getCatalog(); |
| 99 | + databaseProductName = metaData.getDatabaseProductName(); |
| 100 | + databaseProductVersion = metaData.getDatabaseProductVersion(); |
| 101 | + supportsRefCursors = StandardRefCursorSupport.supportsRefCursors( metaData ); |
| 102 | + supportsNamedParameters = dialect.supportsNamedParameters( metaData ); |
| 103 | + supportsScrollableResults = metaData.supportsResultSetType( TYPE_SCROLL_INSENSITIVE ); |
| 104 | + supportsGetGeneratedKeys = metaData.supportsGetGeneratedKeys(); |
| 105 | + supportsBatchUpdates = metaData.supportsBatchUpdates(); |
| 106 | + supportsDataDefinitionInTransaction = !metaData.dataDefinitionIgnoredInTransactions(); |
| 107 | + doesDataDefinitionCauseTransactionCommit = metaData.dataDefinitionCausesTransactionCommit(); |
| 108 | + sqlStateType = interpretReportedSQLStateType( metaData.getSQLStateType() ); |
| 109 | + url = metaData.getURL(); |
| 110 | + driver = metaData.getDriverName(); |
| 111 | + defaultTransactionIsolation = metaData.getDefaultTransactionIsolation(); |
| 112 | + transactionIsolation = connection.getTransactionIsolation(); |
| 113 | + defaultFetchSize = defaultFetchSize( connection ); |
104 | 114 | }
|
105 | 115 |
|
106 | 116 | @Override
|
@@ -215,137 +225,12 @@ public boolean isJdbcMetadataAccessible() {
|
215 | 225 | return jdbcMetadataAccessible;
|
216 | 226 | }
|
217 | 227 |
|
218 |
| - public static class Builder { |
219 |
| - private final JdbcEnvironment jdbcEnvironment; |
220 |
| - private final boolean jdbcMetadataIsAccessible; |
221 |
| - private final JdbcConnectionAccess connectionAccess; |
222 |
| - |
223 |
| - private String connectionSchemaName; |
224 |
| - private String connectionCatalogName; |
225 |
| - |
226 |
| - private String databaseProductName; |
227 |
| - private String databaseProductVersion; |
228 |
| - |
229 |
| - private boolean supportsRefCursors; |
230 |
| - private boolean supportsNamedParameters; |
231 |
| - private boolean supportsScrollableResults; |
232 |
| - private boolean supportsGetGeneratedKeys; |
233 |
| - // In absence of DatabaseMetaData batching updates is assumed to be supported |
234 |
| - private boolean supportsBatchUpdates = true; |
235 |
| - private boolean supportsDataDefinitionInTransaction; |
236 |
| - private boolean doesDataDefinitionCauseTransactionCommit; |
237 |
| - private SQLStateType sqlStateType; |
238 |
| - private String url; |
239 |
| - private String driver; |
240 |
| - private int defaultTransactionIsolation; |
241 |
| - private int transactionIsolation; |
242 |
| - private int defaultFetchSize; |
243 |
| - |
244 |
| - public Builder(JdbcEnvironment jdbcEnvironment, boolean jdbcMetadataIsAccessible, JdbcConnectionAccess connectionAccess) { |
245 |
| - this.jdbcEnvironment = jdbcEnvironment; |
246 |
| - this.jdbcMetadataIsAccessible = jdbcMetadataIsAccessible; |
247 |
| - this.connectionAccess = connectionAccess; |
248 |
| - } |
249 |
| - |
250 |
| - public Builder apply(DatabaseMetaData databaseMetaData) throws SQLException { |
251 |
| - connectionCatalogName = databaseMetaData.getConnection().getCatalog(); |
252 |
| - connectionSchemaName = databaseMetaData.getConnection().getSchema(); |
253 |
| - databaseProductName = databaseMetaData.getDatabaseProductName(); |
254 |
| - databaseProductVersion = databaseMetaData.getDatabaseProductVersion(); |
255 |
| - supportsRefCursors = StandardRefCursorSupport.supportsRefCursors( databaseMetaData ); |
256 |
| - supportsNamedParameters = databaseMetaData.supportsNamedParameters(); |
257 |
| - supportsScrollableResults = databaseMetaData.supportsResultSetType( ResultSet.TYPE_SCROLL_INSENSITIVE ); |
258 |
| - supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys(); |
259 |
| - supportsBatchUpdates = databaseMetaData.supportsBatchUpdates(); |
260 |
| - supportsDataDefinitionInTransaction = !databaseMetaData.dataDefinitionIgnoredInTransactions(); |
261 |
| - doesDataDefinitionCauseTransactionCommit = databaseMetaData.dataDefinitionCausesTransactionCommit(); |
262 |
| - sqlStateType = SQLStateType.interpretReportedSQLStateType( databaseMetaData.getSQLStateType() ); |
263 |
| - url = databaseMetaData.getURL(); |
264 |
| - driver = databaseMetaData.getDriverName(); |
265 |
| - defaultTransactionIsolation = databaseMetaData.getDefaultTransactionIsolation(); |
266 |
| - transactionIsolation = databaseMetaData.getConnection().getTransactionIsolation(); |
267 |
| - try ( Statement statement = databaseMetaData.getConnection().createStatement() ) { |
268 |
| - defaultFetchSize = statement.getFetchSize(); |
269 |
| - } |
270 |
| - catch (SQLException sqle) { |
271 |
| - defaultFetchSize = -1; |
272 |
| - } |
273 |
| - return this; |
274 |
| - } |
275 |
| - |
276 |
| - public Builder setConnectionSchemaName(String connectionSchemaName) { |
277 |
| - this.connectionSchemaName = connectionSchemaName; |
278 |
| - return this; |
279 |
| - } |
280 |
| - |
281 |
| - public Builder setConnectionCatalogName(String connectionCatalogName) { |
282 |
| - this.connectionCatalogName = connectionCatalogName; |
283 |
| - return this; |
284 |
| - } |
285 |
| - |
286 |
| - public Builder setSupportsRefCursors(boolean supportsRefCursors) { |
287 |
| - this.supportsRefCursors = supportsRefCursors; |
288 |
| - return this; |
289 |
| - } |
290 |
| - |
291 |
| - public Builder setSupportsNamedParameters(boolean supportsNamedParameters) { |
292 |
| - this.supportsNamedParameters = supportsNamedParameters; |
293 |
| - return this; |
294 |
| - } |
295 |
| - |
296 |
| - public Builder setSupportsScrollableResults(boolean supportsScrollableResults) { |
297 |
| - this.supportsScrollableResults = supportsScrollableResults; |
298 |
| - return this; |
299 |
| - } |
300 |
| - |
301 |
| - public Builder setSupportsGetGeneratedKeys(boolean supportsGetGeneratedKeys) { |
302 |
| - this.supportsGetGeneratedKeys = supportsGetGeneratedKeys; |
303 |
| - return this; |
304 |
| - } |
305 |
| - |
306 |
| - public Builder setSupportsBatchUpdates(boolean supportsBatchUpdates) { |
307 |
| - this.supportsBatchUpdates = supportsBatchUpdates; |
308 |
| - return this; |
| 228 | + private static int defaultFetchSize(Connection connection) { |
| 229 | + try ( var statement = connection.createStatement() ) { |
| 230 | + return statement.getFetchSize(); |
309 | 231 | }
|
310 |
| - |
311 |
| - public Builder setSupportsDataDefinitionInTransaction(boolean supportsDataDefinitionInTransaction) { |
312 |
| - this.supportsDataDefinitionInTransaction = supportsDataDefinitionInTransaction; |
313 |
| - return this; |
314 |
| - } |
315 |
| - |
316 |
| - public Builder setDoesDataDefinitionCauseTransactionCommit(boolean doesDataDefinitionCauseTransactionCommit) { |
317 |
| - this.doesDataDefinitionCauseTransactionCommit = doesDataDefinitionCauseTransactionCommit; |
318 |
| - return this; |
319 |
| - } |
320 |
| - |
321 |
| - public Builder setSqlStateType(SQLStateType sqlStateType) { |
322 |
| - this.sqlStateType = sqlStateType; |
323 |
| - return this; |
324 |
| - } |
325 |
| - |
326 |
| - public ExtractedDatabaseMetaDataImpl build() { |
327 |
| - return new ExtractedDatabaseMetaDataImpl( |
328 |
| - jdbcEnvironment, |
329 |
| - connectionAccess, |
330 |
| - connectionCatalogName, |
331 |
| - connectionSchemaName, |
332 |
| - databaseProductName, |
333 |
| - databaseProductVersion, |
334 |
| - supportsRefCursors, |
335 |
| - supportsNamedParameters, |
336 |
| - supportsScrollableResults, |
337 |
| - supportsGetGeneratedKeys, |
338 |
| - supportsBatchUpdates, |
339 |
| - supportsDataDefinitionInTransaction, |
340 |
| - doesDataDefinitionCauseTransactionCommit, |
341 |
| - sqlStateType, |
342 |
| - transactionIsolation, |
343 |
| - defaultTransactionIsolation, |
344 |
| - defaultFetchSize, |
345 |
| - url, |
346 |
| - driver, |
347 |
| - jdbcMetadataIsAccessible |
348 |
| - ); |
| 232 | + catch (SQLException ignore) { |
| 233 | + return -1; |
349 | 234 | }
|
350 | 235 | }
|
351 | 236 |
|
|
0 commit comments