Skip to content

Commit 18d486f

Browse files
committed
simplify construction of ExtractedDatabaseMetaData
1 parent 66a2dfe commit 18d486f

File tree

9 files changed

+150
-326
lines changed

9 files changed

+150
-326
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3694,7 +3694,7 @@ public Set<String> getKeywords() {
36943694
* <li>Call {@link IdentifierHelperBuilder#applyIdentifierCasing(DatabaseMetaData)}
36953695
* <li>Call {@link IdentifierHelperBuilder#applyReservedWords(DatabaseMetaData)}
36963696
* <li>Applies {@link AnsiSqlKeywords#sql2003()} as reserved words</li>
3697-
* <li>Applies the {#link #sqlKeywords} collected here as reserved words</li>
3697+
* <li>Applies the {@link #sqlKeywords} collected here as reserved words</li>
36983698
* <li>Applies the Dialect's {@link NameQualifierSupport}, if it defines one</li>
36993699
* </ul>
37003700
*
@@ -4083,7 +4083,7 @@ public String[] getDropSchemaCommand(String schemaName) {
40834083
* {@link Connection#getSchema()} is always available directly.
40844084
* Never used internally.
40854085
*/
4086-
@Deprecated
4086+
@Deprecated(since = "7.0")
40874087
public String getCurrentSchemaCommand() {
40884088
return null;
40894089
}
@@ -4891,7 +4891,7 @@ public boolean addPartitionKeyToPrimaryKey() {
48914891
* an exception. Just rethrow and Hibernate will
48924892
* handle it.
48934893
*/
4894-
public boolean supportsNamedParameters(@Nullable DatabaseMetaData databaseMetaData) throws SQLException {
4894+
public boolean supportsNamedParameters(DatabaseMetaData databaseMetaData) throws SQLException {
48954895
return databaseMetaData != null && databaseMetaData.supportsNamedParameters();
48964896
}
48974897

hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565

6666
import java.sql.Connection;
6767
import java.sql.DatabaseMetaData;
68-
import java.sql.ResultSet;
6968
import java.sql.SQLException;
7069
import java.sql.Types;
7170
import java.time.temporal.TemporalAccessor;
@@ -605,8 +604,8 @@ public String resolveSchemaName(Connection connection, Dialect dialect) throws S
605604
);
606605
}
607606

608-
try (final java.sql.Statement statement = connection.createStatement()) {
609-
try (ResultSet resultSet = statement.executeQuery( command )) {
607+
try ( var statement = connection.createStatement() ) {
608+
try ( var resultSet = statement.executeQuery( command ) ) {
610609
return resultSet.next() ? resultSet.getString( 1 ) : null;
611610
}
612611
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/ExtractedDatabaseMetaDataImpl.java

Lines changed: 59 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66

77
import java.sql.Connection;
88
import java.sql.DatabaseMetaData;
9-
import java.sql.ResultSet;
109
import java.sql.SQLException;
11-
import java.sql.Statement;
1210
import java.util.List;
1311

1412
import org.hibernate.HibernateException;
13+
import org.hibernate.dialect.Dialect;
1514
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
1615
import org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport;
1716
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
@@ -20,9 +19,11 @@
2019
import org.hibernate.tool.schema.extract.spi.ExtractionContext;
2120
import org.hibernate.tool.schema.extract.spi.SequenceInformation;
2221

22+
import static java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE;
2323
import static java.util.Collections.emptyList;
2424
import static java.util.stream.StreamSupport.stream;
2525
import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER;
26+
import static org.hibernate.engine.jdbc.env.spi.SQLStateType.interpretReportedSQLStateType;
2627

2728
/**
2829
* Standard implementation of {@link ExtractedDatabaseMetaData}
@@ -57,50 +58,59 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
5758

5859
//Lazily initialized: loading all sequence information upfront has been
5960
//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.
6162
private List<SequenceInformation> sequenceInformationList;
6263

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 );
104114
}
105115

106116
@Override
@@ -215,137 +225,12 @@ public boolean isJdbcMetadataAccessible() {
215225
return jdbcMetadataAccessible;
216226
}
217227

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();
309231
}
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;
349234
}
350235
}
351236

0 commit comments

Comments
 (0)