Skip to content

Commit

Permalink
Fix usage of StatementInspector
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Dec 14, 2018
1 parent d0c4bb0 commit 4c6d7aa
Show file tree
Hide file tree
Showing 17 changed files with 148 additions and 131 deletions.
Expand Up @@ -13,7 +13,6 @@

import org.hibernate.testing.jdbc.SQLStatementInterceptor;
import org.hibernate.testing.junit5.DatabaseAgnostic;
import org.hibernate.testing.junit5.FailureExpected;
import org.hibernate.testing.junit5.JiraKey;
import org.hibernate.testing.junit5.RequiresDialect;
import org.hibernate.testing.junit5.SessionFactoryBasedFunctionalTest;
Expand Down Expand Up @@ -69,7 +68,6 @@ protected boolean exportSchema() {
}

@Test
@FailureExpected( "Support for StatementInspector not yet implemented" )
public void testStoredProcedureOutParameter() throws SQLException {
sessionFactoryScope().inTransaction(
session -> {
Expand Down
Expand Up @@ -13,7 +13,6 @@

import org.hibernate.testing.jdbc.SQLStatementInterceptor;
import org.hibernate.testing.junit5.DatabaseAgnostic;
import org.hibernate.testing.junit5.FailureExpected;
import org.hibernate.testing.junit5.JiraKey;
import org.hibernate.testing.junit5.RequiresDialect;
import org.hibernate.testing.junit5.SessionFactoryBasedFunctionalTest;
Expand Down Expand Up @@ -69,7 +68,6 @@ protected boolean exportSchema() {
}

@Test
@FailureExpected( "Support for StatementInspector not yet implemented" )
public void testStoredProcedureOutParameter() throws SQLException {
sessionFactoryScope().inTransaction(
session -> {
Expand Down
Expand Up @@ -26,7 +26,7 @@
* @author Steve Ebersole
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
* @author Brett Meyer
*/
*/
class StatementPreparerImpl implements StatementPreparer {
private JdbcCoordinatorImpl jdbcCoordinator;

Expand Down Expand Up @@ -54,15 +54,15 @@ protected final LogicalConnectionImplementor logicalConnection() {
protected final SqlExceptionHelper sqlExceptionHelper() {
return getJdbcService().getSqlExceptionHelper();
}

@Override
public Statement createStatement() {
try {
final Statement statement = connection().createStatement();
jdbcCoordinator.getResourceRegistry().register( statement, true );
return statement;
}
catch ( SQLException e ) {
catch (SQLException e) {
throw sqlExceptionHelper().convert( e, "could not create statement" );
}
}
Expand All @@ -78,7 +78,9 @@ public PreparedStatement prepareStatement(String sql, final boolean isCallable)
return buildPreparedStatementPreparationTemplate( sql, isCallable ).prepareStatement();
}

private StatementPreparationTemplate buildPreparedStatementPreparationTemplate(String sql, final boolean isCallable) {
private StatementPreparationTemplate buildPreparedStatementPreparationTemplate(
String sql,
final boolean isCallable) {
return new StatementPreparationTemplate( sql ) {
@Override
protected PreparedStatement doPrepare() throws SQLException {
Expand All @@ -90,7 +92,7 @@ protected PreparedStatement doPrepare() throws SQLException {
}

private void checkAutoGeneratedKeysSupportEnabled() {
if ( ! settings().isGetGeneratedKeysEnabled() ) {
if ( !settings().isGetGeneratedKeysEnabled() ) {
throw new AssertionFailure( "getGeneratedKeys() support is not enabled" );
}
}
Expand Down Expand Up @@ -125,14 +127,57 @@ public PreparedStatement prepareQueryStatement(
final boolean isCallable,
final ScrollMode scrollMode) {
if ( scrollMode != null && !scrollMode.equals( ScrollMode.FORWARD_ONLY ) ) {
if ( ! settings().isScrollableResultSetsEnabled() ) {
throw new AssertionFailure("scrollable result sets are not enabled");
if ( !settings().isScrollableResultSetsEnabled() ) {
throw new AssertionFailure( "scrollable result sets are not enabled" );
}
final PreparedStatement ps = new QueryStatementPreparationTemplate( sql ) {
public PreparedStatement doPrepare() throws SQLException {
return isCallable
? connection().prepareCall( sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY )
: connection().prepareStatement(
sql,
scrollMode.toResultSetType(),
ResultSet.CONCUR_READ_ONLY
);
}
}.prepareStatement();
jdbcCoordinator.registerLastQuery( ps );
return ps;
}
else {
final PreparedStatement ps = new QueryStatementPreparationTemplate( sql ) {
public PreparedStatement doPrepare() throws SQLException {
return isCallable
? connection().prepareCall( sql )
: connection().prepareStatement( sql );
}
}.prepareStatement();
jdbcCoordinator.registerLastQuery( ps );
return ps;
}
}

@Override
public PreparedStatement prepareQueryStatement(String sql, ScrollMode scrollMode, boolean closeCursorsAtCommit) {
final int resultSetHoldability;
if ( closeCursorsAtCommit ) {
resultSetHoldability = ResultSet.CLOSE_CURSORS_AT_COMMIT;
}
else {
resultSetHoldability = ResultSet.HOLD_CURSORS_OVER_COMMIT;
}
if ( scrollMode != null && !scrollMode.equals( ScrollMode.FORWARD_ONLY ) ) {
if ( !settings().isScrollableResultSetsEnabled() ) {
throw new AssertionFailure( "scrollable result sets are not enabled" );
}
final PreparedStatement ps = new QueryStatementPreparationTemplate( sql ) {
public PreparedStatement doPrepare() throws SQLException {
return isCallable
? connection().prepareCall( sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY )
: connection().prepareStatement( sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY );
return connection().prepareStatement(
sql,
scrollMode.toResultSetType(),
ResultSet.CONCUR_READ_ONLY,
resultSetHoldability
);
}
}.prepareStatement();
jdbcCoordinator.registerLastQuery( ps );
Expand All @@ -141,9 +186,7 @@ public PreparedStatement doPrepare() throws SQLException {
else {
final PreparedStatement ps = new QueryStatementPreparationTemplate( sql ) {
public PreparedStatement doPrepare() throws SQLException {
return isCallable
? connection().prepareCall( sql )
: connection().prepareStatement( sql );
return connection().prepareStatement( sql );
}
}.prepareStatement();
jdbcCoordinator.registerLastQuery( ps );
Expand All @@ -168,17 +211,23 @@ public PreparedStatement prepareStatement() {

final PreparedStatement preparedStatement;
try {
jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getObserver().jdbcPrepareStatementStart();
jdbcCoordinator.getJdbcSessionOwner()
.getJdbcSessionContext()
.getObserver()
.jdbcPrepareStatementStart();
preparedStatement = doPrepare();
setStatementTimeout( preparedStatement );
}
finally {
jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getObserver().jdbcPrepareStatementEnd();
jdbcCoordinator.getJdbcSessionOwner()
.getJdbcSessionContext()
.getObserver()
.jdbcPrepareStatementEnd();
}
postProcess( preparedStatement );
return preparedStatement;
}
catch ( SQLException e ) {
catch (SQLException e) {
throw sqlExceptionHelper().convert( e, "could not prepare statement", sql );
}
}
Expand Down
Expand Up @@ -23,16 +23,16 @@ public interface StatementPreparer {
*
* @return the statement
*/
public Statement createStatement();
Statement createStatement();

/**
* Prepare a statement.
*
* @param sql The SQL the statement to be prepared
*
* @return the prepared statement
*/
public PreparedStatement prepareStatement(String sql);
PreparedStatement prepareStatement(String sql);

/**
* Prepare a statement.
Expand All @@ -42,13 +42,13 @@ public interface StatementPreparer {
*
* @return the prepared statement
*/
public PreparedStatement prepareStatement(String sql, boolean isCallable);
PreparedStatement prepareStatement(String sql, boolean isCallable);

/**
* Prepare an INSERT statement, specifying how auto-generated (by the database) keys should be handled. Really this
* is a boolean, but JDBC opted to define it instead using 2 int constants:<ul>
* <li>{@link PreparedStatement#RETURN_GENERATED_KEYS}</li>
* <li>{@link PreparedStatement#NO_GENERATED_KEYS}</li>
* <li>{@link PreparedStatement#RETURN_GENERATED_KEYS}</li>
* <li>{@link PreparedStatement#NO_GENERATED_KEYS}</li>
* </ul>
* Generated keys are accessed afterwards via {@link java.sql.PreparedStatement#getGeneratedKeys}
*
Expand All @@ -59,7 +59,7 @@ public interface StatementPreparer {
*
* @see java.sql.Connection#prepareStatement(String, int)
*/
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys);
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys);

/**
* Prepare an INSERT statement, specifying columns which are auto-generated values to be returned.
Expand All @@ -72,7 +72,7 @@ public interface StatementPreparer {
*
* @see java.sql.Connection#prepareStatement(String, String[])
*/
public PreparedStatement prepareStatement(String sql, String[] columnNames);
PreparedStatement prepareStatement(String sql, String[] columnNames);

/**
* Get a prepared statement for use in loading / querying.
Expand All @@ -84,5 +84,10 @@ public interface StatementPreparer {
*
* @return the prepared statement
*/
public PreparedStatement prepareQueryStatement(String sql, boolean isCallable, ScrollMode scrollMode);
PreparedStatement prepareQueryStatement(String sql, boolean isCallable, ScrollMode scrollMode);

PreparedStatement prepareQueryStatement(
String sql,
ScrollMode scrollMode,
boolean closeCursorsAtCommit);
}
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.envers.strategy.internal;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
Expand Down Expand Up @@ -185,8 +184,7 @@ public void perform(
updateDescriptor.getSqlAstStatement(),
executionContext.getSession().getSessionFactory()
),
executionContext,
Connection::prepareStatement
executionContext
);

if ( rowsAffected != 1 ) {
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.metamodel.model.domain.internal.collection;

import java.sql.Connection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
Expand Down Expand Up @@ -102,11 +101,7 @@ public void create(
bindCollectionIndex( entry, passes, collection, jdbcParameterBindings, session );
bindCollectionElement( entry, collection, jdbcParameterBindings, session );

JdbcMutationExecutor.WITH_AFTER_STATEMENT_CALL.execute(
creationOperation,
executionContext,
Connection::prepareStatement
);
JdbcMutationExecutor.WITH_AFTER_STATEMENT_CALL.execute( creationOperation, executionContext );

passes++;
jdbcParameterBindings.clear();
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.metamodel.model.domain.internal.collection;

import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -121,11 +120,7 @@ public void remove(Object key, SharedSessionContractImplementor session) {
session
);

JdbcMutationExecutor.WITH_AFTER_STATEMENT_CALL.execute(
removalOperation,
executionContext,
Connection::prepareStatement
);
JdbcMutationExecutor.WITH_AFTER_STATEMENT_CALL.execute( removalOperation, executionContext );
}

@SuppressWarnings("WeakerAccess")
Expand Down
Expand Up @@ -7,7 +7,6 @@
package org.hibernate.metamodel.model.domain.internal.entity;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -733,7 +732,6 @@ private int executeOperation(
return executor.execute(
operation,
executionContext,
Connection::prepareStatement,
(rows, preparestatement) -> checker.accept( rows, preparestatement )
);
}
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.query.sqm.consume.multitable.spi.idtable;

import java.sql.Connection;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -197,8 +196,7 @@ protected int saveMatchingIdsIntoIdTable(HandlerExecutionContext executionContex

return JdbcMutationExecutor.NO_AFTER_STATEMENT_CALL.execute(
insertSelectCall,
executionContext,
Connection::prepareStatement
executionContext
);
}

Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.query.sqm.consume.multitable.spi.idtable;

import java.sql.Connection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
Expand All @@ -23,7 +22,6 @@
import org.hibernate.sql.ast.consume.spi.SqlAstSelectToJdbcSelectConverter;
import org.hibernate.sql.ast.tree.spi.QuerySpec;
import org.hibernate.sql.exec.spi.JdbcDelete;
import org.hibernate.sql.exec.spi.JdbcMutation;
import org.hibernate.sql.exec.spi.JdbcMutationExecutor;
import org.hibernate.sql.exec.spi.JdbcParameterBinder;

Expand Down Expand Up @@ -133,8 +131,7 @@ public Set<String> getAffectedTableNames() {
return Collections.singleton( table.getTableExpression() );
}
},
executionContext,
Connection::prepareStatement
executionContext
);
}

Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package org.hibernate.query.sqm.consume.multitable.spi.idtable;

import java.sql.Connection;
import java.util.List;

import org.hibernate.metamodel.model.domain.spi.EntityTypeDescriptor;
Expand Down Expand Up @@ -83,12 +82,7 @@ protected void performMutations(HandlerExecutionContext executionContext) {
executionContext.getSessionFactory()
);

JdbcMutationExecutor.NO_AFTER_STATEMENT_CALL.execute(
jdbcUpdate,
executionContext,
Connection::prepareStatement
);

JdbcMutationExecutor.NO_AFTER_STATEMENT_CALL.execute( jdbcUpdate, executionContext );
}
}

Expand Down

0 comments on commit 4c6d7aa

Please sign in to comment.