/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.engine.jdbc.internal;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.jdbc.spi.ResultSetReturn;
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;

Standard implementation of the ResultSetReturn contract
Author:Brett Meyer
/** * Standard implementation of the ResultSetReturn contract * * @author Brett Meyer */
public class ResultSetReturnImpl implements ResultSetReturn { private final JdbcCoordinator jdbcCoordinator; private final Dialect dialect; private final SqlStatementLogger sqlStatementLogger; private final SqlExceptionHelper sqlExceptionHelper;
Constructs a ResultSetReturnImpl
Params:
  • jdbcCoordinator – The JdbcCoordinator
/** * Constructs a ResultSetReturnImpl * * @param jdbcCoordinator The JdbcCoordinator */
public ResultSetReturnImpl(JdbcCoordinator jdbcCoordinator) { this.jdbcCoordinator = jdbcCoordinator; final JdbcServices jdbcServices = jdbcCoordinator.getJdbcSessionOwner() .getJdbcSessionContext() .getServiceRegistry() .getService( JdbcServices.class ); this.dialect = jdbcServices.getDialect(); this.sqlStatementLogger = jdbcServices.getSqlStatementLogger(); this.sqlExceptionHelper = jdbcServices.getSqlExceptionHelper(); } @Override public ResultSet extract(PreparedStatement statement) { // IMPL NOTE : SQL logged by caller try { final ResultSet rs; try { jdbcExecuteStatementStart(); rs = statement.executeQuery(); } finally { jdbcExecuteStatementEnd(); } postExtract( rs, statement ); return rs; } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not extract ResultSet" ); } } private void jdbcExecuteStatementEnd() { jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getObserver().jdbcExecuteStatementEnd(); } private void jdbcExecuteStatementStart() { jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getObserver().jdbcExecuteStatementStart(); } @Override public ResultSet extract(CallableStatement callableStatement) { // IMPL NOTE : SQL logged by caller try { final ResultSet rs; try { jdbcExecuteStatementStart(); rs = dialect.getResultSet( callableStatement ); } finally { jdbcExecuteStatementEnd(); } postExtract( rs, callableStatement ); return rs; } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not extract ResultSet" ); } } @Override public ResultSet extract(Statement statement, String sql) { sqlStatementLogger.logStatement( sql ); try { final ResultSet rs; try { jdbcExecuteStatementStart(); rs = statement.executeQuery( sql ); } finally { jdbcExecuteStatementEnd(); } postExtract( rs, statement ); return rs; } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not extract ResultSet" ); } } @Override public ResultSet execute(PreparedStatement statement) { // sql logged by StatementPreparerImpl try { final ResultSet rs; try { jdbcExecuteStatementStart(); if ( !statement.execute() ) { while ( !statement.getMoreResults() && statement.getUpdateCount() != -1 ) { // do nothing until we hit the resultset } } rs = statement.getResultSet(); } finally { jdbcExecuteStatementEnd(); } postExtract( rs, statement ); return rs; } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not execute statement" ); } } @Override public ResultSet execute(Statement statement, String sql) { sqlStatementLogger.logStatement( sql ); try { final ResultSet rs; try { jdbcExecuteStatementStart(); if ( !statement.execute( sql ) ) { while ( !statement.getMoreResults() && statement.getUpdateCount() != -1 ) { // do nothing until we hit the resultset } } rs = statement.getResultSet(); } finally { jdbcExecuteStatementEnd(); } postExtract( rs, statement ); return rs; } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not execute statement" ); } } @Override public int executeUpdate(PreparedStatement statement) { try { jdbcExecuteStatementStart(); return statement.executeUpdate(); } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not execute statement" ); } finally { jdbcExecuteStatementEnd(); } } @Override public int executeUpdate(Statement statement, String sql) { sqlStatementLogger.logStatement( sql ); try { jdbcExecuteStatementStart(); return statement.executeUpdate( sql ); } catch (SQLException e) { throw sqlExceptionHelper.convert( e, "could not execute statement" ); } finally { jdbcExecuteStatementEnd(); } } private void postExtract(ResultSet rs, Statement st) { if ( rs != null ) { jdbcCoordinator.getResourceRegistry().register( rs, st ); } } }