diff --git a/core/BackupFormatModel.cpp b/core/BackupFormatModel.cpp index 6b6c76b..e6dc2e0 100644 --- a/core/BackupFormatModel.cpp +++ b/core/BackupFormatModel.cpp @@ -58,13 +58,13 @@ BackupFormatModel::BackupFormatModel(QObject *parent) //} -int BackupFormatModel::rowCount(const QModelIndex &parent) const +int BackupFormatModel::rowCount(const QModelIndex &) const { int size = g_BackupFormats.size(); return size; } -int BackupFormatModel::columnCount(const QModelIndex &parent) const +int BackupFormatModel::columnCount(const QModelIndex &) const { return 3; @@ -80,13 +80,13 @@ QVariant BackupFormatModel::data(const QModelIndex &index, int role) const if (role == Qt::DisplayRole) { const auto &item = g_BackupFormats.at(row); switch (col) { - case Column::Short: + case ColumnShort: result = item.shortFlag; break; - case Column::Long: + case ColumnLong: result = item.longFlag; break; - case Column::Description: + case ColumnDescription: result = item.description; break; } diff --git a/core/BackupFormatModel.h b/core/BackupFormatModel.h index 1c0145e..471b3c1 100644 --- a/core/BackupFormatModel.h +++ b/core/BackupFormatModel.h @@ -8,7 +8,7 @@ class BackupFormatModel : public QAbstractListModel Q_OBJECT public: - enum class Column { Short=1, Long=0, Description=2 }; + enum Column { ColumnShort=1, ColumnLong=0, ColumnDescription=2 }; explicit BackupFormatModel(QObject *parent); diff --git a/core/Expected.h b/core/Expected.h index d53a19b..8813272 100644 --- a/core/Expected.h +++ b/core/Expected.h @@ -1,7 +1,9 @@ #ifndef EXPECTED_H #define EXPECTED_H -#include +#include +#include +#include template class Expected { @@ -168,13 +170,13 @@ public: Expected(const Expected& rhs) - : m_valid(rhs.m_valid) - , m_error(rhs.m_error) + : m_error(rhs.m_error) + , m_valid(rhs.m_valid) {} Expected(Expected &&rhs) - : m_valid(rhs.m_valid) - , m_error(std::move(rhs.m_error)) + : m_error(std::move(rhs.m_error)) + , m_valid(rhs.m_valid) {} ~Expected() diff --git a/core/core.pro b/core/core.pro index 4511739..52efebe 100644 --- a/core/core.pro +++ b/core/core.pro @@ -8,11 +8,11 @@ QT -= gui TARGET = core TEMPLATE = lib -CONFIG += staticlib c++11 +CONFIG += staticlib c++14 INCLUDEPATH += C:\prog\include C:\VSproj\boost_1_63_0 DEFINES += WIN32_LEAN_AND_MEAN NOMINMAX -LIBS += /LIBPATH:C:\VSproj\boost_1_63_0\stage\lib /LIBPATH:c:\prog\lib\ libpq.lib fmt.lib User32.lib ws2_32.lib +#LIBS += /LIBPATH:C:\VSproj\boost_1_63_0\stage\lib /LIBPATH:c:\prog\lib\ libpq.lib fmt.lib User32.lib ws2_32.lib # The following define makes your compiler emit warnings if you use diff --git a/src/BackupDialog.cpp b/src/BackupDialog.cpp index 882272f..56a4c66 100644 --- a/src/BackupDialog.cpp +++ b/src/BackupDialog.cpp @@ -9,6 +9,8 @@ #include #include +#include + BackupDialog::BackupDialog(QWidget *parent) : QDialog(parent), ui(new Ui::BackupDialog) @@ -81,7 +83,7 @@ void BackupDialog::on_process_errorOccurred(QProcess::ProcessError error) msg = tr("Failed to start"); break; case 1: - msg = tr("Crasged"); + msg = tr("Crashed"); break; case 2: msg = tr("Timedout"); @@ -175,6 +177,50 @@ void BackupDialog::on_btnStart_clicked() setParams(arguments); +// BOOL res = AllocConsole(); +// if (!res) { +// DWORD error = GetLastError(); +// QMessageBox::critical(this, "pglab", tr("AllocConsole failed %1").arg(error), QMessageBox::Close); +// } +// HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); +// DWORD written; +// res = WriteConsoleOutputCharacter(out, L"Hello, world!\n", 14, {0, 0}, &written); + +// PROCESS_INFORMATION proc_info; +// STARTUPINFO startup_info; +// memset(&startup_info, 0, sizeof(startup_info)); +// startup_info.cb = sizeof(startup_info); +// startup_info.lpReserved; +// startup_info.lpDesktop; +// startup_info.lpTitle; +// startup_info.dwX; +// startup_info.dwY; +// startup_info.dwXSize; +// startup_info.dwYSize; +// startup_info.dwXCountChars; +// startup_info.dwYCountChars; +// startup_info.dwFillAttribute; +// startup_info.dwFlags = STARTF_USESTDHANDLES; +// startup_info.wShowWindow; +// startup_info.cbReserved2; +// startup_info.lpReserved2; +// startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); +// startup_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); +// startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); +// res = CreateProcess( +// LR"_(C:\Prog\build-conoutputtest-Desktop_Qt_5_8_0_MSVC2015_32bit2-Debug\debug\conoutputtest.exe)_", +// NULL, // _Inout_opt_ LPTSTR lpCommandLine, +// NULL, // _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, +// NULL, // _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, +// TRUE, +// 0, // _In_ DWORD dwCreationFlags, +// NULL, // _In_opt_ LPVOID lpEnvironment, +// NULL, // _In_opt_ LPCTSTR lpCurrentDirectory, +// &startup_info, // _In_ LPSTARTUPINFO lpStartupInfo, +// &proc_info // _Out_ LPPROCESS_INFORMATION lpProcessInformation +// ); + + // QString program = R"_(C:\prog\build-conoutputtest-Desktop_Qt_5_8_0_MSVC2015_32bit2-Debug\debug\conoutputtest.exe)_"; // QStringList arguments; // arguments << "/C" << "DIR /S c:\\"; @@ -188,6 +234,13 @@ void BackupDialog::on_btnStart_clicked() auto p = new QProcess(this); ConnectTo(p); p->setProcessEnvironment(env); + + p->setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args) + { + args->flags |= CREATE_NEW_CONSOLE; + args->flags &= ~DETACHED_PROCESS; + args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; + }); p->start(program, arguments); } @@ -221,3 +274,4 @@ void BackupDialog::on_selectDestination_clicked() ui->editFilename->setText(QDir::toNativeSeparators(fn)); } } + diff --git a/src/DatabaseWindow.cpp b/src/DatabaseWindow.cpp index 949a7fd..5494534 100644 --- a/src/DatabaseWindow.cpp +++ b/src/DatabaseWindow.cpp @@ -78,6 +78,8 @@ void DatabaseWindow::connectionStateChanged(ASyncDBConnection::State state) case ASyncDBConnection::State::CancelSend: status_str = tr("Query geannuleerd"); break; + case ASyncDBConnection::State::Terminating: + break; } // addLog(status_str); statusBar()->showMessage(status_str); diff --git a/src/PgAuthIdContainer.cpp b/src/PgAuthIdContainer.cpp index 161a723..3859a41 100644 --- a/src/PgAuthIdContainer.cpp +++ b/src/PgAuthIdContainer.cpp @@ -26,16 +26,16 @@ void PgAuthIdContainer::load(const Pgsql::Result &res) bool with_rls = (m_catalogue->serverVersion() >= 90500); for (auto row : res) { PgAuthId v; - v.oid = row.get(0); // InvalidOid; - v.name = row.get(1); - v.super = row.get(2); - v.inherit = row.get(3); - v.createRole = row.get(4); - v.createDB = row.get(5); - v.canlogin = row.get(6); - v.replication = row.get(7); - v.connLimit = row.get(8); - v.validUntil = row.get(9); + v.oid << row.get(0); // InvalidOid; + v.name << row.get(1); + v.super << row.get(2); + v.inherit << row.get(3); + v.createRole << row.get(4); + v.createDB << row.get(5); + v.canlogin << row.get(6); + v.replication << row.get(7); + v.connLimit << row.get(8); + v.validUntil << row.get(9); v.bypassRls = with_rls ? (bool)row.get(10) : false; // QDateTime m_container.push_back(v); diff --git a/src/PgDatabaseContainer.cpp b/src/PgDatabaseContainer.cpp index 8f3d8a2..927d93d 100644 --- a/src/PgDatabaseContainer.cpp +++ b/src/PgDatabaseContainer.cpp @@ -18,17 +18,17 @@ void PgDatabaseContainer::load(const Pgsql::Result &res) m_container.reserve(n_rows); for (auto row : res) { PgDatabase v; - v.oid = row.get(0); // InvalidOid; - v.name = row.get(1); - v.dba = row.get(2); // owner? - v.encoding = row.get(3); - v.collate = row.get(4); - v.ctype = row.get(5); - v.isTemplate = row.get(6); - v.allowConn = row.get(7); - v.connLimit = row.get(8); - v.tablespace = row.get(9); - v.acl = row.get(10); + v.oid << row.get(0); // InvalidOid; + v.name << row.get(1); + v.dba << row.get(2); // owner? + v.encoding << row.get(3); + v.collate << row.get(4); + v.ctype << row.get(5); + v.isTemplate << row.get(6); + v.allowConn << row.get(7); + v.connLimit << row.get(8); + v.tablespace << row.get(9); + v.acl << row.get(10); m_container.push_back(v); } std::sort(m_container.begin(), m_container.end()); diff --git a/src/PgTypeContainer.cpp b/src/PgTypeContainer.cpp index dba2c91..f1538c6 100644 --- a/src/PgTypeContainer.cpp +++ b/src/PgTypeContainer.cpp @@ -48,37 +48,37 @@ void PgTypeContainer::load(const Pgsql::Result &res) m_container.reserve(n_rows); for (auto row : res) { PgType v; - v.oid = row.get(0); // InvalidOid; - v.typname = row.get(1); //.asQString(); //. operator QString(); // "name";"NO" - v.typnamespace = row.get(2); // InvalidOid;//"oid";"NO" - v.typowner = row.get(3); // InvalidOid;//"oid";"NO" - v.typlen = row.get(4); // -1;//"smallint";"NO" - v.typbyval = row.get(5); // false;//"boolean";"NO" - v.typtype = row.get(6);//""char"";"NO" - v.typcategory = row.get(7);//""char"";"NO" - v.typispreferred = row.get(8); //false;//"boolean";"NO" - v.typisdefined = row.get(9); //false;//"boolean";"NO" - v.typdelim = row.get(10); //""char"";"NO" - v.typrelid = row.get(11); // InvalidOid;//"oid";"NO" - v.typelem = row.get(12); // InvalidOid;//"oid";"NO" - v.typarray = row.get(13); // InvalidOid;//"oid";"NO" - v.typinput = row.get(14).asQString();//regproc";"NO" - v.typoutput = row.get(15).asQString();//"regproc";"NO" - v.typreceive = row.get(16).asQString();//"regproc";"NO" - v.typsend = row.get(17).asQString();//"regproc";"NO" - v.typmodin = row.get(18).asQString();//"regproc";"NO" - v.typmodout = row.get(19).asQString();//"regproc";"NO" - v.typanalyze = row.get(20).asQString();//"regproc";"NO" - v.typalign = row.get(21); // //""char"";"NO" - v.typstorage = row.get(22); //""char"";"NO" - v.typnotnull = row.get(23); //"boolean";"NO" - v.typbasetype = row.get(24); //"oid";"NO" - v.typtypmod = row.get(25); //-1;//"integer";"NO" - v.typndims = row.get(26); //"integer";"NO" - v.typcollation = row.get(27); //InvalidOid;//"oid";"NO" - v.typdefaultbin = row.get(28).asQString();//"pg_node_tree";"YES" - v.typdefault = row.get(29).asQString();//"text";"YES" - v.typacl = row.get(30).asQString();//"ARRAY";"YES" + v.oid << row.get(0); // InvalidOid; + v.typname << row.get(1); //. operator QString(); // "name";"NO" + v.typnamespace << row.get(2); // InvalidOid;//"oid";"NO" + v.typowner << row.get(3); // InvalidOid;//"oid";"NO" + v.typlen << row.get(4); // -1;//"smallint";"NO" + v.typbyval << row.get(5); // false;//"boolean";"NO" + v.typtype << row.get(6);//""char"";"NO" + v.typcategory << row.get(7);//""char"";"NO" + v.typispreferred << row.get(8); //false;//"boolean";"NO" + v.typisdefined << row.get(9); //false;//"boolean";"NO" + v.typdelim << row.get(10); //""char"";"NO" + v.typrelid << row.get(11); // InvalidOid;//"oid";"NO" + v.typelem << row.get(12); // InvalidOid;//"oid";"NO" + v.typarray << row.get(13); // InvalidOid;//"oid";"NO" + v.typinput << row.get(14);//regproc";"NO" + v.typoutput << row.get(15);//"regproc";"NO" + v.typreceive << row.get(16);//"regproc";"NO" + v.typsend << row.get(17);//"regproc";"NO" + v.typmodin << row.get(18);//"regproc";"NO" + v.typmodout << row.get(19);//"regproc";"NO" + v.typanalyze << row.get(20);//"regproc";"NO" + v.typalign << row.get(21); // //""char"";"NO" + v.typstorage << row.get(22); //""char"";"NO" + v.typnotnull << row.get(23); //"boolean";"NO" + v.typbasetype << row.get(24); //"oid";"NO" + v.typtypmod << row.get(25); //-1;//"integer";"NO" + v.typndims << row.get(26); //"integer";"NO" + v.typcollation << row.get(27); //InvalidOid;//"oid";"NO" + v.typdefaultbin << row.get(28);//"pg_node_tree";"YES" + v.typdefault << row.get(29);//"text";"YES" + v.typacl << row.get(30);//"ARRAY";"YES" m_container.push_back(v); } std::sort(m_container.begin(), m_container.end()); diff --git a/src/PgsqlDatabaseCatalogue.cpp b/src/PgsqlDatabaseCatalogue.cpp index 45a6ae8..fafe34e 100644 --- a/src/PgsqlDatabaseCatalogue.cpp +++ b/src/PgsqlDatabaseCatalogue.cpp @@ -39,12 +39,12 @@ void PgsqlDatabaseCatalogue::loadInfo(Pgsql::Connection &conn) Pgsql::Result r = conn.query("SHOW server_version_num"); if (r && r.resultStatus() == PGRES_TUPLES_OK) if (r.rows() == 1) - m_serverVersion = r.get(0, 0); + m_serverVersion << r.get(0, 0); r = conn.query("SELECT version()"); if (r && r.resultStatus() == PGRES_TUPLES_OK) if (r.rows() == 1) - m_serverVersionString = r.get(0, 0); + m_serverVersionString = r.get(0, 0).asQString(); } void PgsqlDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) diff --git a/src/Pgsql_Params.cpp b/src/Pgsql_Params.cpp index 256c420..9245a8f 100644 --- a/src/Pgsql_Params.cpp +++ b/src/Pgsql_Params.cpp @@ -1,4 +1,5 @@ #include "Pgsql_Params.h" +#include using namespace Pgsql; @@ -30,16 +31,13 @@ Params::Params(Params&& rhs) , m_paramValues(std::move(rhs.m_paramValues)) , m_paramLengths(std::move(rhs.m_paramLengths)) , m_paramFormats(std::move(rhs.m_paramFormats)) -{ - //rhs.m_paramValues.clear(); // make sure origin is empty, to prevent double deletion -} +{} Params& Params::operator=(Params&& rhs) { if (&rhs != this) { m_paramTypes = std::move(rhs.m_paramTypes); m_paramValues = std::move(rhs.m_paramValues); - //rhs.m_paramValues.clear(); // make sure origin is empty, to prevent double deletion m_paramLengths = std::move(rhs.m_paramLengths); m_paramFormats = std::move(rhs.m_paramFormats); } diff --git a/src/Pgsql_Result.cpp b/src/Pgsql_Result.cpp index c8c9168..04a482d 100644 --- a/src/Pgsql_Result.cpp +++ b/src/Pgsql_Result.cpp @@ -153,7 +153,7 @@ int Result::cols() const return PQnfields(result); } -const char* const Result::getColName(int idx) const +const char * Result::getColName(int idx) const { return PQfname(result, idx); } diff --git a/src/Pgsql_Result.h b/src/Pgsql_Result.h index 992e3ec..fdcd54a 100644 --- a/src/Pgsql_Result.h +++ b/src/Pgsql_Result.h @@ -116,9 +116,9 @@ namespace Pgsql { int rows() const; int cols() const; - const char* const getColName(int idx) const; + const char* getColName(int idx) const; - const char * val(int col, int row) const; + const char* val(int col, int row) const; Value get(int col, int row) const; Oid type(int col) const; bool null(int col, int row) const; diff --git a/src/Pgsql_Value.cpp b/src/Pgsql_Value.cpp index ff490c5..731b2e8 100644 --- a/src/Pgsql_Value.cpp +++ b/src/Pgsql_Value.cpp @@ -54,3 +54,45 @@ Value::operator bool() const return std::strcmp(m_val, "t") == 0; } + + +//void operator<<(QString &s, const Value &v) +//{ +// s = v.asQString(); +//} + +//void operator<<(QDateTime &l, const Value &v) +//{ +// l = QDateTime::fromString(asQString(), +// "yyyy-MM-dd hh:mm:ss"); +//} + +//void operator<<(std::string &l, const Value &v) +//{ +// l = v; +//} + +//void operator<<(short &l, const Value &v) +//{ +// l = (short)std::atoi(v.c_str()); +//} + +//void operator<<(int &l, const Value &v) +//{ +// l = std::atoi(v.c_str()); +//} + +//void Pgsql::operator<<(Oid &l, const Value &v) +//{ +// l = std::atoi(v.c_str()); +//} + +//void operator<<(__int64 &l, const Value &v) +//{ +// l = std::strtoull(v.c_str(), nullptr, 10); +//} + +//void operator<<(bool &l, const Value &v) +//{ +// l = std::strcmp(v.c_str(), "t") == 0; +//} diff --git a/src/Pgsql_Value.h b/src/Pgsql_Value.h index 864b623..2eec654 100644 --- a/src/Pgsql_Value.h +++ b/src/Pgsql_Value.h @@ -13,6 +13,8 @@ namespace Pgsql { public: Value(const char *val, Oid typ); QString asQString() const; + const char* c_str() const { return m_val; } + operator QString() const; operator QDateTime() const; operator std::string() const; @@ -21,12 +23,24 @@ namespace Pgsql { operator Oid() const; operator __int64() const; operator bool() const; - private: const char *m_val; Oid m_typ; }; +// void operator<<(QString &s, const Value &v); +// void operator<<(QDateTime &l, const Value &v); +// void operator<<(std::string &l, const Value &v); +// void operator<<(short &l, const Value &v); +// void operator<<(int &l, const Value &v); +// void operator<<(Oid &l, const Value &v); +// void operator<<(__int64 &l, const Value &v); +// void operator<<(bool &l, const Value &v); + template + void operator<<(T &s, const Value &v) + { + s = static_cast(v); + } } // end namespace Pgsql diff --git a/src/QueryTab.cpp b/src/QueryTab.cpp index 979bf61..31d41c3 100644 --- a/src/QueryTab.cpp +++ b/src/QueryTab.cpp @@ -336,6 +336,8 @@ void QueryTab::connectionStateChanged(ASyncDBConnection::State state) case ASyncDBConnection::State::CancelSend: iconname = ":/icons/16x16/document_yellow.png"; break; + case ASyncDBConnection::State::Terminating: + break; } tabwidget->setTabIcon(i, QIcon(iconname)); } diff --git a/src/QueryTab.ui b/src/QueryTab.ui index 8be3be5..4c459db 100644 --- a/src/QueryTab.ui +++ b/src/QueryTab.ui @@ -15,197 +15,202 @@ - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - + + + Qt::Vertical + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Add + + + + + + + Remove + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + true + + + + + + + + + + + 1 + + + + Messages + + - 0 + 2 - 0 + 2 - 0 + 2 - 0 + 2 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Add - - - - - - - Remove - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - + + + true - - - - - - - 1 - - - - Messages - - - - 2 - - - 2 - - - 2 - - - 2 - - - - - true - - - - - - - - Explain - - - - 2 - - - 2 - - - 2 - - - 2 - - - - - QAbstractItemView::NoEditTriggers - - - false - - - true - - - 10 - - - false - - - false - - - - - - - - - - - - - - - Log - - - - 2 - - - 2 - - - 2 - - - 2 - - - - - + + + Explain + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + true + + + 10 + + + false + + + false + + + + + + + + Log + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + diff --git a/src/ServerWindow.cpp b/src/ServerWindow.cpp index a3f05ae..a08075e 100644 --- a/src/ServerWindow.cpp +++ b/src/ServerWindow.cpp @@ -7,8 +7,8 @@ ServerWindow::ServerWindow(MasterController *master, QWidget *parent) : ASyncWindow(parent) - , m_masterController(master) , ui(new Ui::ServerWindow) + , m_masterController(master) { ui->setupUi(this); diff --git a/src/main.cpp b/src/main.cpp index aea82ab..e7d0552 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,10 +25,7 @@ int main(int argc, char *argv[]) auto master_controller = std::make_unique(); master_controller->init(); - - int result = a.exec(); - WSACleanup(); return result; diff --git a/src/src.pro b/src/src.pro index 26ad4c4..98dddab 100644 --- a/src/src.pro +++ b/src/src.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -CONFIG += c++11 +CONFIG += c++14 QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets sql @@ -12,12 +12,13 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets sql TARGET = pglab TEMPLATE = app -INCLUDEPATH += C:\prog\include C:\VSproj\boost_1_63_0 +INCLUDEPATH += C:\prog\include C:\Prog\boost\include\boost-1_64 DEFINES += WIN32_LEAN_AND_MEAN NOMINMAX -LIBS += /LIBPATH:C:\VSproj\boost_1_63_0\stage\lib /LIBPATH:c:\prog\lib\ libpq.lib fmt.lib User32.lib ws2_32.lib +#LIBS += -LC:/prog/boost/lib -Lc:/prog/lib libpq.lib fmt.lib User32.lib ws2_32.lib +LIBS += -LC:/MINGW/LIB -LC:/PROG/LIB -lws2_32 -lpq debug { -LIBS += c:\prog\lib\botand_imp.lib +LIBS += c:/prog/lib/botand_imp.lib } release { @@ -139,7 +140,7 @@ FORMS += mainwindow.ui \ RESOURCES += \ resources.qrc -QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 +#QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../core/release/ -lcore else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../core/debug/ -lcore