|
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