Revision: 6722
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6722&view=rev
Author: gerdwagner
Date: 2012-12-22 20:01:55 +0000 (Sat, 22 Dec 2012)
Log Message:
-----------
New option to enables SQL result tables to read more query results when the user scrolls to the end of the table.
This option can be switched on in Session Properties and on top of the SQL-Editor just at the place where the
"Limit tows" check box is.
Modified Paths:
--------------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/CancelStatementThread.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/QueryInfoPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/overview/OverviewCtrl.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionProperties.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionSQLPropertiesPanel.java
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/squirrel.properties
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/properties/I18NStrings.properties
trunk/sql12/doc/src/main/resources/changes.txt
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/BaseDataSetViewerDestination.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetDefinition.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTablePanel.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/IDataSetViewer.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetDataSet.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/tablefind/DataSetViewerFindDecorator.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/tablefind/DefaultFindService.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/gui/SortableTableModel.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/sql/ResultSetReader.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/sql/SQLDatabaseMetaData.java
trunk/sql12/plugins/graph/src/main/java/net/sourceforge/squirrel_sql/plugins/graph/GraphDesktopController.java
trunk/sql12/plugins/graph/src/main/java/net/sourceforge/squirrel_sql/plugins/graph/ModeManager.java
trunk/sql12/plugins/graph/src/main/java/net/sourceforge/squirrel_sql/plugins/graph/querybuilder/GraphQueryResultPanel.java
trunk/sql12/plugins/graph/src/main/java/net/sourceforge/squirrel_sql/plugins/graph/querybuilder/GraphQueryResultPanelCtrl.java
trunk/sql12/plugins/graph/src/main/java/net/sourceforge/squirrel_sql/plugins/graph/querybuilder/QueryBuilderController.java
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/commands/handler/MessageSQLExecuterHandler.java
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/commands/handler/ProgressSQLExecuterHandler.java
trunk/sql12/plugins/postgres/src/main/java/net/sourceforge/squirrel_sql/plugins/postgres/explain/ExplainExecuterPanel.java
Added Paths:
-----------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/StatementWrapper.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CurrentSqlLabelController.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandlerListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/ResultLimitAndReadOnPanelSmallPanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrl.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrlListener.java
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/loading_gif.gif
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/BlockMode.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ContinueReadChannel.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ContinueReadHandler.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTableModel.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ReadMoreResultsHandlerListener.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ResultSetWrapper.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/SimpleStatementCallback.java
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/StatementCallback.java
Removed Paths:
-------------
trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/MyTableModel.java
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -102,6 +102,7 @@
String UNMARK = "unmark";
String TABLE = "table";
String HIDE = "hide";
+ String LOADING_GIF = "loading_gif";
}
public SquirrelResources(String rsrcBundleBaseName)
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/CancelStatementThread.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/CancelStatementThread.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/CancelStatementThread.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -7,8 +7,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import java.sql.Statement;
-
public class CancelStatementThread extends Thread
{
private static final StringManager s_stringMgr =
@@ -17,14 +15,14 @@
private static final ILogger s_log = LoggerController.createLogger(CancelStatementThread.class);
- private Statement _stmt;
+ private StatementWrapper _stmtWrapper;
private IMessageHandler _messageHandler;
private boolean _threadFinished;
private boolean _joinReturned;
- public CancelStatementThread(Statement stmt, IMessageHandler messageHandler)
+ public CancelStatementThread(StatementWrapper stmtWrapper, IMessageHandler messageHandler)
{
- _stmt = stmt;
+ _stmtWrapper = stmtWrapper;
_messageHandler = messageHandler;
}
@@ -63,8 +61,8 @@
try
{
- if (_stmt != null) {
- _stmt.cancel();
+ if (_stmtWrapper != null) {
+ _stmtWrapper.cancel();
}
cancelSucceeded = true;
}
@@ -83,8 +81,8 @@
// cancel and stop fetching results. This allows us to stop the query
// processing gracefully.
Utilities.sleep(500);
- if (_stmt != null) {
- _stmt.close();
+ if (_stmtWrapper != null) {
+ _stmtWrapper.closeIfContinueReadIsNotActive();
}
closeSucceeded = true;
}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/DefaultSQLExecuterHandler.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -16,12 +16,12 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.util.ArrayList;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetWrapper;
/**
* This default implementation of the sql executer handler simply notifies the
@@ -50,7 +50,7 @@
{
}
- public void sqlResultSetAvailable(ResultSet rst, SQLExecutionInfo info,
+ public void sqlResultSetAvailable(ResultSetWrapper rst, SQLExecutionInfo info,
IDataSetUpdateableTableModel model)
{
}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/ISQLExecuterHandler.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -17,12 +17,12 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-import java.sql.ResultSet;
import java.sql.SQLWarning;
import java.util.ArrayList;
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetWrapper;
/**
* This interface is the call back interface used during execution
@@ -61,7 +61,7 @@
* <p/>This callback is called from the thread that the SQLExecuter is running on.
* It may or may not be the Swing thread so card should be taken with any gui actions
*/
- public void sqlResultSetAvailable(ResultSet rst, SQLExecutionInfo info,
+ public void sqlResultSetAvailable(ResultSetWrapper rst, SQLExecutionInfo info,
IDataSetUpdateableTableModel model) throws DataSetException;
/** Called when the SQLExecutor succesfully completes execution of a sql
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SQLExecuterTask.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -30,7 +30,6 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
-import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.SwingUtilities;
@@ -38,15 +37,10 @@
import net.sourceforge.squirrel_sql.client.session.event.ISQLExecutionListener;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.client.session.schemainfo.SchemaInfoUpdateCheck;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetUpdateableTableModelListener;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataModelImplementationDetails;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
import net.sourceforge.squirrel_sql.fw.sql.IQueryTokenizer;
import net.sourceforge.squirrel_sql.fw.sql.ISQLConnection;
import net.sourceforge.squirrel_sql.fw.sql.ITableInfo;
-import net.sourceforge.squirrel_sql.fw.sql.SQLUtilities;
import net.sourceforge.squirrel_sql.fw.sql.TableInfo;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
@@ -78,7 +72,6 @@
/** SQL passed in to be executed. */
private String _sql;
- private Statement _stmt;
private boolean _stopExecution = false;
private int _currentQueryIndex = 0;
@@ -88,6 +81,7 @@
private IQueryTokenizer _tokenizer = null;
/** Whether or not to check if the schema should be updated */
private boolean schemaCheck = true;
+ private StatementWrapper _statementWrapper;
public SQLExecuterTask(ISession session, String sql,ISQLExecuterHandler handler)
{
@@ -150,21 +144,19 @@
try
{
final ISQLConnection conn = _session.getSQLConnection();
- _stmt = conn.createStatement();
+ _statementWrapper = new StatementWrapper(conn.createStatement(), _session);
try
{
- if(props.getSQLUseFetchSize() && props.getSQLFetchSize() > 0)
- {
- setFetchSize(props);
- }
+ _statementWrapper.setFetchSize();
+
-
- final boolean correctlySupportsMaxRows = conn.getSQLMetaData()
- .correctlySupportsSetMaxRows();
- if (correctlySupportsMaxRows && props.getSQLLimitRows())
+ final boolean correctlySupportsMaxRows = conn.getSQLMetaData().correctlySupportsSetMaxRows();
+
+ //boolean maxRowsHasBeenSet = false;
+ if (correctlySupportsMaxRows)
{
- setMaxRows(props);
+ _statementWrapper.setMaxRows();
}
if(_tokenizer.getQueryCount() == 0)
@@ -174,8 +166,6 @@
_currentQueryIndex = 0;
- // Process each individual query.
- boolean maxRowsHasBeenSet = correctlySupportsMaxRows;
int processedStatementCount = 0;
statementCount = _tokenizer.getQueryCount();
@@ -195,29 +185,24 @@
// Some driver don't correctly support setMaxRows. In
// these cases use setMaxRows only if this is a
// SELECT.
- if (!correctlySupportsMaxRows
- && props.getSQLLimitRows())
+ if (false == correctlySupportsMaxRows)
{
if (isSelectStatement(querySql))
{
- if (!maxRowsHasBeenSet)
- {
- setMaxRows(props);
- maxRowsHasBeenSet = true;
- }
+ _statementWrapper.setMaxRows();
}
- else if (maxRowsHasBeenSet)
+ else if (_statementWrapper.isMaxRowsWasSet())
{
- _stmt.close();
- _stmt = conn.createStatement();
- maxRowsHasBeenSet = false;
+ _statementWrapper.closeIfContinueReadIsNotActive();
+ _statementWrapper = new StatementWrapper(conn.createStatement(), _session);
}
}
+
try
{
lastExecutedStatement = querySql;
- if (!processQuery(querySql, processedStatementCount, statementCount))
+ if (!processQuery(querySql, processedStatementCount, statementCount, _statementWrapper))
{
break;
}
@@ -256,14 +241,7 @@
}
finally
{
- try
- {
- _stmt.close();
- }
- finally
- {
- _stmt = null;
- }
+ _statementWrapper.closeIfContinueReadIsNotActive();
}
}
catch (final Throwable ex)
@@ -294,9 +272,9 @@
}
try
{
- if (_stmt != null)
+ if (_statementWrapper != null)
{
- _stmt.cancel();
+ _statementWrapper.cancel();
}
}
catch (Throwable th)
@@ -340,33 +318,6 @@
}
}
- /**
- * Set the fetchSize Arrtibute for the SQL-Statement;
- */
- private void setFetchSize(SessionProperties props)
- {
- try
- {
- _stmt.setFetchSize(props.getSQLFetchSize());
- }
- catch (Exception e)
- {
- s_log.error("Can't Set FetchSize", e);
- }
- }
-
- private void setMaxRows(final SessionProperties props)
- {
- try
- {
- _stmt.setMaxRows(props.getSQLNbrRowsToShow());
- }
- catch (Exception e)
- {
- s_log.error("Can't Set MaxRows", e);
- }
- }
-
/**
* Returns a boolean indicating whether or not the specified querySql appears to be a SELECT statement.
*
@@ -395,23 +346,24 @@
_session.getApplication().getMessageHandler().showMessage(msg);
_stopExecution = true;
- if (_stmt != null)
+
+ if (null != _statementWrapper)
{
- CancelStatementThread cst = new CancelStatementThread(_stmt, _session.getApplication().getMessageHandler());
+ CancelStatementThread cst = new CancelStatementThread(_statementWrapper, _session.getApplication().getMessageHandler());
cst.tryCancel();
}
}
- private boolean processQuery(String sql, int processedStatementCount, int statementCount) throws SQLException
+ private boolean processQuery(String sql, int processedStatementCount, int statementCount, StatementWrapper statementWrapper) throws SQLException
{
++_currentQueryIndex;
- final SQLExecutionInfo exInfo = new SQLExecutionInfo( _currentQueryIndex, sql, getMaxRows(_stmt));
- boolean firstResultIsResultSet = _stmt.execute(sql);
+ final SQLExecutionInfo exInfo = new SQLExecutionInfo( _currentQueryIndex, sql, statementWrapper.getMaxRows());
+ boolean firstResultIsResultSet = statementWrapper.execute(sql);
exInfo.sqlExecutionComplete();
// Display any warnings generated by the SQL execution.
- handleAllWarnings(_session.getSQLConnection(), _stmt);
+ handleAllWarnings(_session.getSQLConnection(), statementWrapper);
boolean supportsMultipleResultSets = _session.getSQLConnection().getSQLMetaData().supportsMultipleResultSets();
boolean inFirstLoop = true;
@@ -427,16 +379,16 @@
}
- int updateCount = _stmt.getUpdateCount();
+ int updateCount = statementWrapper.getUpdateCount();
- ResultSet res = null;
+ ResultSetWrapper res = null;
if (inFirstLoop && firstResultIsResultSet)
{
- res = _stmt.getResultSet();
+ res = statementWrapper.getResultSetWrapper();
}
else if(false == inFirstLoop)
{
- res = _stmt.getResultSet();
+ res = statementWrapper.getResultSetWrapper();
}
@@ -464,9 +416,9 @@
// Each call to _stmt.getMoreResults() places the to the next output.
// As long as it is a ResultSet, we process it ...
- if(supportsMultipleResultSets && _stmt.getMoreResults())
+ if(supportsMultipleResultSets && statementWrapper.getMoreResults())
{
- res = _stmt.getResultSet();
+ res = statementWrapper.getResultSetWrapper();
moreResultsReceived = true;
}
else
@@ -478,7 +430,7 @@
if (moreResultsReceived) {
// ... now we have reached an output that is not a result. We now have to ask for this
// outputs update count - but only if we received more results.
- updateCount = _stmt.getUpdateCount();
+ updateCount = statementWrapper.getUpdateCount();
}
}
@@ -505,7 +457,7 @@
break;
}
- if (!_stmt.getMoreResults() && -1 == updateCount)
+ if (!statementWrapper.getMoreResults() && -1 == updateCount)
{
// There is no need to close result sets if we call _stmt.getMoreResults() because it
// implicitly closes any current ResultSet.
@@ -541,27 +493,6 @@
return true;
}
- /**
- * Some drivers, such as SQLite, don't properly support getMaxRows/setMaxRows for statements.
- *
- * @param stmt the statement to get the max rows that could be returned in a result set for.
- *
- * @return the max number of rows that could be returned by this statement
- */
- private int getMaxRows(Statement stmt) {
- int result = 0;
- try
- {
- result = stmt.getMaxRows();
- }
- catch (SQLException e)
- {
- if (s_log.isDebugEnabled()) {
- s_log.debug("Unexpected exception: "+e.getMessage(), e);
- }
- }
- return result;
- }
private void fireExecutionListeners(final String sql)
{
@@ -597,33 +528,41 @@
- private boolean processResultSet(final ResultSet rs, final SQLExecutionInfo exInfo)
+ private boolean processResultSet(final ResultSetWrapper rs, final SQLExecutionInfo exInfo)
{
if (_stopExecution)
{
return false;
}
- if (_handler != null) {
- try {
- _handler.sqlResultSetAvailable(rs, exInfo, this);
- } catch (DataSetException ex) {
- if (_stopExecution) {
- return false;
- } else {
- _session.showMessage(ex);
- s_log.error("Error reading ResultSet for SQL: "
- + exInfo.getSQL(), ex);
- }
+ if (_handler != null)
+ {
+ try
+ {
+ _handler.sqlResultSetAvailable(rs, exInfo, this);
+ }
+ catch (DataSetException ex)
+ {
+ if (_stopExecution)
+ {
+ return false;
}
- }
+ else
+ {
+ _session.showMessage(ex);
+ s_log.error("Error reading ResultSet for SQL: "
+ + exInfo.getSQL(), ex);
+ }
+ }
+ }
- handleResultSetWarnings(rs);
- SQLUtilities.closeResultSet(rs);
+ handleResultSetWarnings(rs.getResultSet());
+
+ rs.closeIfContinueReadIsNotActive();
return true;
}
- private void handleAllWarnings(ISQLConnection conn, Statement stmt)
+ private void handleAllWarnings(ISQLConnection conn, StatementWrapper stmtWrapper)
{
// If SQL executing produced warnings then write them out to the session
// message handler. TODO: This is a pain. PostgreSQL sends "raise
@@ -645,8 +584,8 @@
try
{
- handleWarnings(stmt.getWarnings());
- stmt.clearWarnings();
+ handleWarnings(stmtWrapper.getWarnings());
+ stmtWrapper.clearWarnings();
}
catch (Throwable th)
{
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/StatementWrapper.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/StatementWrapper.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/StatementWrapper.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,231 @@
+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;
+ }
+ }
+
+
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CurrentSqlLabelController.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CurrentSqlLabelController.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/CurrentSqlLabelController.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,54 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
+
+import javax.swing.*;
+
+public class CurrentSqlLabelController
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CurrentSqlLabelController.class);
+
+
+ private String _sql;
+ private JLabel _lbl = new JLabel();
+
+ public CurrentSqlLabelController()
+ {
+ }
+
+ public void reInit(int rowCount, boolean areAllPossibleResultsOfSQLRead)
+ {
+ String escapedSql = Utilities.escapeHtmlChars(_sql);
+
+ if (areAllPossibleResultsOfSQLRead)
+ {
+ // i18n[ResultTab.rowsMessage=Rows {0}]
+ String rowsMsg = s_stringMgr.getString("ResultTab.rowsMessage", Integer.valueOf(rowCount));
+ _lbl.setText("<html><pre> " + rowsMsg + "; " + escapedSql + "</pre></html>");
+ }
+ else
+ {
+ // i18n[ResultTab.limitMessage=Limited to <font color='red'> {0} </font> rows]
+ String limitMsg = s_stringMgr.getString("ResultTab.limitMessage", Integer.valueOf(rowCount));
+ _lbl.setText("<html><pre> " + limitMsg + "; " + escapedSql + "</pre></html>");
+ }
+ }
+
+ public void clear()
+ {
+ _sql = "";
+ _lbl.setText("");
+ }
+
+ public JLabel getLabel()
+ {
+ return _lbl;
+ }
+
+ public void setSql(String sql)
+ {
+ _sql = sql;
+ }
+}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/IResultTab.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -70,10 +70,7 @@
*/
String getTitle();
- /**
- * Close this tab.
- */
- void closeTab();
+ void closeTab();
void returnToTabbedPane();
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/PleaseWaitDialog.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -23,6 +23,7 @@
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.session.CancelStatementThread;
+import net.sourceforge.squirrel_sql.client.session.StatementWrapper;
import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
@@ -40,7 +41,6 @@
* @author Thorsten Mürell
*/
public class PleaseWaitDialog extends DialogWidget implements ActionListener {
- private static final long serialVersionUID = 8870277695490954084L;
private static final StringManager stringMgr =
StringManagerFactory.getStringManager(PleaseWaitDialog.class);
@@ -104,7 +104,7 @@
public void actionPerformed(ActionEvent e) {
if (stmt != null) {
- CancelStatementThread cst = new CancelStatementThread(stmt, messageHandler);
+ CancelStatementThread cst = new CancelStatementThread(new StatementWrapper(stmt), messageHandler);
cst.tryCancel();
}
}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/QueryInfoPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/QueryInfoPanel.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/QueryInfoPanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -24,15 +24,19 @@
createGUI();
}
- void load(int rowCount,
- SQLExecutionInfo exInfo)
+ void load(int rowCount, SQLExecutionInfo exInfo)
{
_queryLbl.setText(StringUtilities.cleanString(exInfo.getSQL()));
- _rowCountLbl.setText(String.valueOf(rowCount));
+ displayRowCount(rowCount);
_executedLbl.setText(exInfo.getSQLExecutionStartTime().toString());
_elapsedLbl.setText(formatElapsedTime(exInfo));
}
+ public void displayRowCount(int rowCount)
+ {
+ _rowCountLbl.setText(String.valueOf(rowCount));
+ }
+
private String formatElapsedTime(SQLExecutionInfo exInfo)
{
final NumberFormat nbrFmt = NumberFormat.getNumberInstance();
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandler.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandler.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,89 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+import net.sourceforge.squirrel_sql.client.resources.SquirrelResources;
+import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ReadMoreResultsHandlerListener;
+
+import javax.swing.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class ReadMoreResultsHandler
+{
+ private ISession _session;
+ private final JLabel _lblLoading;
+ private final ImageIcon _loadingGif;
+ private ExecutorService _executorService;
+ private Future<SwingWorker<SwingWorker, Object>> _future;
+
+
+ public ReadMoreResultsHandler(ISession session)
+ {
+ _session = session;
+
+ _loadingGif = _session.getApplication().getResources().getIcon(SquirrelResources.IImageNames.LOADING_GIF);
+ _lblLoading = new JLabel(_loadingGif);
+ _lblLoading.setVisible(false);
+
+ _executorService = Executors.newFixedThreadPool(1);
+
+ }
+
+ public void readMoreResults(final ResultSetDataSet rsds, final ReadMoreResultsHandlerListener readChannelCallBack)
+ {
+ if(null != _future && false == _future.isDone())
+ {
+ return;
+ }
+
+ _lblLoading.setVisible(true);
+
+ SwingWorker<SwingWorker, Object> sw =
+ new SwingWorker<SwingWorker, Object>()
+ {
+ @Override
+ protected SwingWorker doInBackground()
+ {
+ rsds.readMoreResults();
+ return this;
+ }
+
+ @Override
+ protected void done()
+ {
+ try
+ {
+ get();
+ onReadMoreResultsDone(readChannelCallBack);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+
+ _future = (Future<SwingWorker<SwingWorker, Object>>) _executorService.submit(sw);
+ }
+
+ private void onReadMoreResultsDone(net.sourceforge.squirrel_sql.fw.datasetviewer.ReadMoreResultsHandlerListener readChannelCallBack)
+ {
+ try
+ {
+ _lblLoading.setVisible(false);
+ readChannelCallBack.moreResultsHaveBeenRead();
+ }
+ catch (Throwable t)
+ {
+ throw new RuntimeException(t);
+ }
+ }
+
+ public JLabel getLoadingLabel()
+ {
+ return _lblLoading;
+ }
+
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandlerListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandlerListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ReadMoreResultsHandlerListener.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,6 @@
+package net.sourceforge.squirrel_sql.client.session.mainpanel;
+
+public interface ReadMoreResultsHandlerListener
+{
+ void moreResultsHaveBeenRead();
+}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/ResultTab.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -36,6 +36,7 @@
import net.sourceforge.squirrel_sql.client.session.*;
import net.sourceforge.squirrel_sql.client.session.mainpanel.overview.OverviewCtrl;
import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.ReadMoreResultsHandlerListener;
import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.DataSetViewerFindDecorator;
import net.sourceforge.squirrel_sql.fw.id.IHasIdentifier;
import net.sourceforge.squirrel_sql.fw.id.IIdentifier;
@@ -47,7 +48,6 @@
import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
-import net.sourceforge.squirrel_sql.fw.util.Utilities;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
@@ -82,7 +82,7 @@
private SQLResultExecuterPanelFacade _sqlResultExecuterPanelFacade;
/** Label shows the current SQL script. */
- private JLabel _currentSqlLbl = new JLabel();
+ private CurrentSqlLabelController _currentSqlLblCtrl = new CurrentSqlLabelController();
/** The SQL execurtes, cleaned up for display. */
private String _sql;
@@ -99,7 +99,6 @@
private ResultSetDataSet _rsds;
- /** Internationalized strings for this class. */
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ResultTab.class);
private static ILogger s_log = LoggerController.createLogger(ResultTab.class);
@@ -107,6 +106,8 @@
private ResultTabListener _resultTabListener;
+ private ReadMoreResultsHandler _readMoreResultsHandler;
+ private boolean _tabIsClosing;
/**
* Ctor.
@@ -146,11 +147,14 @@
init(creator, exInfo);
+
+ _readMoreResultsHandler = new ReadMoreResultsHandler(_session);
+
createGUI();
propertiesHaveChanged(null);
}
- /**
+ /**
* @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#reInit(net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel, net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo)
*/
private void init(IDataSetUpdateableTableModel creator, SQLExecutionInfo exInfo)
@@ -242,27 +246,18 @@
_exInfo = exInfo;
_sql = StringUtilities.cleanString(exInfo.getSQL());
+
+ _rsds = rsds;
+
// Display the result set.
_resultSetOutput.getDataSetViewer().show(rsds, null);
- _rsds = rsds;
+ initContinueReadChannel(_resultSetOutput);
- final int rowCount = _resultSetOutput.getDataSetViewer().getRowCount();
- final int maxRows =_exInfo.getMaxRows();
- String escapedSql = Utilities.escapeHtmlChars(_sql);
+ final int rowCount = _rsds.currentRowCount();
- if (maxRows > 0 && rowCount >= maxRows)
- {
- // i18n[ResultTab.limitMessage=Limited to <font color='red'> {0} </font> rows]
- String limitMsg = s_stringMgr.getString("ResultTab.limitMessage", Integer.valueOf(rowCount));
- _currentSqlLbl.setText("<html><pre> " + limitMsg + "; " + escapedSql + "</pre></html>");
- }
- else
- {
- // i18n[ResultTab.rowsMessage=Rows {0}]
- String rowsMsg = s_stringMgr.getString("ResultTab.rowsMessage", Integer.valueOf(rowCount));
- _currentSqlLbl.setText("<html><pre> " + rowsMsg + "; " + escapedSql + "</pre></html>");
- }
+ _currentSqlLblCtrl.setSql(_sql);
+ _currentSqlLblCtrl.reInit(_rsds.currentRowCount(), _rsds.areAllPossibleResultsOfSQLRead());
// Display the result set metadata.
if (mdds != null && _metaDataOutput != null)
@@ -273,22 +268,76 @@
_queryInfoPanel.load(rowCount, _exInfo);
}
+
+ private void initContinueReadChannel(DataSetViewerFindDecorator resultSetOutput)
+ {
+ final ReadMoreResultsHandlerListener readMoreResultsHandlerListener = new ReadMoreResultsHandlerListener()
+ {
+ @Override
+ public void moreResultsHaveBeenRead()
+ {
+ onMoreResultsHaveBeenRead();
+ }
+ };
+
+ resultSetOutput.getDataSetViewer().setContinueReadChannel(new ContinueReadChannel()
+ {
+ @Override
+ public void readMoreResults()
+ {
+ onReadMoreResults(readMoreResultsHandlerListener);
+ }
+
+ @Override
+ public void closeStatementAndResultSet()
+ {
+ onCloseStatementAndResultSet();
+ }
+ });
+ }
+
+ private void onCloseStatementAndResultSet()
+ {
+ _rsds.closeStatementAndResultSet();
+ }
+
+ private void onReadMoreResults(ReadMoreResultsHandlerListener readMoreResultsHandlerListener)
+ {
+ if(_rsds.isAllResultsRead())
+ {
+ return;
+ }
+
+ _readMoreResultsHandler.readMoreResults(_rsds, readMoreResultsHandlerListener);
+ }
+
+ private void onMoreResultsHaveBeenRead()
+ {
+ try
+ {
+
+ TableState resultSortableTableState = getTableState(_resultSetOutput.getDataSetViewer());
+ _resultSetOutput.getDataSetViewer().show(_rsds, null);
+ restoreTableState(resultSortableTableState, _resultSetOutput.getDataSetViewer());
+
+ _currentSqlLblCtrl.reInit(_rsds.currentRowCount(), _rsds.areAllPossibleResultsOfSQLRead());
+ _queryInfoPanel.displayRowCount(_rsds.currentRowCount());
+
+ reInitOverview();
+
+ }
+ catch (DataSetException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
/**
* @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#clear()
*/
public void clear()
{
- if (_metaDataOutput != null)
- {
- _metaDataOutput.clear();
- }
- if (_resultSetOutput != null)
- {
- _resultSetOutput.getDataSetViewer().clear();
- }
- _exInfo = null;
- _currentSqlLbl.setText("");
- _sql = "";
+ closeTab();
}
/**
@@ -320,15 +369,38 @@
return title.substring(0, 15);
}
- /**
- * @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#closeTab()
- */
- public void closeTab()
- {
- add(_tabResultTabs, BorderLayout.CENTER);
- _sqlResultExecuterPanelFacade.closeResultTab(this);
- }
+ public void closeTab()
+ {
+ if(_tabIsClosing)
+ {
+ return;
+ }
+ try
+ {
+ _tabIsClosing = true;
+
+ if (_metaDataOutput != null)
+ {
+ _metaDataOutput.clear();
+ }
+ if (_resultSetOutput != null)
+ {
+ _resultSetOutput.getDataSetViewer().clear();
+ }
+ _exInfo = null;
+ _currentSqlLblCtrl.clear();
+ _sql = "";
+
+ _sqlResultExecuterPanelFacade.closeResultTab(this);
+ _rsds.closeStatementAndResultSet();
+ }
+ finally
+ {
+ _tabIsClosing = false;
+ }
+ }
+
/**
* @see net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab#returnToTabbedPane()
*/
@@ -381,13 +453,11 @@
// _resultSetOutput = new DataSetViewerFindDecorator(dataSetViewer);
_resultSetOutput.replaceDataSetViewer(dataSetViewer);
- // SCROLL
- // _resultSetSp.setViewportView(_resultSetOutput.getComponent());
- // _resultSetSp.setRowHeader(null);
-
_rsds.resetCursor();
_resultSetOutput.getDataSetViewer().show(_rsds, null);
+ initContinueReadChannel(_resultSetOutput);
+
restoreTableState(resultSortableTableState, _resultSetOutput.getDataSetViewer());
}
else
@@ -406,16 +476,12 @@
TableState resultSortableTableState = getTableState(_resultSetOutput.getDataSetViewer());
IDataSetViewer dataSetViewer = BaseDataSetViewerDestination.getInstance(readOnlyOutput, _creator, new DefaultDataModelImplementationDetails(_session));
- // _resultSetOutput = new DataSetViewerFindDecorator(dataSetViewer);
_resultSetOutput.replaceDataSetViewer(dataSetViewer);
- // SCROLL
- // _resultSetSp.setViewportView(_resultSetOutput.getComponent());
- // _resultSetSp.setRowHeader(null);
-
_rsds.resetCursor();
_resultSetOutput.getDataSetViewer().show(_rsds, null);
+ initContinueReadChannel(_resultSetOutput);
restoreTableState(resultSortableTableState, _resultSetOutput.getDataSetViewer());
}
@@ -447,7 +513,6 @@
private void createGUI()
{
- // final Resources rsrc = _session.getApplication().getResources();
setLayout(new BorderLayout());
int sqlResultsTabPlacement = _session.getProperties().getSQLResultsTabPlacement();
@@ -456,13 +521,16 @@
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(1, 3, 0, 0));
+
+ panel2.add(_readMoreResultsHandler.getLoadingLabel());
+
panel2.add(new TabButton(new RerunAction(_session.getApplication())));
panel2.add(new TabButton(new FindInResultAction(_session.getApplication())));
panel2.add(new TabButton(new CreateResultTabFrameAction(_session.getApplication())));
panel2.add(new TabButton(new CloseAction()));
panel1.setLayout(new BorderLayout());
panel1.add(panel2, BorderLayout.EAST);
- panel1.add(_currentSqlLbl, BorderLayout.CENTER);
+ panel1.add(_currentSqlLblCtrl.getLabel(), BorderLayout.CENTER);
add(panel1, BorderLayout.NORTH);
add(_tabResultTabs, BorderLayout.CENTER);
@@ -492,6 +560,17 @@
_tabResultTabs.addTab(infoTabTitle, sp);
+ reInitOverview();
+
+ }
+
+ private void reInitOverview()
+ {
+ if(OverviewCtrl.isOverviewPanel(_tabResultTabs.getComponentAt(_tabResultTabs.getTabCount()-1)))
+ {
+ _tabResultTabs.removeTabAt(_tabResultTabs.getTabCount()-1);
+ }
+
final int overViewIx = _tabResultTabs.getTabCount();
final OverviewCtrl ctrl = new OverviewCtrl(_session);
_tabResultTabs.addTab(ctrl.getTitle(), ctrl.getPanel());
@@ -507,9 +586,8 @@
}
}
});
+ }
- }
-
private class CloseAction extends SquirrelAction
{
CloseAction()
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLExecutionHandler.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -4,10 +4,7 @@
import net.sourceforge.squirrel_sql.client.session.*;
import net.sourceforge.squirrel_sql.client.session.event.ISQLExecutionListener;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetMetaDataDataSet;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory;
import net.sourceforge.squirrel_sql.fw.dialects.DialectType;
import net.sourceforge.squirrel_sql.fw.sql.SQLExecutionException;
@@ -17,7 +14,6 @@
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.SQLWarning;
import java.text.NumberFormat;
import java.util.ArrayList;
@@ -389,7 +385,7 @@
_session.showMessage(msg);
}
- public void sqlResultSetAvailable(ResultSet rs, SQLExecutionInfo info, IDataSetUpdateableTableModel model)
+ public void sqlResultSetAvailable(ResultSetWrapper rs, SQLExecutionInfo info, IDataSetUpdateableTableModel model)
throws DataSetException
{
// i18n[SQLResultExecuterPanel.outputStatus=Building output...]
@@ -404,14 +400,14 @@
ResultSetMetaDataDataSet rsmdds = null;
if (props.getShowResultsMetaData())
{
- rsmdds = new ResultSetMetaDataDataSet(rs);
+ rsmdds = new ResultSetMetaDataDataSet(rs.getResultSet());
}
DialectType dialectType =
DialectFactory.getDialectType(_session.getMetaData());
// rsds.setContentsTabResultSet() reads the result set. So results processing on the DB is over
// and this time is measured. None is interested in the time that it takes us to render Swing tables ...
- info.resultsProcessingComplete(rsds.setContentsTabResultSet(rs, null, dialectType));
+ info.resultsProcessingComplete(rsds.setSqlExecutionTabResultSet(rs, null, dialectType));
_executionHandlerListener.addResultsTab(info, rsds, rsmdds, model, _resultTabToReplace);
@@ -421,8 +417,7 @@
* the GC can clean them.
*/
rsds = null;
- }
-
+ }
}
public void sqlExecutionWarning(SQLWarning warn)
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLPanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -42,7 +42,6 @@
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
-import javax.swing.JCheckBox;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
@@ -52,8 +51,6 @@
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
import javax.swing.event.EventListenerList;
import javax.swing.plaf.SplitPaneUI;
import javax.swing.plaf.basic.BasicSplitPaneUI;
@@ -72,9 +69,10 @@
import net.sourceforge.squirrel_sql.client.session.event.SQLExecutionAdapter;
import net.sourceforge.squirrel_sql.client.session.event.SQLPanelEvent;
import net.sourceforge.squirrel_sql.client.session.event.SQLResultExecuterTabEvent;
+import net.sourceforge.squirrel_sql.client.session.properties.ResultLimitAndReadOnPanelSmallPanel;
+import net.sourceforge.squirrel_sql.client.session.properties.SQLResultConfigCtrl;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.fw.gui.FontInfo;
-import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
import net.sourceforge.squirrel_sql.fw.gui.MemoryComboBox;
import net.sourceforge.squirrel_sql.fw.sql.ISQLConnection;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
@@ -88,8 +86,6 @@
*/
public class SQLPanel extends JPanel
{
- private static final long serialVersionUID = 1L;
-
/** Logger for this class. */
private static final ILogger s_log = LoggerController.createLogger(SQLPanel.class);
@@ -110,13 +106,11 @@
transient private ISession _session;
private SQLHistoryComboBox _sqlCombo;
- transient private ISQLEntryPanel _sqlEntry;
- private JCheckBox _limitRowsChk;
- private IntegerField _nbrRows = new IntegerField();
+ private ISQLEntryPanel _sqlEntry;
- transient private SqlComboListener _sqlComboListener = new SqlComboListener();
- transient private MyPropertiesListener _propsListener;
+ private SqlComboListener _sqlComboListener = new SqlComboListener();
+ private MyPropertiesListener _propsListener;
/** Each tab is a <TT>ResultTab</TT> showing the results of a query. */
// private JTabbedPane _tabbedResultsPanel;
@@ -178,8 +172,10 @@
transient private SQLPanel.SQLExecutorHistoryListener _sqlExecutorHistoryListener = new SQLExecutorHistoryListener();
private ArrayList<SqlPanelListener> _sqlPanelListeners = new ArrayList<SqlPanelListener>();
private IUndoHandler _undoHandler;
+ private ResultLimitAndReadOnPanelSmallPanel _resultLimitAndReadOnPanelSmallPanel = new ResultLimitAndReadOnPanelSmallPanel();
+
/**
* Ctor.
*
@@ -199,6 +195,7 @@
_sqlExecPanel.addSQLExecutionListener(_sqlExecutorHistoryListener);
addExecutor(_sqlExecPanel);
_panelAPI = new SQLPanelAPI(this);
+ _resultLimitAndReadOnPanelSmallPanel.loadData(session.getProperties());
}
/**
@@ -700,15 +697,24 @@
if (propName == null || propName.equals(SessionProperties.IPropertyNames.SQL_LIMIT_ROWS))
{
- _limitRowsChk.setSelected(props.getSQLLimitRows());
+ _resultLimitAndReadOnPanelSmallPanel.propsChanged(props);
}
- if (propName == null
- || propName.equals(SessionProperties.IPropertyNames.SQL_NBR_ROWS_TO_SHOW))
+ if (propName == null || propName.equals(SessionProperties.IPropertyNames.SQL_NBR_ROWS_TO_SHOW))
{
- _nbrRows.setInt(props.getSQLNbrRowsToShow());
+ _resultLimitAndReadOnPanelSmallPanel.propsChanged(props);
}
+ if (propName == null || propName.equals(SessionProperties.IPropertyNames.SQL_READ_ON))
+ {
+ _resultLimitAndReadOnPanelSmallPanel.propsChanged(props);
+ }
+
+ if (propName == null || propName.equals(SessionProperties.IPropertyNames.SQL_READ_ON_BLOCK_SIZE))
+ {
+ _resultLimitAndReadOnPanelSmallPanel.propsChanged(props);
+ }
+
if (propName == null || propName.equals(SessionProperties.IPropertyNames.FONT_INFO))
{
FontInfo fi = props.getFontInfo();
@@ -792,7 +798,6 @@
setLayout(new BorderLayout());
- _nbrRows.setColumns(8);
final SessionProperties props = _session.getProperties();
_sqlCombo = new SQLHistoryComboBox(props.getSQLShareHistory());
@@ -811,13 +816,7 @@
box.add(new CopyLastButton(app));
box.add(new ShowHistoryButton(app));
box.add(Box.createHorizontalStrut(10));
- // i18n[SQLPanel.limitrowscheckbox.hint=Limit rows: ]
- String hint =
- s_stringMgr.getString("SQLPanel.limitrowscheckbox.label");
- _limitRowsChk = new JCheckBox(hint);
- box.add(_limitRowsChk);
- box.add(Box.createHorizontalStrut(5));
- box.add(_nbrRows);
+ box.add(_resultLimitAndReadOnPanelSmallPanel);
pnl.add(box, BorderLayout.EAST);
add(pnl, BorderLayout.NORTH);
}
@@ -842,8 +841,6 @@
add(_splitPane, BorderLayout.CENTER);
_sqlCombo.addActionListener(_sqlComboListener);
- _limitRowsChk.addChangeListener(new LimitRowsCheckBoxListener());
- _nbrRows.getDocument().addDocumentListener(new LimitRowsTextBoxListener());
// Set focus to the SQL entry panel.
SwingUtilities.invokeLater(new Runnable()
@@ -1037,70 +1034,9 @@
// }
}
- private class LimitRowsCheckBoxListener implements ChangeListener
- {
- public void stateChanged(ChangeEvent evt)
- {
- if (_propsListener != null)
- {
- _propsListener.stopListening();
- }
- try
- {
- final boolean limitRows = ((JCheckBox)evt.getSource()).isSelected();
- _nbrRows.setEnabled(limitRows);
- _session.getProperties().setSQLLimitRows(limitRows);
- }
- finally
- {
- if (_propsListener != null)
- {
- _propsListener.startListening();
- }
- }
- }
- }
- private class LimitRowsTextBoxListener implements DocumentListener
+ private class CopyLastButton extends JButton
{
- public void insertUpdate(DocumentEvent evt)
- {
- updateProperties(evt);
- }
-
- public void changedUpdate(DocumentEvent evt)
- {
- updateProperties(evt);
- }
-
- public void removeUpdate(DocumentEvent evt)
- {
- updateProperties(evt);
- }
- @SuppressWarnings("unused")
- private void updateProperties(DocumentEvent evt)
- {
- if (_propsListener != null)
- {
- _propsListener.stopListening();
- }
- try
- {
- _session.getProperties().setSQLNbrRowsToShow(_nbrRows.getInt());
- }
- finally
- {
- if (_propsListener != null)
- {
- _propsListener.startListening();
- }
- }
- }
- }
-
-
- private class CopyLastButton extends JButton
- {
private static final long serialVersionUID = 1L;
CopyLastButton(IApplication app)
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/s...
[truncated message content] |