pgLab/mainwindow.h

92 lines
1.7 KiB
C
Raw Normal View History

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSocketNotifier>
#include <memory>
2016-12-27 21:22:49 +01:00
#include <future>
#include "PgsqlConn.h"
class ExplainRoot;
class QueryResultModel;
class QueryExplainModel;
class SqlHighlighter;
namespace Ui {
class MainWindow;
}
namespace Pgsql {
class Connection;
}
#include <deque>
#include <mutex>
class TaskQueue {
public:
private:
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
using callable = std::function<void()>;
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
/* Meant to be called from other threads to pass a code block
* that has to be executed in the context of the thread of the window.
*/
void QueueTask(callable c);
private:
using t_CallableQueue = std::deque<callable>;
std::mutex m_mutexCallableQueue;
t_CallableQueue m_callableQueue;
std::unique_ptr<Ui::MainWindow> ui;
std::unique_ptr<SqlHighlighter> highlighter;
std::unique_ptr<Pgsql::Connection> connection;
std::unique_ptr<QueryResultModel> resultModel;
std::unique_ptr<QueryExplainModel> explainModel;
Pgsql::Canceller queryCancel;
std::future<std::unique_ptr<ExplainRoot>> explainFuture;
2016-12-27 21:22:49 +01:00
struct {
std::unique_ptr<QSocketNotifier> notifier;
PostgresPollingStatusType poll_state;
} connectingState;
2016-12-27 21:22:49 +01:00
// struct {
// std::unique_ptr<QSocketNotifier> notifierRead;
// std::unique_ptr<QSocketNotifier> notifierWrite;
// } queryState;
void processNotice(const PGresult *result);
void query_ready(Pgsql::Result res);
private slots:
void startConnect();
void performQuery();
void performExplain();
void socket_activate_connect(int socket);
void explain_ready();
void cancel_query();
void receiveNotice(Pgsql::ErrorDetails notice);
void processCallableQueue();
};
#endif // MAINWINDOW_H