package net.sourceforge.squirrel_sql.client.session; import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetWrapper; import net.sourceforge.squirrel_sql.fw.datasetviewer.StatementCallback; import net.sourceforge.squirrel_sql.fw.sql.SQLUtilities; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.ArrayList; public class StatementWrapper implements StatementCallback { private static final ILogger s_log = LoggerController.createLogger(StatementWrapper.class); private boolean _maxRowsWasSet; private ISession _session; private Statement _statement; private ArrayList<ResultSetWrapper> _resultSetWrappers = new ArrayList<ResultSetWrapper>(); private boolean _hasReturnedResultSet; public StatementWrapper(Statement stmt) { this(stmt, null); } public StatementWrapper(Statement statement, ISession session) { _session = session; _statement = statement; } public void setMaxRows() { if(null == _session || isContinueReadActive()) { return; } if(_session.getProperties().getSQLLimitRows()) { _maxRowsWasSet = true; try { _statement.setMaxRows(_session.getProperties().getSQLNbrRowsToShow()); } catch (Exception e) { s_log.error("Can't Set MaxRows", e); } } } @Override public boolean isMaxRowsWasSet() { return _maxRowsWasSet; } @Override public int getMaxRowsCount() { return _session.getProperties().getSQLNbrRowsToShow(); } public void setFetchSize() { if(null == _session) { return; } if(_session.getProperties().getSQLUseFetchSize() && _session.getProperties().getSQLFetchSize() > 0) { try { _statement.setFetchSize(_session.getProperties().getSQLFetchSize()); } catch (Exception e) { s_log.error("Can't Set FetchSize", e); } } } public void cancel() throws SQLException { _statement.cancel(); } public ResultSetWrapper getResultSetWrapper() throws SQLException { ResultSet resultSet = _statement.getResultSet(); if(null == resultSet) { // Happens when executing procs with more than on result set return null; } _hasReturnedResultSet = true; ResultSetWrapper resultSetWrapper = new ResultSetWrapper(resultSet, this); _resultSetWrappers.add(resultSetWrapper); return resultSetWrapper; } public boolean getMoreResults() throws SQLException { if(isContinueReadActive() && _hasReturnedResultSet) { // _statement.getMoreResults() will implicitly close any current ResultSet. (see API doc of Statement.getMoreResults()) // So when continueRead is active we cannot support multipple result sets anymore. // Another reason why not to choose this option. :-) return false; } return _statement.getMoreResults(); } /** * Some drivers, such as SQLite, don't properly support getMaxRows/setMaxRows for statements. * * @return the max number of rows that could be returned by this statement */ public int getMaxRows() { int result = 0; try { result = _statement.getMaxRows(); } catch (SQLException e) { if (s_log.isDebugEnabled()) { s_log.debug("Unexpected exception: " + e.getMessage(), e); } } return result; } public SQLWarning getWarnings() throws SQLException { return _statement.getWarnings(); } public void clearWarnings() throws SQLException { _statement.clearWarnings(); } public boolean execute(String sql) throws SQLException { return _statement.execute(sql); } public int getUpdateCount() throws SQLException { if(isContinueReadActive() && _hasReturnedResultSet) { // This is needed to stop the executer to ask for more results return -1; } return _statement.getUpdateCount(); } @Override public boolean isContinueReadActive() { return _session.getProperties().getSQLReadOn(); } @Override public int getFirstBlockCount() { return _session.getProperties().getSQLReadOnBlockSize(); } @Override public int getContinueBlockCount() { return _session.getProperties().getSQLReadOnBlockSize(); } @Override public void closeStatementIfContinueReadActive() { if (false == isContinueReadActive()) { return; } _closeStatement(); } public void closeIfContinueReadIsNotActive() throws SQLException { if(isContinueReadActive()) { return; } _closeStatement(); } private void _closeStatement() { try { SQLUtilities.closeStatement(_statement); } finally { _statement = null; } } }