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/session/mainpanel/SQLResultExecuterPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/SQLResultExecuterPanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -20,7 +20,6 @@
import net.sourceforge.squirrel_sql.client.action.ActionCollection;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
-import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.SQLExecutionInfo;
@@ -516,16 +515,8 @@
}
- /**
- * Close the passed <TT>ResultTab</TT>. This is done by clearing
- * all data from the tab, removing it from the tabbed panel
- * and adding it to the list of available tabs.
- *
- * @throws IllegalArgumentException
- * Thrown if a <TT>null</TT> <TT>ResultTab</TT> passed.
- */
- private void closeResultTab(ResultTab tab)
- {
+ private void closeResultTab(ResultTab tab)
+ {
if (tab == null)
{
throw new IllegalArgumentException("Null ResultTab passed");
@@ -533,7 +524,7 @@
s_log
.debug("SQLPanel.closeResultTab(" + tab.getIdentifier().toString()
+ ")");
- tab.clear();
+ tab.closeTab();
_tabbedExecutionsPanel.remove(tab);
}
Modified: 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/objecttree/tabs/table/ContentsTab.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/objecttree/tabs/table/ContentsTab.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -26,19 +26,14 @@
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.session.DataSetUpdateableTableModelImpl;
import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.client.session.StatementWrapper;
import net.sourceforge.squirrel_sql.client.session.mainpanel.PleaseWaitDialog;
import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.ObjectTreePanel;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.client.session.sqlfilter.OrderByClausePanel;
import net.sourceforge.squirrel_sql.client.session.sqlfilter.SQLFilterClauses;
import net.sourceforge.squirrel_sql.client.session.sqlfilter.WhereClausePanel;
-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.IDataSet;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.IDataSetUpdateableTableModel;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.ResultSetDataSet;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.*;
import net.sourceforge.squirrel_sql.fw.dialects.DialectFactory;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.sql.IDatabaseObjectInfo;
@@ -85,12 +80,12 @@
private ObjectTreePanel _treePanel = null;
-
+
private PleaseWaitDialog _waitDialog = null;
private SquirrelPreferences _prefs = null;
- public ContentsTab(ObjectTreePanel treePanel) {
+ public ContentsTab(ObjectTreePanel treePanel) {
_treePanel = treePanel;
_prefs = _treePanel.getSession().getApplication().getSquirrelPreferences();
Modified: 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/mainpanel/overview/OverviewCtrl.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/mainpanel/overview/OverviewCtrl.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -330,7 +330,7 @@
return s_stringMgr.getString("OverwiewCtrl.title_new");
}
- public Component getPanel()
+ public OverviewPanel getPanel()
{
return _overviewPanel;
}
@@ -464,4 +464,9 @@
}
}
+
+ public static boolean isOverviewPanel(Component component)
+ {
+ return component instanceof OverviewPanel;
+ }
}
Added: 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/ResultLimitAndReadOnPanelSmallPanel.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/ResultLimitAndReadOnPanelSmallPanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,213 @@
+package net.sourceforge.squirrel_sql.client.session.properties;
+
+import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+import javax.swing.*;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+public class ResultLimitAndReadOnPanelSmallPanel extends JPanel
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(SQLResultConfigCtrl.class);
+ public static final String CBO_LIMIT_ROWS = s_stringMgr.getString("ResultLimitAndReadOnPanelSmallPanel.limitRows");
+ public static final String CBO_READ_ON_BLOCK_SIZE = s_stringMgr.getString("ResultLimitAndReadOnPanelSmallPanel.readOnWithBlockSize");
+
+
+ private JCheckBox _chkLimitRowsEnabled;
+ private JComboBox _cboLimitOrReadOn;
+ private IntegerField _txtLimitOrBlockSize;
+ private SessionProperties _props;
+ private boolean _inLoadData = false;
+ private boolean _inEvent;
+
+ public ResultLimitAndReadOnPanelSmallPanel()
+ {
+ createUI();
+
+ _chkLimitRowsEnabled.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ onChkLimitRowsEnabled();
+ }
+ });
+
+
+ _cboLimitOrReadOn.addItemListener(new ItemListener()
+ {
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ onCboLimitOrReadOnChanged(e);
+ }
+ });
+
+ _txtLimitOrBlockSize.getDocument().addDocumentListener(new DocumentListener()
+ {
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ onLimitOrBlockSizeChanged();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ onLimitOrBlockSizeChanged();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ onLimitOrBlockSizeChanged();
+ }
+ });
+ }
+
+ private void onLimitOrBlockSizeChanged()
+ {
+ if(_inLoadData || _inEvent || 0 >= _txtLimitOrBlockSize.getInt())
+ {
+ return;
+ }
+
+ try
+ {
+ _inEvent = true;
+
+ if(CBO_LIMIT_ROWS == _cboLimitOrReadOn.getSelectedItem())
+ {
+ _props.setSQLNbrRowsToShow(_txtLimitOrBlockSize.getInt());
+ }
+ else
+ {
+ _props.setSQLReadOnBlockSize(_txtLimitOrBlockSize.getInt());
+ }
+ }
+ finally
+ {
+ _inEvent = false;
+ }
+
+
+ }
+
+ private void onCboLimitOrReadOnChanged(ItemEvent e)
+ {
+ try
+ {
+ if(_inLoadData || _inEvent || ItemEvent.SELECTED != e.getStateChange())
+ {
+ return;
+ }
+
+ _inEvent = true;
+
+ if(CBO_READ_ON_BLOCK_SIZE == _cboLimitOrReadOn.getSelectedItem())
+ {
+ _props.setSQLReadOn(true);
+ _txtLimitOrBlockSize.setInt(_props.getSQLReadOnBlockSize());
+ }
+ else
+ {
+ _props.setSQLReadOn(false);
+ _txtLimitOrBlockSize.setInt(_props.getSQLNbrRowsToShow());
+
+ if(0 < _props.getSQLNbrRowsToShow())
+ {
+ // If we switch the combo box back to limit rows, make sure the check box is selected.
+ _props.setSQLLimitRows(true);
+ }
+ }
+
+ }
+ finally
+ {
+ _inEvent = false;
+ }
+ loadData(_props);
+
+ }
+
+ private void onChkLimitRowsEnabled()
+ {
+ if(_inLoadData || _inEvent)
+ {
+ return;
+ }
+
+ _props.setSQLLimitRows(_chkLimitRowsEnabled.isSelected());
+ loadData(_props);
+ }
+
+ private void createUI()
+ {
+ setLayout(new GridBagLayout());
+
+ GridBagConstraints gbc;
+
+ gbc = new GridBagConstraints(0,0,1,1,0,0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,2),0,0);
+ _chkLimitRowsEnabled = new JCheckBox();
+ add(_chkLimitRowsEnabled, gbc);
+
+ gbc = new GridBagConstraints(1,0,1,1,0,0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,5),0,0);
+ _cboLimitOrReadOn = new JComboBox(new Object[]{CBO_LIMIT_ROWS, CBO_READ_ON_BLOCK_SIZE});
+ add(_cboLimitOrReadOn, gbc);
+
+ gbc = new GridBagConstraints(2,0,1,1,1,0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,0,0,5),0,0);
+ _txtLimitOrBlockSize = new IntegerField(10);
+ add(_txtLimitOrBlockSize, gbc);
+ }
+
+
+ public void loadData(SessionProperties props)
+ {
+ if(_inLoadData || _inEvent)
+ {
+ return;
+ }
+
+ try
+ {
+ _inLoadData = true;
+ _props = props;
+
+ if(_props.getSQLReadOn())
+ {
+ _cboLimitOrReadOn.setSelectedItem(CBO_READ_ON_BLOCK_SIZE);
+ _chkLimitRowsEnabled.setEnabled(false);
+ _txtLimitOrBlockSize.setEnabled(true);
+ _txtLimitOrBlockSize.setInt(_props.getSQLReadOnBlockSize());
+
+ _cboLimitOrReadOn.setToolTipText(s_stringMgr.getString("ResultLimitAndReadOnPanelSmallPanel.readOnWarningHtml"));
+
+ }
+ else
+ {
+ _cboLimitOrReadOn.setSelectedItem(CBO_LIMIT_ROWS);
+ _chkLimitRowsEnabled.setEnabled(true);
+ _chkLimitRowsEnabled.setSelected(_props.getSQLLimitRows());
+ _txtLimitOrBlockSize.setInt(_props.getSQLNbrRowsToShow());
+ _txtLimitOrBlockSize.setEnabled(_props.getSQLLimitRows());
+ _cboLimitOrReadOn.setToolTipText(null);
+ }
+ }
+ finally
+ {
+ _inLoadData = false;
+ }
+ }
+
+ public void propsChanged(SessionProperties props)
+ {
+ loadData(props);
+ }
+}
Added: 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/SQLResultConfigCtrl.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrl.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,196 @@
+package net.sourceforge.squirrel_sql.client.session.properties;
+
+import com.jidesoft.swing.MultilineLabel;
+import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
+import net.sourceforge.squirrel_sql.fw.util.StringManager;
+import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class SQLResultConfigCtrl
+{
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(SQLResultConfigCtrl.class);
+
+
+ private JCheckBox _sqlLimitRowsChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.limitrows"));
+ private IntegerField _sqlNbrRowsToShowField = new IntegerField(10);
+
+
+ private JCheckBox _sqlReadOnChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.readOn"));
+ private IntegerField _sqlReadOnBlockSize = new IntegerField(10);
+
+ private MultilineLabel _lblReadOnWarning = new MultilineLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.readOnWarning"));
+
+
+ private JCheckBox _sqlUseFetchSizeChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.fetchSize"));
+ private IntegerField _sqlFetchSizeField = new IntegerField(10);
+
+ private boolean _inUpdateControlStatus;
+
+ public SQLResultConfigCtrl()
+ {
+
+ ActionListener actionListener = new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ updateCheckBoxStatus(evt);
+ }
+ };
+
+ _sqlLimitRowsChk.addActionListener(actionListener);
+ _sqlReadOnChk.addActionListener(actionListener);
+ _sqlUseFetchSizeChk.addActionListener(actionListener);
+ }
+
+
+ public void loadData(SessionProperties props)
+ {
+
+ _sqlLimitRowsChk.setSelected(props.getSQLLimitRows());
+ _sqlNbrRowsToShowField.setInt(props.getSQLNbrRowsToShow());
+
+ _sqlUseFetchSizeChk.setSelected(props.getSQLUseFetchSize());
+ _sqlFetchSizeField.setInt(props.getSQLFetchSize());
+
+ _sqlReadOnChk.setSelected(props.getSQLReadOn());
+ _sqlReadOnBlockSize.setInt(props.getSQLReadOnBlockSize());
+
+ updateCheckBoxStatus(null);
+ }
+
+ public boolean isLimitRows()
+ {
+ return _sqlLimitRowsChk.isSelected();
+ }
+
+ public int getNbrRowsToShow()
+ {
+ return _sqlNbrRowsToShowField.getInt();
+ }
+
+ public boolean isUseFetchSize()
+ {
+ return _sqlUseFetchSizeChk.isSelected();
+ }
+
+ public int getFetchSize()
+ {
+ return _sqlFetchSizeField.getInt();
+ }
+
+ public boolean isReadOn()
+ {
+ return _sqlReadOnChk.isSelected();
+ }
+
+ public int getReadOnBlockSize()
+ {
+ return _sqlReadOnBlockSize.getInt();
+ }
+
+
+
+ private void updateCheckBoxStatus(ActionEvent evt)
+ {
+ if(_inUpdateControlStatus)
+ {
+ return;
+ }
+
+ try
+ {
+ _inUpdateControlStatus = true;
+
+
+ if(_sqlReadOnChk.isSelected())
+ {
+ _sqlLimitRowsChk.setSelected(false);
+ _sqlLimitRowsChk.setEnabled(false);
+ _sqlNbrRowsToShowField.setEnabled(false);
+
+ _sqlReadOnBlockSize.setEnabled(true);
+ _lblReadOnWarning.setEnabled(true);
+ }
+ else
+ {
+
+ _sqlReadOnBlockSize.setEnabled(false);
+ _lblReadOnWarning.setEnabled(false);
+
+
+ if(null != evt && evt.getSource() == _sqlReadOnChk)
+ {
+ if(0 < _sqlNbrRowsToShowField.getInt())
+ {
+ _sqlLimitRowsChk.setSelected(true);
+ }
+ }
+
+ _sqlLimitRowsChk.setEnabled(true);
+ _sqlNbrRowsToShowField.setEnabled(_sqlLimitRowsChk.isSelected());
+
+ }
+ _sqlFetchSizeField.setEnabled(_sqlUseFetchSizeChk.isSelected());
+
+ }
+ finally
+ {
+ _inUpdateControlStatus = false;
+ }
+
+ }
+
+
+ public JPanel createResultLimitAndReadOnPanel()
+ {
+
+ JPanel ret = new JPanel(new GridBagLayout());
+
+ GridBagConstraints gbc;
+
+
+ gbc = new GridBagConstraints(0,0,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5),0,0);
+ ret.add(_sqlLimitRowsChk, gbc);
+
+ gbc = new GridBagConstraints(1,0,1,1,1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5),0,0);
+ ret.add(_sqlNbrRowsToShowField, gbc);
+
+ gbc = new GridBagConstraints(2,0,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5),0,0);
+ ret.add(new JLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.rows")), gbc);
+
+
+
+ gbc = new GridBagConstraints(0,1,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,5,3,5),0,0);
+ ret.add(_sqlReadOnChk, gbc);
+
+ gbc = new GridBagConstraints(1,1,1,1,1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5),0,0);
+ ret.add(_sqlReadOnBlockSize, gbc);
+
+ gbc = new GridBagConstraints(2,1,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5),0,0);
+ ret.add(new JLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.rowsPerBlock")), gbc);
+
+
+
+ gbc = new GridBagConstraints(0,2,3,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0,5,5,5),0,0);
+ ret.add(_lblReadOnWarning, gbc);
+
+
+ gbc = new GridBagConstraints(0,3,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(20,5,5,5),0,0);
+ ret.add(_sqlUseFetchSizeChk, gbc);
+
+ gbc = new GridBagConstraints(1,3,1,1,1,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(20,5,5,5),0,0);
+ ret.add(_sqlFetchSizeField, gbc);
+
+ gbc = new GridBagConstraints(2,3,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(20,5,5,5),0,0);
+ ret.add(new JLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.rows")), gbc);
+
+
+ ret.setBorder(BorderFactory.createTitledBorder(s_stringMgr.getString("SessionSQLPropertiesPanel.sqlResultLoading")));
+ return ret;
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrlListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrlListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SQLResultConfigCtrlListener.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,12 @@
+package net.sourceforge.squirrel_sql.client.session.properties;
+
+public interface SQLResultConfigCtrlListener
+{
+ void nbrRowsToShowChanged(int newValue);
+
+ void nbrReadOnBlockSize(int newValue);
+
+ void readOnChkChanged(boolean newValue);
+
+ void limitRowsChkChanged(boolean newValue);
+}
Modified: 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/SessionProperties.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionProperties.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -82,6 +82,8 @@
String SQL_RESULTS_TAB_PLACEMENT = "sqlResultsTabPlacement";
String SQL_LIMIT_ROWS = "sqlLimitRows";
String SQL_NBR_ROWS_TO_SHOW = "sqlNbrOfRowsToShow";
+ String SQL_READ_ON = "sqlReadOn";
+ String SQL_READ_ON_BLOCK_SIZE = "sqlReadOnBlockSize";
String SQL_RESULTS_OUTPUT_CLASS_NAME = "sqlResultsOutputClassName";
String SQL_START_OF_LINE_COMMENT = "sqlStartOfLineComment";
String SQL_STATEMENT_SEPARATOR_STRING = "sqlStatementSeparatorString";
@@ -102,6 +104,7 @@
private boolean _autoCommit = true;
private int _contentsNbrRowsToShow = 100;
private int _sqlNbrRowsToShow = 100;
+ private int _sqlReadOnBlockSize = 100;
/**
* If <CODE>true</CODE> then issue a commit when closing a connection
@@ -113,6 +116,8 @@
private boolean _contentsLimitRows = true;
private boolean _sqlLimitRows = true;
+ private boolean _sqlReadOn = false;
+
/**
* <CODE>true</CODE> if schemas and catalogs should be loaded in the object
* tree.
@@ -574,6 +579,23 @@
}
}
+ public int getSQLReadOnBlockSize()
+ {
+ return _sqlReadOnBlockSize;
+ }
+
+ public void setSQLReadOnBlockSize(int value)
+ {
+ if (_sqlReadOnBlockSize != value)
+ {
+ final int oldValue = _sqlReadOnBlockSize;
+ _sqlReadOnBlockSize = value;
+ getPropertyChangeReporter().firePropertyChange(
+ IPropertyNames.SQL_READ_ON_BLOCK_SIZE,
+ oldValue, _sqlReadOnBlockSize);
+ }
+ }
+
public boolean getContentsLimitRows()
{
return _contentsLimitRows;
@@ -608,6 +630,23 @@
}
}
+ public boolean getSQLReadOn()
+ {
+ return _sqlReadOn;
+ }
+
+ public void setSQLReadOn(boolean value)
+ {
+ if (_sqlReadOn != value)
+ {
+ final boolean oldValue = _sqlReadOn;
+ _sqlReadOn = value;
+ getPropertyChangeReporter().firePropertyChange(
+ IPropertyNames.SQL_READ_ON,
+ oldValue, _sqlReadOn);
+ }
+ }
+
/**
* Sets the number of rows which should be fetched at once.
*/
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionSQLPropertiesPanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionSQLPropertiesPanel.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/properties/SessionSQLPropertiesPanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -128,10 +128,9 @@
private JCheckBox _loadColumsInBackgroundChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.loadColumsInBackground"));
private JCheckBox _autoCommitChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.autocommit"));
private JCheckBox _commitOnClose = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.commitonclose"));
- private IntegerField _sqlNbrRowsToShowField = new IntegerField(5);
- private JCheckBox _sqlLimitRowsChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.limitrows"));
- private JCheckBox _sqlFetchSizeChk = new JCheckBox(s_stringMgr.getString("SessionSQLPropertiesPanel.fetchSize"));
- private IntegerField _sqlFetchSizeField = new IntegerField(5);
+
+ private SQLResultConfigCtrl _sqlResultConfigCtrl = new SQLResultConfigCtrl();
+
private JTextField _stmtSepField = new JTextField(5);
private JTextField _solCommentField = new JTextField(2);
// i18n[SessionSQLPropertiesPanel.removeMultiLineComment=Remove multi line comment (/*...*/) from SQL before sending to database]
@@ -174,10 +173,7 @@
_autoCommitChk.setSelected(props.getAutoCommit());
_commitOnClose.setSelected(props.getCommitOnClosingConnection());
- _sqlNbrRowsToShowField.setInt(props.getSQLNbrRowsToShow());
- _sqlLimitRowsChk.setSelected(props.getSQLLimitRows());
- _sqlFetchSizeChk.setSelected(props.getSQLUseFetchSize());
- _sqlFetchSizeField.setInt(props.getSQLFetchSize());
+ _sqlResultConfigCtrl.loadData(props);
if(null != _session)
{
@@ -251,11 +247,16 @@
props.setLoadColumnsInBackground(_loadColumsInBackgroundChk.isSelected());
props.setAutoCommit(_autoCommitChk.isSelected());
props.setCommitOnClosingConnection(_commitOnClose.isSelected());
- props.setSQLNbrRowsToShow(_sqlNbrRowsToShowField.getInt());
- props.setSQLLimitRows(_sqlLimitRowsChk.isSelected());
- props.setSQLFetchSize(_sqlFetchSizeField.getInt());
- props.setSQLUseFetchSize(_sqlFetchSizeChk.isSelected());
-
+
+ props.setSQLLimitRows(_sqlResultConfigCtrl.isLimitRows());
+ props.setSQLNbrRowsToShow(_sqlResultConfigCtrl.getNbrRowsToShow());
+
+ props.setSQLReadOn(_sqlResultConfigCtrl.isReadOn());
+ props.setSQLReadOnBlockSize(_sqlResultConfigCtrl.getReadOnBlockSize());
+
+ props.setSQLUseFetchSize(_sqlResultConfigCtrl.isUseFetchSize());
+ props.setSQLFetchSize(_sqlResultConfigCtrl.getFetchSize());
+
props.setSQLStatementSeparator(_stmtSepField.getText());
props.setStartOfLineComment(_solCommentField.getText());
props.setRemoveMultiLineComment(_removeMultiLineComment.isSelected());
@@ -284,10 +285,7 @@
{
_commitOnClose.setEnabled(!_autoCommitChk.isSelected());
- _sqlNbrRowsToShowField.setEnabled(_sqlLimitRowsChk.isSelected());
- _sqlFetchSizeField.setEnabled(_sqlFetchSizeChk.isSelected());
-
_limitSQLResultTabsField.setEnabled(_limitSQLResultTabsChk.isSelected());
// If this session doesn't share SQL history with other sessions
@@ -325,9 +323,7 @@
gbc.anchor = GridBagConstraints.CENTER;
_autoCommitChk.addChangeListener(_controlMediator);
- _sqlLimitRowsChk.addChangeListener(_controlMediator);
- _sqlFetchSizeChk.addChangeListener(_controlMediator);
- _sqlNbrRowsToShowField.setColumns(5);
+
_stmtSepField.setColumns(5);
_limitSQLResultTabsChk.addChangeListener(_controlMediator);
@@ -348,37 +344,12 @@
gbc.gridwidth = 3;
pnl.add(_showResultsMetaChk, gbc);
- ++gbc.gridy; // new line
- gbc.gridx = 0;
- gbc.gridwidth = 2;
- pnl.add(_sqlLimitRowsChk, gbc);
- gbc.gridwidth = 1;
- gbc.gridx+=2;
- pnl.add(_sqlNbrRowsToShowField, gbc);
- ++gbc.gridx;
- gbc.gridwidth = GridBagConstraints.REMAINDER;
- pnl.add(new JLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.rows")), gbc);
-
-
- // Show fetchSize-Option
- ++gbc.gridy; // new line
- gbc.gridx = 0;
- gbc.gridwidth = 2;
- pnl.add(_sqlFetchSizeChk, gbc);
- gbc.gridwidth = 1;
- gbc.gridx+=2;
- pnl.add(_sqlFetchSizeField, gbc);
- ++gbc.gridx;
- gbc.gridwidth = GridBagConstraints.REMAINDER;
- pnl.add(new JLabel(s_stringMgr.getString("SessionSQLPropertiesPanel.rows")), gbc);
-
-
-
-
-
-
-
-
+ ++gbc.gridy;
+ gbc.gridwidth = GridBagConstraints.REMAINDER;
+ Insets oldInsets = gbc.insets;
+ gbc.insets = new Insets(oldInsets.top + 10, oldInsets.left, oldInsets.bottom + 10, oldInsets.right);
+ pnl.add(_sqlResultConfigCtrl.createResultLimitAndReadOnPanel(), gbc);
+ gbc.insets = oldInsets;
++gbc.gridy; // new line
gbc.gridx = 0;
Added: trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/loading_gif.gif
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/images/loading_gif.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: 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/resources/squirrel.properties 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/resources/squirrel.properties 2012-12-22 20:01:55 UTC (rev 6722)
@@ -85,8 +85,10 @@
next_nav.image=eclipse/next_nav.gif
prev_nav.image=eclipse/prev_nav.gif
+loading_gif.image=loading_gif.gif
+
########
# icons displayed in the drivers list indicating whether
# or not driver could be loaded.
Modified: trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/properties/I18NStrings.properties
===================================================================
--- trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/properties/I18NStrings.properties 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/session/properties/I18NStrings.properties 2012-12-22 20:01:55 UTC (rev 6722)
@@ -4,6 +4,7 @@
SessionSQLPropertiesPanel.commitonclose=Commit On Closing Session
SessionSQLPropertiesPanel.font=Font
SessionSQLPropertiesPanel.limitrows=SQL results - Limit rows
+SessionSQLPropertiesPanel.limitrowsShort=Limit rows
SessionSQLPropertiesPanel.fetchSize=Fetch Rows at once
SessionSQLPropertiesPanel.limitsqlhistorysize=Limit SQL History Combo Size
SessionSQLPropertiesPanel.rows=rows
@@ -94,4 +95,15 @@
SessionSQLPropertiesPanel.columnLoading=Column loading
-SessionSQLPropertiesPanel.showSQLErrorsInTab=Show SQL execution errors in result tab
\ No newline at end of file
+SessionSQLPropertiesPanel.showSQLErrorsInTab=Show SQL execution errors in result tab
+
+SessionSQLPropertiesPanel.sqlResultLoading=SQL result loading
+SessionSQLPropertiesPanel.readOn=SQL results - Read on
+SessionSQLPropertiesPanel.readOnWarning=The "Read on" option reads more rows when scrolling to the end of SQL results. It has the following drawbacks:\n1. JDBC-Statements and ResultSets have to be kept open as long as the result tab is displayed.\n2. Stored procedures that return more than one result set can't be supported because asking a JDBC-Statement for more results intrinsically closes former result sets.\n3. Because Statement.setMaxResults() isn't called performance problems may arise with some RDBMs/JDBC drivers.
+SessionSQLPropertiesPanel.rowsPerBlock=rows to read on
+
+ResultLimitAndReadOnPanelSmallPanel.limitRows=Limit Rows:
+
+ResultLimitAndReadOnPanelSmallPanel.readOnWithBlockSize=Read on, Block size:
+
+ResultLimitAndReadOnPanelSmallPanel.readOnWarningHtml=<html>The "Read on" option reads more rows when scrolling to the end of SQL results. It has the following drawbacks:<ol><li>JDBC-Statements and ResultSets have to be kept open as long as the result tab is displayed.<li>Stored procedures that return more than one result set can't be supported because asking a JDBC-Statement for more results intrinsically closes former result sets.<li>Because Statement.setMaxResults() isn't called performance problems may arise with some RDBMs/JDBC drivers.</ol><html>
Modified: trunk/sql12/doc/src/main/resources/changes.txt
===================================================================
--- trunk/sql12/doc/src/main/resources/changes.txt 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/doc/src/main/resources/changes.txt 2012-12-22 20:01:55 UTC (rev 6722)
@@ -8,6 +8,11 @@
Enhancements:
+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.
+
+
Find function for SQL result tables.
Closing or reconnecting Sessions caused SQuirreL to hang when the JDBC driver's connection close method didn't return.
Modified: 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/BaseDataSetViewerDestination.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/BaseDataSetViewerDestination.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -219,4 +219,15 @@
public void applyResultSortableTableState(TableState sortableTableState)
{
}
+
+ @Override
+ public void setContinueReadChannel(ContinueReadChannel continueReadChannel)
+ {
+ }
+
+ @Override
+ public void disableContinueRead()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
}
Added: 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/BlockMode.java (rev 0)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/BlockMode.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,6 @@
+package net.sourceforge.squirrel_sql.fw.datasetviewer;
+
+public enum BlockMode
+{
+ FOLLOW_UP_BLOCK, INDIFFERENT, FIRST_BLOCK
+}
Added: 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/ContinueReadChannel.java (rev 0)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ContinueReadChannel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,8 @@
+package net.sourceforge.squirrel_sql.fw.datasetviewer;
+
+public interface ContinueReadChannel
+{
+ public void readMoreResults();
+
+ void closeStatementAndResultSet();
+}
Added: 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/ContinueReadHandler.java (rev 0)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/ContinueReadHandler.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,107 @@
+package net.sourceforge.squirrel_sql.fw.datasetviewer;
+
+import net.sourceforge.squirrel_sql.fw.gui.SortableTableModel;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+
+public class ContinueReadHandler
+{
+ private JTable _table;
+
+ private Timer _timer;
+ private ContinueReadChannel _continueReadChannel;
+ private AdjustmentListener _adjustmentListener;
+
+
+ public ContinueReadHandler(JTable table)
+ {
+ _table = table;
+
+ _timer = new Timer(300 , new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ onCheckTableEndReached();
+ }
+ });
+
+
+ _timer.setRepeats(false);
+
+ _adjustmentListener = new AdjustmentListener()
+ {
+ @Override
+ public void adjustmentValueChanged(AdjustmentEvent e)
+ {
+ runTimer();
+ }
+ };
+
+
+ }
+
+ public void setContinueReadChannel(ContinueReadChannel continueReadChannel)
+ {
+ _continueReadChannel = continueReadChannel;
+ if (readyForAdjustmentListening())
+ {
+ JScrollPane scrollPane = (JScrollPane) _table.getParent().getParent();
+ scrollPane.getVerticalScrollBar().addAdjustmentListener(_adjustmentListener);
+ }
+
+ }
+
+ private boolean readyForAdjustmentListening()
+ {
+ if(null == _continueReadChannel || null == _table.getParent() || false == _table.getParent().getParent() instanceof JScrollPane)
+ {
+ return false;
+ }
+ return true;
+ }
+
+
+ private void runTimer()
+ {
+ _timer.restart();
+ }
+
+ private void onCheckTableEndReached()
+ {
+ if(null == _continueReadChannel)
+ {
+ return;
+ }
+
+ Rectangle visibleRect = _table.getVisibleRect();
+ int row = _table.rowAtPoint(new Point(0, visibleRect.y + visibleRect.height - 3));
+
+ if(row == _table.getRowCount() - 1)
+ {
+ _continueReadChannel.readMoreResults();
+
+ }
+ }
+
+ public void disableContinueRead()
+ {
+ if(readyForAdjustmentListening())
+ {
+ JScrollPane scrollPane = (JScrollPane) _table.getParent().getParent();
+ scrollPane.getVerticalScrollBar().removeAdjustmentListener(_adjustmentListener);
+ }
+
+ if(null != _continueReadChannel)
+ {
+ _continueReadChannel.closeStatementAndResultSet();
+
+ }
+ }
+}
Modified: 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/DataSetDefinition.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetDefinition.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -23,26 +23,39 @@
* for this data set.
*/
private ColumnDisplayDefinition[] _columnDefs;
+ private int[] _columnIndices;
- /**
+ /**
* Ctor.
*
* @param columnDefs The <TT>ColumnDisplayDefinition</TT>
* objects that make up this data set.
*/
- public DataSetDefinition(ColumnDisplayDefinition[] columnDefs) {
- super();
- _columnDefs = columnDefs != null ? columnDefs : new ColumnDisplayDefinition[0];
- }
+ public DataSetDefinition(ColumnDisplayDefinition[] columnDefs)
+ {
+ this(columnDefs, null);
+ }
- /**
+ public DataSetDefinition(ColumnDisplayDefinition[] columnDefs, int[] columnIndices)
+ {
+ _columnIndices = columnIndices;
+ _columnDefs = columnDefs != null ? columnDefs : new ColumnDisplayDefinition[0];
+ }
+
+ /**
* Return the <TT>ColumnDisplayDefinition</TT> objects
* that make up this data set.
*
* @return <TT>ColumnDisplayDefinition</TT> objects
* that make up this data set.
*/
- public ColumnDisplayDefinition[] getColumnDefinitions() {
- return _columnDefs;
- }
+ public ColumnDisplayDefinition[] getColumnDefinitions()
+ {
+ return _columnDefs;
+ }
+
+ public int[] getColumnIndices()
+ {
+ return _columnIndices;
+ }
}
\ No newline at end of file
Copied: trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTableModel.java (from rev 6713, trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/MyTableModel.java)
===================================================================
--- trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTableModel.java (rev 0)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTableModel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -0,0 +1,220 @@
+package net.sourceforge.squirrel_sql.fw.datasetviewer;
+/*
+ * Copyright (C) 2001-2002 Colin Bell
+ * colbell@...
+ * Modifications copyright (C) 2001-2002 Johan Compagner
+ * jcompagner@...
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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.util.ArrayList;
+import java.util.List;
+import java.util.Arrays;
+
+import javax.swing.table.AbstractTableModel;
+
+
+public final class DataSetViewerTableModel extends AbstractTableModel
+{
+ private List<Object[]> _data = new ArrayList<Object[]>();
+ private ColumnDisplayDefinition[] _colDefs = new ColumnDisplayDefinition[0];
+ private IDataSetTableControls _creator = null;
+
+
+ DataSetViewerTableModel(IDataSetTableControls creator)
+ {
+ super();
+ _creator = creator;
+ }
+
+ /**
+ * Determine whether the cell is editable by asking the creator whether
+ * the table is editable or not
+ */
+ public boolean isCellEditable(int row, int col)
+ {
+ // DataTypes may limit the initial data read from the DB, e.g. to minimize the
+ // time needed for the initial load of the table.
+ // To edit the contents of a cell, we require that the entire contents of the data
+ // element be present in the cell before editing.
+ // Therefore we ask the DataType if we need to re-read the data contents
+ // without limiting it, and do that read if needed. If there is a problem during the
+ // read (e.g. we cannot identify exactly one row in the DB matching the
+ // current row in the table), then the cell is not editable.
+ // The reverse is not true - if we succeed in reading the data, there may still
+ // be other reasons why we cannot edit it, so we need to check for it being editable
+ // after the read
+
+ if(col == RowNumberTableColumn.ROW_NUMBER_MODEL_INDEX)
+ {
+ return false;
+ }
+
+ if (_creator.needToReRead(col, getValueAt(row, col)))
+ {
+ StringBuffer message = new StringBuffer();
+ Object newValue = _creator.reReadDatum(_data.get(row), col, message);
+ if (message.length() > 0)
+ {
+ // there was a problem with the read
+ // It would be nice to report this to the user, but if we try we get in trouble
+ // in some cases where the data is continually re-read after the dialog
+ // goes away (because the cell is being re-painted).
+ return false; // cell is not editable
+ }
+ (_data.get(row))[col] = newValue;
+ }
+
+ return _creator.isColumnEditable(col, getValueAt(row, col));
+ }
+
+ public Object getValueAt(int row, int col)
+ {
+ if(RowNumberTableColumn.ROW_NUMBER_MODEL_INDEX == col)
+ {
+ return Integer.valueOf(row + 1);
+ }
+ else
+ {
+ return _data.get(row)[col];
+ }
+ }
+
+ public int getRowCount()
+ {
+ return _data.size();
+ }
+
+ public int getColumnCount()
+ {
+ return _colDefs != null ? _colDefs.length : 0;
+ }
+
+ public String getColumnName(int col)
+ {
+ if(col == RowNumberTableColumn.ROW_NUMBER_MODEL_INDEX)
+ {
+ return RowNumberTableColumn.ROW_NUMBER_HEADER;
+ }
+ else
+ {
+ return _colDefs != null ? _colDefs[col].getColumnHeading() : super.getColumnName(col);
+ }
+ }
+
+ public Class<?> getColumnClass(int col)
+ {
+ try
+ {
+ // if no columns defined, return a generic class
+ // to avoid anything throwing an exception.
+ if (_colDefs == null)
+ {
+ return Object.class;
+ }
+
+ return Class.forName(_colDefs[col].getClassName());
+ }
+ catch (Exception e)
+ {
+ return null;
+ }
+ }
+
+ void setHeadings(ColumnDisplayDefinition[] hdgs)
+ {
+ _colDefs = hdgs;
+ }
+
+ public void addRow(Object[] row)
+ {
+ _data.add(row);
+ }
+
+ void clear()
+ {
+ _data.clear();
+ }
+
+ public void allRowsAdded()
+ {
+ fireTableStructureChanged();
+ }
+
+ /**
+ * Let creator handle saving the data, if anything is to be done with it.
+ * If the creator succeeds in changing the underlying data,
+ * then update the JTable as well.
+ */
+ public void setValueAt(Object newValue, int row, int col) {
+ int[] colsToUpdate = _creator.changeUnderlyingValueAt(row, col, newValue, getValueAt(row, col));
+
+ for (int i = 0; i < colsToUpdate.length; i++)
+ {
+ _data.get(row)[ colsToUpdate[i] ] = newValue;
+ }
+ }
+
+ /**
+ * Delete a set of selected rows.
+ */
+ public void deleteRows(int[] rows) {
+ // The list of rows may be empty, in which case we just return.
+ if (rows.length == 0)
+ return;
+
+
+
+ // We want to delete rows from the end of the table towards the beginning
+ // of the table. If we delete from the front to the back, that throws off
+ // the indexes of the rows after each delete and we would have to compensate
+ // for that.
+ // Example: if we want to delete rows 2 and 4 and do it in that
+ // order, then after deleteing row 2 the row that used to be row 4 is now
+ // actually row 3, so we would have to subtract 1 from the index to get the
+ // row to delete.
+ // On the other hand, if we delete row 4 first, then the indexes of all
+ // rows prior to that one have not been affected, so we can then delete
+ // row 2 without any complications.
+
+ // sort the indexes into ascending order (because that is the
+ // only function easilly available from the Arrays class)
+ Arrays.sort(rows);
+
+ // The indexes are in ascending order, but we want to delete in
+ // descending order (see previous comment), so run through the
+ // list backwards.
+ for (int i=rows.length - 1; i>=0; i--) {
+ // delete the row from the table
+ if (rows[i] < _data.size()) {
+ _data.remove(rows[i]);
+ }
+ }
+
+ // notify table that rows have changed
+ // The deleted rows may not be contiguous in the actual data model
+ // because the gui may be showing a version of the data sorted in
+ // some other order, so we cannot use fireRowsDeleted.
+ fireTableDataChanged();
+
+ }
+
+ public Object[] getRowAt(Integer rowIx)
+ {
+ return _data.get(rowIx);
+ }
+}
Property changes on: trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTableModel.java
___________________________________________________________________
Added: svn:executable
+ *
Modified: 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/DataSetViewerTablePanel.java 2012-11-21 21:29:15 UTC (rev 6721)
+++ trunk/sql12/fw/src/main/java/net/sourceforge/squirrel_sql/fw/datasetviewer/DataSetViewerTablePanel.java 2012-12-22 20:01:55 UTC (rev 6722)
@@ -19,31 +19,10 @@
* 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.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.print.PageFormat;
-import java.awt.print.Printable;
-import java.awt.print.PrinterException;
-import javax.swing.DefaultCellEditor;
-import javax.swing.JOptionPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumnModel;
-
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.CellComponentFactory;
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.RestorableJTextField;
-import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.*;
+import net.sourceforge.squirrel_sql.fw.datasetviewer.tablefind.DefaultFindService;
import net.sourceforge.squirrel_sql.fw.gui.ButtonTableHeader;
import net.sourceforge.squirrel_sql.fw.gui.RectangleSelectionHandler;
import net.sourceforge.squirrel_sql.fw.gui.SortableTableModel;
@@ -53,6 +32,17 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+import javax.swing.*;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumnModel;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+
public class DataSetViewerTablePanel extends BaseDataSetViewerDestination
implements IDataSetTableControls, Printable
{
@@ -63,7 +53,7 @@
private ILogger s_log = LoggerController.createLogger(DataSetViewerTablePanel.class);
private MyJTable _table = null;
- private MyTableModel _typedModel;
+ private DataSetViewerTableModel _typedModel;
private IDataSetUpdateableModel _updateableModel;
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|