package net.sourceforge.squirrel_sql.client.session;
import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
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 net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
public class CancelStatementThread extends Thread
{
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(CancelStatementThread.class);
private static final ILogger s_log = LoggerController.createLogger(CancelStatementThread.class);
private StatementWrapper _stmtWrapper;
private IMessageHandler _messageHandler;
private boolean _threadFinished;
private boolean _joinReturned;
public CancelStatementThread(StatementWrapper stmtWrapper, IMessageHandler messageHandler)
{
_stmtWrapper = stmtWrapper;
_messageHandler = messageHandler;
}
public void tryCancel()
{
try
{
start();
join(1500);
synchronized (this)
{
_joinReturned = true;
if(false == _threadFinished)
{
// i18n[CancelStatementThread.cancelTimedOut=Failed to cancel statement within one second. Perhaps your driver/database does not support cancelling statements. If cancelling succeeds later you'll get a further messages.]
String msg = s_stringMgr.getString("CancelStatementThread.cancelTimedOut");
_messageHandler.showErrorMessage(msg);
s_log.error(msg);
}
}
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
}
public void run()
{
String msg;
boolean cancelSucceeded = false;
boolean closeSucceeded = false;
try
{
if (_stmtWrapper != null) {
_stmtWrapper.cancel();
}
cancelSucceeded = true;
}
catch (Throwable t)
{
// i18n[CancelStatementThread.cancelFailed=Failed to cancel statement. Perhaps the driver/RDDBMS does not support cancelling statements. See logs for further details ({0})]
msg = s_stringMgr.getString("CancelStatementThread.cancelFailed", t);
_messageHandler.showErrorMessage(msg);
s_log.error(msg, t);
}
try
{
// give the ResultSetReader some time to realize that the user requested
// cancel and stop fetching results. This allows us to stop the query
// processing gracefully.
Utilities.sleep(500);
if (_stmtWrapper != null) {
_stmtWrapper.closeIfContinueReadIsNotActive();
}
closeSucceeded = true;
}
catch (Throwable t)
{
// i18n[CancelStatementThread.closeFailed=Failed to close statement. Propably the driver/RDDBMS does not support canceling statements. See logs for further details ({0})]
msg = s_stringMgr.getString("CancelStatementThread.closeFailed", t);
_messageHandler.showErrorMessage(msg);
s_log.error(msg, t);
}
synchronized (this)
{
if (cancelSucceeded && closeSucceeded)
{
if (_joinReturned)
{
// i18n[CancelStatementThread.cancelSucceededLate=Canceling statement succeeded now. But took longer than one second.]
msg = s_stringMgr.getString("CancelStatementThread.cancelSucceededLate");
_messageHandler.showMessage(msg);
}
else
{
// i18n[CancelStatementThread.cancelSucceeded=The database has been asked to cancel the statment.]
msg = s_stringMgr.getString("CancelStatementThread.cancelSucceeded");
_messageHandler.showMessage(msg);
}
}
_threadFinished = true;
}
}
}