From a32e2c83ca0f06665735d5fc4374203ac5557c02 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 15 Jan 2017 21:38:07 +0100 Subject: [PATCH] Query, explain, cancel buttons are now enabled/disabled when the state of the connection changes. --- asyncdbconnection.cpp | 11 ++++++++++- asyncdbconnection.h | 3 ++- mainwindow.cpp | 32 ++++++++++++++++++++------------ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/asyncdbconnection.cpp b/asyncdbconnection.cpp index dd685bd..2bc6c30 100644 --- a/asyncdbconnection.cpp +++ b/asyncdbconnection.cpp @@ -1,5 +1,6 @@ #include "asyncdbconnection.h" #include "waithandlelist.h" +#include "scopeguard.h" #include ASyncDBConnection::ASyncDBConnection() @@ -7,6 +8,11 @@ ASyncDBConnection::ASyncDBConnection() } +ASyncDBConnection::State ASyncDBConnection::state() const +{ + return m_threadData.m_state; +} + //void ASyncDBConnection::setupConnection(const std::string &connstring) //{ // if (m_thread.joinable()) { @@ -69,6 +75,10 @@ ASyncDBConnection::Thread::Thread() void ASyncDBConnection::Thread::run() { m_terminated = false; + SCOPE_EXIT { + m_state = State::NotConnected; + m_terminated = true; + }; while (!terminateRequested) { // make or recover connection @@ -94,7 +104,6 @@ void ASyncDBConnection::Thread::run() break; } } - m_terminated = true; // close connection } diff --git a/asyncdbconnection.h b/asyncdbconnection.h index 2e78dc8..e147dfa 100644 --- a/asyncdbconnection.h +++ b/asyncdbconnection.h @@ -27,6 +27,7 @@ public: ASyncDBConnection(); + State state() const; // void setupConnection(const std::string &connstring); void setupConnection(const ConnectionConfig &config); void closeConnection(); @@ -81,6 +82,7 @@ private: // std::string m_initString; ConnectionConfig m_config; + State m_state = State::NotConnected; Thread(); @@ -94,7 +96,6 @@ private: private: - State m_state = State::NotConnected; Win32Event m_stopEvent; Pgsql::Connection m_connection; diff --git a/mainwindow.cpp b/mainwindow.cpp index 4982322..362c0c7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -177,6 +177,11 @@ void MainWindow::connectionStateChanged(ASyncDBConnection::State state) } addLog(status_str); statusBar()->showMessage(status_str); + + bool connected = ASyncDBConnection::State::Connected == state; + ui->actionExecute_SQL->setEnabled(connected); + ui->actionExplain_Analyze->setEnabled(connected); + ui->actionCancel->setEnabled(ASyncDBConnection::State::QuerySend == state); } void MainWindow::startConnect() @@ -188,20 +193,23 @@ void MainWindow::startConnect() void MainWindow::performQuery() { - addLog("Query clicked"); + if (m_dbConnection.state() == ASyncDBConnection::State::Connected) { + addLog("Query clicked"); - ui->ResultView->setModel(nullptr); - resultModel.reset(); - ui->messagesEdit->clear(); + ui->ResultView->setModel(nullptr); + resultModel.reset(); + ui->messagesEdit->clear(); - QString command = ui->queryEdit->toPlainText(); - std::string cmd = command.toUtf8().data(); - startTimer(); - m_dbConnection.send(cmd, - [this](std::shared_ptr res) - { - QueueTask([this, res]() { query_ready(res); }); - }); + + QString command = ui->queryEdit->toPlainText(); + std::string cmd = command.toUtf8().data(); + startTimer(); + m_dbConnection.send(cmd, + [this](std::shared_ptr res) + { + QueueTask([this, res]() { query_ready(res); }); + }); + } } void MainWindow::query_ready(std::shared_ptr dbres)