Corrected some usage of QueueTask that was already broken as QueueTask is defunct.
This commit is contained in:
parent
1da8ef7407
commit
f996703937
8 changed files with 95 additions and 144 deletions
|
|
@ -4,6 +4,14 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
class registerMetaTypes {
|
||||||
|
public:
|
||||||
|
registerMetaTypes()
|
||||||
|
{
|
||||||
|
qRegisterMetaType<ExplainRoot::SPtr>();
|
||||||
|
}
|
||||||
|
} registerMetaTypes_instance;
|
||||||
|
|
||||||
ExplainTreeModelItemPtr createPlanItemFromJson(Json::Value &plan)
|
ExplainTreeModelItemPtr createPlanItemFromJson(Json::Value &plan)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
//#include <QVariant>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <QMetaType>
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
|
|
@ -161,3 +161,4 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(ExplainRoot::SPtr);
|
||||||
|
|
|
||||||
|
|
@ -50,11 +50,6 @@ namespace DatabaseWindow_details {
|
||||||
return m_window->getDatabase();
|
return m_window->getDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QueueTask(TSQueue::t_Callable ) override
|
|
||||||
{
|
|
||||||
// m_window->QueueTask(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void showStatusMessage(const QString &msg) override
|
void showStatusMessage(const QString &msg) override
|
||||||
{
|
{
|
||||||
m_window->statusBar()->showMessage(msg);
|
m_window->statusBar()->showMessage(msg);
|
||||||
|
|
|
||||||
|
|
@ -54,14 +54,11 @@ QueryTab::QueryTab(IPluginContentWidgetContext *context_, QWidget *parent)
|
||||||
connect(ui->removeButton, &QPushButton::clicked, m_queryParamListController,
|
connect(ui->removeButton, &QPushButton::clicked, m_queryParamListController,
|
||||||
&QueryParamListController::on_removeParam);
|
&QueryParamListController::on_removeParam);
|
||||||
|
|
||||||
context()->QueueTask([this]() { startConnect(); });
|
startConnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryTab::~QueryTab()
|
QueryTab::~QueryTab()
|
||||||
{
|
{
|
||||||
// m_dbConnection.blockSignals(true);
|
|
||||||
// m_dbConnection.closeConnection();
|
|
||||||
|
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -158,7 +155,16 @@ void QueryTab::execute()
|
||||||
|
|
||||||
auto cb = [this](Expected<std::shared_ptr<Pgsql::Result>> res, qint64 elapsedms)
|
auto cb = [this](Expected<std::shared_ptr<Pgsql::Result>> res, qint64 elapsedms)
|
||||||
{
|
{
|
||||||
context()->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); });
|
if (res.valid()) {
|
||||||
|
auto && dbresult = res.get();
|
||||||
|
QMetaObject::invokeMethod(this, "query_ready",
|
||||||
|
Q_ARG(std::shared_ptr<Pgsql::Result>, dbresult),
|
||||||
|
Q_ARG(qint64, elapsedms));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/// \todo handle error
|
||||||
|
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (m_queryParamListController->empty())
|
if (m_queryParamListController->empty())
|
||||||
|
|
@ -201,7 +207,8 @@ void QueryTab::explain(bool analyze)
|
||||||
explain = ExplainRoot::createFromJson(root);
|
explain = ExplainRoot::createFromJson(root);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
context()->QueueTask([this, explain]() { explain_ready(explain); });
|
QMetaObject::invokeMethod(this, "explain_ready",
|
||||||
|
Q_ARG(ExplainRoot::SPtr, explain));
|
||||||
}).detach();
|
}).detach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -436,86 +443,80 @@ std::string QueryTab::getCommandUtf8() const
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
void QueryTab::query_ready(Expected<std::shared_ptr<Pgsql::Result>> exp_res, qint64 elapsedms)
|
void QueryTab::query_ready(std::shared_ptr<Pgsql::Result> dbres, qint64 elapsedms)
|
||||||
{
|
{
|
||||||
if (exp_res.valid()) {
|
if (dbres) {
|
||||||
auto dbres = exp_res.get();
|
addLog("query_ready with result");
|
||||||
if (dbres) {
|
auto st = dbres->resultStatus();
|
||||||
addLog("query_ready with result");
|
if (st == PGRES_TUPLES_OK) {
|
||||||
auto st = dbres->resultStatus();
|
//int n_rows = dbres->getRows();
|
||||||
if (st == PGRES_TUPLES_OK) {
|
//QString rowcount_str = QString("rows: %1").arg(dbres->getRows());
|
||||||
//int n_rows = dbres->getRows();
|
|
||||||
//QString rowcount_str = QString("rows: %1").arg(dbres->getRows());
|
|
||||||
|
|
||||||
auto result_model = std::make_shared<QueryResultModel>(nullptr , dbres,
|
auto result_model = std::make_shared<QueryResultModel>(nullptr , dbres,
|
||||||
m_catalog);
|
m_catalog);
|
||||||
TuplesResultWidget *trw = new TuplesResultWidget;
|
TuplesResultWidget *trw = new TuplesResultWidget;
|
||||||
trw->setResult(result_model, elapsedms);
|
trw->setResult(result_model, elapsedms);
|
||||||
resultList.push_back(trw);
|
resultList.push_back(trw);
|
||||||
ui->tabWidget->addTab(trw, "Data");
|
ui->tabWidget->addTab(trw, "Data");
|
||||||
if (resultList.size() == 1)
|
if (resultList.size() == 1)
|
||||||
ui->tabWidget->setCurrentWidget(trw);
|
ui->tabWidget->setCurrentWidget(trw);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (st == PGRES_COMMAND_OK) {
|
if (st == PGRES_COMMAND_OK) {
|
||||||
int tuples_affected = dbres->tuplesAffected();
|
int tuples_affected = dbres->tuplesAffected();
|
||||||
QString msg;
|
QString msg;
|
||||||
if (tuples_affected >= 0)
|
if (tuples_affected >= 0)
|
||||||
msg = tr("Query returned succesfully: %1 rows affected, execution time %2")
|
msg = tr("Query returned succesfully: %1 rows affected, execution time %2")
|
||||||
.arg(QString::number(tuples_affected))
|
.arg(QString::number(tuples_affected))
|
||||||
.arg(msfloatToHumanReadableString(elapsedms));
|
.arg(msfloatToHumanReadableString(elapsedms));
|
||||||
else
|
else
|
||||||
msg = tr("Query returned succesfully, execution time %1")
|
msg = tr("Query returned succesfully, execution time %1")
|
||||||
.arg(msfloatToHumanReadableString(elapsedms));
|
.arg(msfloatToHumanReadableString(elapsedms));
|
||||||
|
|
||||||
ui->messagesEdit->append(msg);
|
ui->messagesEdit->append(msg);
|
||||||
|
|
||||||
ui->tabWidget->setCurrentWidget(ui->messageTab);
|
ui->tabWidget->setCurrentWidget(ui->messageTab);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// if (st == PGRES_EMPTY_QUERY) {
|
// if (st == PGRES_EMPTY_QUERY) {
|
||||||
// statusBar()->showMessage(tr("Empty query."));
|
// statusBar()->showMessage(tr("Empty query."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_COPY_OUT) {
|
// else if (st == PGRES_COPY_OUT) {
|
||||||
// statusBar()->showMessage(tr("COPY OUT."));
|
// statusBar()->showMessage(tr("COPY OUT."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_COPY_IN) {
|
// else if (st == PGRES_COPY_IN) {
|
||||||
// statusBar()->showMessage(tr("COPY IN."));
|
// statusBar()->showMessage(tr("COPY IN."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_BAD_RESPONSE) {
|
// else if (st == PGRES_BAD_RESPONSE) {
|
||||||
// statusBar()->showMessage(tr("BAD RESPONSE."));
|
// statusBar()->showMessage(tr("BAD RESPONSE."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_NONFATAL_ERROR) {
|
// else if (st == PGRES_NONFATAL_ERROR) {
|
||||||
// statusBar()->showMessage(tr("NON FATAL ERROR."));
|
// statusBar()->showMessage(tr("NON FATAL ERROR."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_FATAL_ERROR) {
|
// else if (st == PGRES_FATAL_ERROR) {
|
||||||
// statusBar()->showMessage(tr("FATAL ERROR."));
|
// statusBar()->showMessage(tr("FATAL ERROR."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_COPY_BOTH) {
|
// else if (st == PGRES_COPY_BOTH) {
|
||||||
// statusBar()->showMessage(tr("COPY BOTH shouldn't happen is for replication."));
|
// statusBar()->showMessage(tr("COPY BOTH shouldn't happen is for replication."));
|
||||||
// }
|
// }
|
||||||
// else if (st == PGRES_SINGLE_TUPLE) {
|
// else if (st == PGRES_SINGLE_TUPLE) {
|
||||||
// statusBar()->showMessage(tr("SINGLE TUPLE result."));
|
// statusBar()->showMessage(tr("SINGLE TUPLE result."));
|
||||||
// }
|
// }
|
||||||
// else {
|
// else {
|
||||||
// statusBar()->showMessage(tr("No tuples returned, possibly an error..."));
|
// statusBar()->showMessage(tr("No tuples returned, possibly an error..."));
|
||||||
// }
|
// }
|
||||||
ui->tabWidget->setCurrentWidget(ui->messageTab);
|
ui->tabWidget->setCurrentWidget(ui->messageTab);
|
||||||
auto details = dbres->diagDetails();
|
auto details = dbres->diagDetails();
|
||||||
markError(details);
|
markError(details);
|
||||||
receiveNotice(details);
|
receiveNotice(details);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_stopwatch.stop();
|
m_stopwatch.stop();
|
||||||
addLog("query_ready with NO result");
|
addLog("query_ready with NO result");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
|
||||||
// we have an error
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QueryTab::markError(const Pgsql::ErrorDetails &details)
|
void QueryTab::markError(const Pgsql::ErrorDetails &details)
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,6 @@ private:
|
||||||
|
|
||||||
QString getCommand() const;
|
QString getCommand() const;
|
||||||
std::string getCommandUtf8() const;
|
std::string getCommandUtf8() const;
|
||||||
void explain_ready(ExplainRoot::SPtr explain);
|
|
||||||
void query_ready(Expected<std::shared_ptr<Pgsql::Result>> dbres, qint64 elapsedms);
|
|
||||||
|
|
||||||
//QTabWidget *getTabWidget();
|
//QTabWidget *getTabWidget();
|
||||||
//void setTabCaption(const QString &caption, const QString &tooltip);
|
//void setTabCaption(const QString &caption, const QString &tooltip);
|
||||||
|
|
@ -104,6 +102,9 @@ private:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
void explain_ready(ExplainRoot::SPtr explain);
|
||||||
|
void query_ready(std::shared_ptr<Pgsql::Result>, qint64 elapsedms);
|
||||||
|
|
||||||
void queryTextChanged();
|
void queryTextChanged();
|
||||||
void connectionStateChanged(ASyncDBConnection::State state);
|
void connectionStateChanged(ASyncDBConnection::State state);
|
||||||
void receiveNotice(Pgsql::ErrorDetails notice);
|
void receiveNotice(Pgsql::ErrorDetails notice);
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ win32:RC_ICONS += pglab.ico
|
||||||
SOURCES += main.cpp\
|
SOURCES += main.cpp\
|
||||||
QueryResultModel.cpp \
|
QueryResultModel.cpp \
|
||||||
QueryExplainModel.cpp \
|
QueryExplainModel.cpp \
|
||||||
tsqueue.cpp \
|
|
||||||
CreateDatabaseDialog.cpp \
|
CreateDatabaseDialog.cpp \
|
||||||
ConnectionManagerWindow.cpp \
|
ConnectionManagerWindow.cpp \
|
||||||
ConnectionListModel.cpp \
|
ConnectionListModel.cpp \
|
||||||
|
|
@ -93,7 +92,6 @@ PropertyProxyModel.cpp \
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
QueryResultModel.h \
|
QueryResultModel.h \
|
||||||
QueryExplainModel.h \
|
QueryExplainModel.h \
|
||||||
tsqueue.h \
|
|
||||||
CreateDatabaseDialog.h \
|
CreateDatabaseDialog.h \
|
||||||
ConnectionManagerWindow.h \
|
ConnectionManagerWindow.h \
|
||||||
ConnectionListModel.h \
|
ConnectionListModel.h \
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
#include "tsqueue.h"
|
|
||||||
|
|
||||||
TSQueue::TSQueue()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void TSQueue::add(t_Callable callable)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> g(m);
|
|
||||||
futureQueue.push_back(std::move(callable));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TSQueue::empty()
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> g(m);
|
|
||||||
return futureQueue.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
TSQueue::t_Callable TSQueue::pop()
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> g(m);
|
|
||||||
auto f = std::move(futureQueue.front());
|
|
||||||
futureQueue.pop_front();
|
|
||||||
if (futureQueue.empty()) {
|
|
||||||
}
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
#ifndef TSQUEUE_H
|
|
||||||
#define TSQUEUE_H
|
|
||||||
|
|
||||||
//#include "Win32Event.h"
|
|
||||||
#include <deque>
|
|
||||||
#include <functional>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
class TSQueue {
|
|
||||||
public:
|
|
||||||
using t_Callable = std::function<void()>;
|
|
||||||
|
|
||||||
TSQueue();
|
|
||||||
void add(t_Callable callable);
|
|
||||||
bool empty();
|
|
||||||
t_Callable pop();
|
|
||||||
|
|
||||||
private:
|
|
||||||
using t_CallableQueue = std::deque<t_Callable>;
|
|
||||||
|
|
||||||
std::mutex m;
|
|
||||||
t_CallableQueue futureQueue;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // TSQUEUE_H
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue