From 04723a289b1b2e08b0e51e433acb346f8b519e0e Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Wed, 23 Aug 2017 08:10:01 +0200 Subject: [PATCH 01/34] Switching to linux for development of pglab. Switched from qmake to cmake. Code changes to make it compile. --- .gitignore | 1 + CMakeLists.txt | 110 ++++++++++++++++++ core/Core.cpp | 6 - core/Core.h | 12 -- core/CsvWriter.cpp | 2 +- core/PasswordManager.cpp | 1 - core/core.pro | 45 ------- {src => pglab}/.gitignore | 0 {src => pglab}/ASyncDBConnection.cpp | 4 +- {src => pglab}/ASyncDBConnection.h | 2 +- {src => pglab}/ASyncWindow.cpp | 0 {src => pglab}/ASyncWindow.h | 0 {src => pglab}/BackupDialog.cpp | 0 {src => pglab}/BackupDialog.h | 0 {src => pglab}/BackupDialog.ui | 0 {src => pglab}/BackupRestore.cpp | 0 {src => pglab}/ConnectionConfig.cpp | 0 {src => pglab}/ConnectionConfig.h | 0 {src => pglab}/ConnectionList.cpp | 0 {src => pglab}/ConnectionList.h | 0 {src => pglab}/ConnectionListModel.cpp | 0 {src => pglab}/ConnectionListModel.h | 0 {src => pglab}/ConnectionManagerWindow.cpp | 0 {src => pglab}/ConnectionManagerWindow.h | 0 {src => pglab}/ConnectionManagerWindow.ui | 0 {src => pglab}/DatabaseInspectorWidget.cpp | 0 {src => pglab}/DatabaseInspectorWidget.h | 0 {src => pglab}/DatabaseInspectorWidget.ui | 0 {src => pglab}/DatabaseWindow.cpp | 0 {src => pglab}/DatabaseWindow.h | 0 {src => pglab}/DatabaseWindow.ui | 0 {src => pglab}/DatabasesTableModel.cpp | 0 {src => pglab}/DatabasesTableModel.h | 0 {src => pglab}/Doxyfile | 0 {src => pglab}/ExplainTreeModelItem.cpp | 0 {src => pglab}/ExplainTreeModelItem.h | 0 {src => pglab}/MainWindow.cpp | 0 {src => pglab}/MainWindow.h | 0 {src => pglab}/MainWindow.ui | 0 {src => pglab}/MasterController.cpp | 0 {src => pglab}/MasterController.h | 0 {src => pglab}/OpenDatabase.cpp | 0 {src => pglab}/OpenDatabase.h | 0 {src => pglab}/ParamListModel.cpp | 0 {src => pglab}/ParamListModel.h | 0 {src => pglab}/ParamTypeDelegate.cpp | 0 {src => pglab}/ParamTypeDelegate.h | 0 {src => pglab}/PgAuthId.cpp | 0 {src => pglab}/PgAuthId.h | 0 {src => pglab}/PgAuthIdContainer.cpp | 0 {src => pglab}/PgAuthIdContainer.h | 0 {src => pglab}/PgClass.cpp | 0 {src => pglab}/PgClass.h | 0 {src => pglab}/PgContainer.h | 0 {src => pglab}/PgDatabase.cpp | 0 {src => pglab}/PgDatabase.h | 0 {src => pglab}/PgDatabaseContainer.cpp | 0 {src => pglab}/PgDatabaseContainer.h | 0 {src => pglab}/PgNamespace.cpp | 0 {src => pglab}/PgNamespace.h | 0 {src => pglab}/PgType.cpp | 0 {src => pglab}/PgType.h | 0 {src => pglab}/PgTypeContainer.cpp | 0 {src => pglab}/PgTypeContainer.h | 0 {src => pglab}/PgsqlConn.cpp | 0 {src => pglab}/PgsqlConn.h | 2 +- {src => pglab}/PgsqlDatabaseCatalogue.cpp | 0 {src => pglab}/PgsqlDatabaseCatalogue.h | 0 {src => pglab}/Pgsql_Params.cpp | 0 {src => pglab}/Pgsql_Params.h | 2 +- {src => pglab}/Pgsql_Result.cpp | 0 {src => pglab}/Pgsql_Result.h | 0 {src => pglab}/Pgsql_Row.cpp | 0 {src => pglab}/Pgsql_Row.h | 0 {src => pglab}/Pgsql_Value.cpp | 0 {src => pglab}/Pgsql_Value.h | 2 +- {src => pglab}/Pgsql_declare.h | 2 +- {src => pglab}/ProcessStdioWidget.cpp | 0 {src => pglab}/ProcessStdioWidget.h | 0 {src => pglab}/ProcessStdioWidget.ui | 0 {src => pglab}/QueryExplainModel.cpp | 0 {src => pglab}/QueryExplainModel.h | 0 {src => pglab}/QueryResultModel.cpp | 0 {src => pglab}/QueryResultModel.h | 0 {src => pglab}/QueryTab.cpp | 0 {src => pglab}/QueryTab.h | 0 {src => pglab}/QueryTab.ui | 0 {src => pglab}/RolesTableModel.cpp | 0 {src => pglab}/RolesTableModel.h | 0 {src => pglab}/ServerWindow.cpp | 0 {src => pglab}/ServerWindow.h | 0 {src => pglab}/ServerWindow.ui | 0 {src => pglab}/SqlSyntaxHighlighter.cpp | 0 {src => pglab}/SqlSyntaxHighlighter.h | 0 {src => pglab}/icons/16x16/document_green.png | Bin {src => pglab}/icons/16x16/document_red.png | Bin .../icons/16x16/document_yellow.png | Bin {src => pglab}/icons/backups.png | Bin {src => pglab}/icons/desktop.ini | 0 {src => pglab}/icons/folder.png | Bin {src => pglab}/icons/information.png | Bin {src => pglab}/icons/lightbulb.png | Bin {src => pglab}/icons/lightbulb_off.png | Bin {src => pglab}/icons/page_white_add.png | Bin {src => pglab}/icons/page_white_copy.png | Bin {src => pglab}/icons/page_white_delete.png | Bin {src => pglab}/icons/script_delete.png | Bin {src => pglab}/icons/script_go.png | Bin {src => pglab}/icons/script_save.png | Bin {src => pglab}/icons/server_add.png | Bin {src => pglab}/icons/server_delete.png | Bin {src => pglab}/icons/server_edit.png | Bin {src => pglab}/icons/server_go.png | Bin {src => pglab}/icons/table_save.png | Bin .../icons/token_shortland_character.png | Bin {src => pglab}/json/json-forwards.h | 0 {src => pglab}/json/json.h | 0 {src => pglab}/jsoncpp.cpp | 0 {src => pglab}/main.cpp | 0 {src => pglab}/pglab.ico | Bin {src => pglab}/resources.qrc | 0 {src => pglab}/sqlhighlighter.cpp | 0 {src => pglab}/sqlhighlighter.h | 0 {src => pglab}/sqlparser.cpp | 0 {src => pglab}/sqlparser.h | 0 {src => pglab}/src.pro | 0 {src => pglab}/stopwatch.cpp | 0 {src => pglab}/stopwatch.h | 0 {src => pglab}/tsqueue.cpp | 0 {src => pglab}/tsqueue.h | 0 {src => pglab}/tuplesresultwidget.cpp | 0 {src => pglab}/tuplesresultwidget.h | 0 {src => pglab}/tuplesresultwidget.ui | 0 {src => pglab}/typeselectionitemmodel.cpp | 0 {src => pglab}/typeselectionitemmodel.h | 0 {src => pglab}/util.cpp | 0 {src => pglab}/util.h | 0 {src => pglab}/waithandlelist.cpp | 0 {src => pglab}/waithandlelist.h | 2 + {src => pglab}/win32event.cpp | 0 {src => pglab}/win32event.h | 4 +- pglabAll.pro | 10 -- 142 files changed, 124 insertions(+), 83 deletions(-) create mode 100644 .gitignore create mode 100644 CMakeLists.txt delete mode 100644 core/Core.cpp delete mode 100644 core/Core.h delete mode 100644 core/core.pro rename {src => pglab}/.gitignore (100%) rename {src => pglab}/ASyncDBConnection.cpp (99%) rename {src => pglab}/ASyncDBConnection.h (99%) rename {src => pglab}/ASyncWindow.cpp (100%) rename {src => pglab}/ASyncWindow.h (100%) rename {src => pglab}/BackupDialog.cpp (100%) rename {src => pglab}/BackupDialog.h (100%) rename {src => pglab}/BackupDialog.ui (100%) rename {src => pglab}/BackupRestore.cpp (100%) rename {src => pglab}/ConnectionConfig.cpp (100%) rename {src => pglab}/ConnectionConfig.h (100%) rename {src => pglab}/ConnectionList.cpp (100%) rename {src => pglab}/ConnectionList.h (100%) rename {src => pglab}/ConnectionListModel.cpp (100%) rename {src => pglab}/ConnectionListModel.h (100%) rename {src => pglab}/ConnectionManagerWindow.cpp (100%) rename {src => pglab}/ConnectionManagerWindow.h (100%) rename {src => pglab}/ConnectionManagerWindow.ui (100%) rename {src => pglab}/DatabaseInspectorWidget.cpp (100%) rename {src => pglab}/DatabaseInspectorWidget.h (100%) rename {src => pglab}/DatabaseInspectorWidget.ui (100%) rename {src => pglab}/DatabaseWindow.cpp (100%) rename {src => pglab}/DatabaseWindow.h (100%) rename {src => pglab}/DatabaseWindow.ui (100%) rename {src => pglab}/DatabasesTableModel.cpp (100%) rename {src => pglab}/DatabasesTableModel.h (100%) rename {src => pglab}/Doxyfile (100%) rename {src => pglab}/ExplainTreeModelItem.cpp (100%) rename {src => pglab}/ExplainTreeModelItem.h (100%) rename {src => pglab}/MainWindow.cpp (100%) rename {src => pglab}/MainWindow.h (100%) rename {src => pglab}/MainWindow.ui (100%) rename {src => pglab}/MasterController.cpp (100%) rename {src => pglab}/MasterController.h (100%) rename {src => pglab}/OpenDatabase.cpp (100%) rename {src => pglab}/OpenDatabase.h (100%) rename {src => pglab}/ParamListModel.cpp (100%) rename {src => pglab}/ParamListModel.h (100%) rename {src => pglab}/ParamTypeDelegate.cpp (100%) rename {src => pglab}/ParamTypeDelegate.h (100%) rename {src => pglab}/PgAuthId.cpp (100%) rename {src => pglab}/PgAuthId.h (100%) rename {src => pglab}/PgAuthIdContainer.cpp (100%) rename {src => pglab}/PgAuthIdContainer.h (100%) rename {src => pglab}/PgClass.cpp (100%) rename {src => pglab}/PgClass.h (100%) rename {src => pglab}/PgContainer.h (100%) rename {src => pglab}/PgDatabase.cpp (100%) rename {src => pglab}/PgDatabase.h (100%) rename {src => pglab}/PgDatabaseContainer.cpp (100%) rename {src => pglab}/PgDatabaseContainer.h (100%) rename {src => pglab}/PgNamespace.cpp (100%) rename {src => pglab}/PgNamespace.h (100%) rename {src => pglab}/PgType.cpp (100%) rename {src => pglab}/PgType.h (100%) rename {src => pglab}/PgTypeContainer.cpp (100%) rename {src => pglab}/PgTypeContainer.h (100%) rename {src => pglab}/PgsqlConn.cpp (100%) rename {src => pglab}/PgsqlConn.h (99%) rename {src => pglab}/PgsqlDatabaseCatalogue.cpp (100%) rename {src => pglab}/PgsqlDatabaseCatalogue.h (100%) rename {src => pglab}/Pgsql_Params.cpp (100%) rename {src => pglab}/Pgsql_Params.h (98%) rename {src => pglab}/Pgsql_Result.cpp (100%) rename {src => pglab}/Pgsql_Result.h (100%) rename {src => pglab}/Pgsql_Row.cpp (100%) rename {src => pglab}/Pgsql_Row.h (100%) rename {src => pglab}/Pgsql_Value.cpp (100%) rename {src => pglab}/Pgsql_Value.h (97%) rename {src => pglab}/Pgsql_declare.h (94%) rename {src => pglab}/ProcessStdioWidget.cpp (100%) rename {src => pglab}/ProcessStdioWidget.h (100%) rename {src => pglab}/ProcessStdioWidget.ui (100%) rename {src => pglab}/QueryExplainModel.cpp (100%) rename {src => pglab}/QueryExplainModel.h (100%) rename {src => pglab}/QueryResultModel.cpp (100%) rename {src => pglab}/QueryResultModel.h (100%) rename {src => pglab}/QueryTab.cpp (100%) rename {src => pglab}/QueryTab.h (100%) rename {src => pglab}/QueryTab.ui (100%) rename {src => pglab}/RolesTableModel.cpp (100%) rename {src => pglab}/RolesTableModel.h (100%) rename {src => pglab}/ServerWindow.cpp (100%) rename {src => pglab}/ServerWindow.h (100%) rename {src => pglab}/ServerWindow.ui (100%) rename {src => pglab}/SqlSyntaxHighlighter.cpp (100%) rename {src => pglab}/SqlSyntaxHighlighter.h (100%) rename {src => pglab}/icons/16x16/document_green.png (100%) rename {src => pglab}/icons/16x16/document_red.png (100%) rename {src => pglab}/icons/16x16/document_yellow.png (100%) rename {src => pglab}/icons/backups.png (100%) rename {src => pglab}/icons/desktop.ini (100%) rename {src => pglab}/icons/folder.png (100%) rename {src => pglab}/icons/information.png (100%) rename {src => pglab}/icons/lightbulb.png (100%) rename {src => pglab}/icons/lightbulb_off.png (100%) rename {src => pglab}/icons/page_white_add.png (100%) rename {src => pglab}/icons/page_white_copy.png (100%) rename {src => pglab}/icons/page_white_delete.png (100%) rename {src => pglab}/icons/script_delete.png (100%) rename {src => pglab}/icons/script_go.png (100%) rename {src => pglab}/icons/script_save.png (100%) rename {src => pglab}/icons/server_add.png (100%) rename {src => pglab}/icons/server_delete.png (100%) rename {src => pglab}/icons/server_edit.png (100%) rename {src => pglab}/icons/server_go.png (100%) rename {src => pglab}/icons/table_save.png (100%) rename {src => pglab}/icons/token_shortland_character.png (100%) rename {src => pglab}/json/json-forwards.h (100%) rename {src => pglab}/json/json.h (100%) rename {src => pglab}/jsoncpp.cpp (100%) rename {src => pglab}/main.cpp (100%) rename {src => pglab}/pglab.ico (100%) rename {src => pglab}/resources.qrc (100%) rename {src => pglab}/sqlhighlighter.cpp (100%) rename {src => pglab}/sqlhighlighter.h (100%) rename {src => pglab}/sqlparser.cpp (100%) rename {src => pglab}/sqlparser.h (100%) rename {src => pglab}/src.pro (100%) rename {src => pglab}/stopwatch.cpp (100%) rename {src => pglab}/stopwatch.h (100%) rename {src => pglab}/tsqueue.cpp (100%) rename {src => pglab}/tsqueue.h (100%) rename {src => pglab}/tuplesresultwidget.cpp (100%) rename {src => pglab}/tuplesresultwidget.h (100%) rename {src => pglab}/tuplesresultwidget.ui (100%) rename {src => pglab}/typeselectionitemmodel.cpp (100%) rename {src => pglab}/typeselectionitemmodel.h (100%) rename {src => pglab}/util.cpp (100%) rename {src => pglab}/util.h (100%) rename {src => pglab}/waithandlelist.cpp (100%) rename {src => pglab}/waithandlelist.h (93%) rename {src => pglab}/win32event.cpp (100%) rename {src => pglab}/win32event.h (97%) delete mode 100644 pglabAll.pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0dcfbb3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,110 @@ +cmake_minimum_required(VERSION 3.1.0) +project(pglaball) + +#include(CheckCXXCompilerFlag) +find_package(PkgConfig REQUIRED) + + +# Check for standard to use +#set(CMAKE_CXX_STANDARD 14) + +include(CheckCXXCompilerFlag) + +# Check for standard to use +check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) +if(HAVE_FLAG_STD_CXX17) + # Have -std=c++17, use it + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") +else() + check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) + if(HAVE_FLAG_STD_CXX1Z) + # Have -std=c++1z, use it + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") + else() + # And so on and on... + endif() +endif() + +add_compile_options( -Wall -fpic -march=native ) +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Instruct CMake to run moc automatically when needed. +set(CMAKE_AUTOMOC ON) + +pkg_check_modules(Botan REQUIRED botan-2) +include_directories( ${Botan_INCLUDE_DIRS} ) +pkg_check_modules(Pq REQUIRED libpq) +include_directories( ${Pq_INCLUDE_DIRS} ) + +find_package(Qt5Widgets 5.7 REQUIRED) +include_directories( ${Qt5Widgets_INCLUDE_DIRS} ) + +find_package(fmt 4.0 REQUIRED) +include_directories( ${fmt_INCLUDE_DIRS} ) + +#find_package(Boost 1.62 REQUIRED) # COMPONENTS program_options REQUIRED ) +#include_directories( ${Boost_INCLUDE_DIRS} ) + +add_library(core STATIC + core/BackupFormatModel.cpp + core/CsvWriter.cpp + core/my_boost_assert_handler.cpp + core/PasswordManager.cpp + core/SqlLexer.cpp) + +add_executable(pglab + pglab/ASyncDBConnection.cpp + pglab/ASyncWindow.cpp + pglab/BackupDialog.cpp + pglab/BackupRestore.cpp + pglab/ConnectionConfig.cpp + pglab/ConnectionList.cpp + pglab/ConnectionListModel.cpp + pglab/ConnectionManagerWindow.cpp + pglab/DatabaseInspectorWidget.cpp + pglab/DatabasesTableModel.cpp + pglab/DatabaseWindow.cpp + pglab/ExplainTreeModelItem.cpp + pglab/jsoncpp.cpp + pglab/main.cpp + pglab/MainWindow.cpp + pglab/MasterController.cpp + pglab/OpenDatabase.cpp + pglab/ParamListModel.cpp + pglab/ParamTypeDelegate.cpp + pglab/PgAuthIdContainer.cpp + pglab/PgAuthId.cpp + pglab/PgClass.cpp + pglab/PgDatabaseContainer.cpp + pglab/PgDatabase.cpp + pglab/PgNamespace.cpp + pglab/PgsqlConn.cpp + pglab/PgsqlDatabaseCatalogue.cpp + pglab/Pgsql_Params.cpp + pglab/Pgsql_Result.cpp + pglab/Pgsql_Row.cpp + pglab/Pgsql_Value.cpp + pglab/PgTypeContainer.cpp + pglab/PgType.cpp + pglab/ProcessStdioWidget.cpp + pglab/QueryExplainModel.cpp + pglab/QueryResultModel.cpp + pglab/QueryTab.cpp + pglab/RolesTableModel.cpp + pglab/ServerWindow.cpp + pglab/sqlhighlighter.cpp + pglab/sqlparser.cpp + pglab/SqlSyntaxHighlighter.cpp + pglab/stopwatch.cpp + pglab/tsqueue.cpp + pglab/tuplesresultwidget.cpp + pglab/typeselectionitemmodel.cpp + pglab/util.cpp + pglab/waithandlelist.cpp + pglab/win32event.cpp + ) +target_include_directories(pglab PUBLIC + ./core + ) diff --git a/core/Core.cpp b/core/Core.cpp deleted file mode 100644 index dd60b7d..0000000 --- a/core/Core.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "Core.h" - - -Core::Core() -{ -} diff --git a/core/Core.h b/core/Core.h deleted file mode 100644 index 6ecb6d3..0000000 --- a/core/Core.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef CORE_H -#define CORE_H - - -class Core -{ - -public: - Core(); -}; - -#endif // CORE_H diff --git a/core/CsvWriter.cpp b/core/CsvWriter.cpp index a2bb973..b51ace3 100644 --- a/core/CsvWriter.cpp +++ b/core/CsvWriter.cpp @@ -1,4 +1,4 @@ -#include "csvwriter.h" +#include "CsvWriter.h" CsvWriter::CsvWriter() {} diff --git a/core/PasswordManager.cpp b/core/PasswordManager.cpp index 597e7c9..60ca821 100644 --- a/core/PasswordManager.cpp +++ b/core/PasswordManager.cpp @@ -13,7 +13,6 @@ #include -#include "Core.h" using namespace Botan; diff --git a/core/core.pro b/core/core.pro deleted file mode 100644 index 52efebe..0000000 --- a/core/core.pro +++ /dev/null @@ -1,45 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2017-02-26T10:51:14 -# -#------------------------------------------------- - -QT -= gui - -TARGET = core -TEMPLATE = lib -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 - - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which as been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += Core.cpp \ - my_boost_assert_handler.cpp \ - SqlLexer.cpp \ - PasswordManager.cpp \ - CsvWriter.cpp \ - BackupFormatModel.cpp - -HEADERS += Core.h \ - PasswordManager.h \ - SqlLexer.h \ - ScopeGuard.h \ - CsvWriter.h \ - BackupFormatModel.h -unix { - target.path = /usr/lib - INSTALLS += target -} diff --git a/src/.gitignore b/pglab/.gitignore similarity index 100% rename from src/.gitignore rename to pglab/.gitignore diff --git a/src/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp similarity index 99% rename from src/ASyncDBConnection.cpp rename to pglab/ASyncDBConnection.cpp index 95fa5f5..eb4387b 100644 --- a/src/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -1,6 +1,6 @@ -#include "asyncdbconnection.h" +#include "ASyncDBConnection.h" #include "waithandlelist.h" -#include "scopeguard.h" +#include "ScopeGuard.h" #include ASyncDBConnection::ASyncDBConnection() diff --git a/src/ASyncDBConnection.h b/pglab/ASyncDBConnection.h similarity index 99% rename from src/ASyncDBConnection.h rename to pglab/ASyncDBConnection.h index 07bb1bf..033beb5 100644 --- a/src/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -4,7 +4,7 @@ #include "PgsqlConn.h" #include "Pgsql_Params.h" #include "win32event.h" -#include "connectionconfig.h" +#include "ConnectionConfig.h" #include #include #include diff --git a/src/ASyncWindow.cpp b/pglab/ASyncWindow.cpp similarity index 100% rename from src/ASyncWindow.cpp rename to pglab/ASyncWindow.cpp diff --git a/src/ASyncWindow.h b/pglab/ASyncWindow.h similarity index 100% rename from src/ASyncWindow.h rename to pglab/ASyncWindow.h diff --git a/src/BackupDialog.cpp b/pglab/BackupDialog.cpp similarity index 100% rename from src/BackupDialog.cpp rename to pglab/BackupDialog.cpp diff --git a/src/BackupDialog.h b/pglab/BackupDialog.h similarity index 100% rename from src/BackupDialog.h rename to pglab/BackupDialog.h diff --git a/src/BackupDialog.ui b/pglab/BackupDialog.ui similarity index 100% rename from src/BackupDialog.ui rename to pglab/BackupDialog.ui diff --git a/src/BackupRestore.cpp b/pglab/BackupRestore.cpp similarity index 100% rename from src/BackupRestore.cpp rename to pglab/BackupRestore.cpp diff --git a/src/ConnectionConfig.cpp b/pglab/ConnectionConfig.cpp similarity index 100% rename from src/ConnectionConfig.cpp rename to pglab/ConnectionConfig.cpp diff --git a/src/ConnectionConfig.h b/pglab/ConnectionConfig.h similarity index 100% rename from src/ConnectionConfig.h rename to pglab/ConnectionConfig.h diff --git a/src/ConnectionList.cpp b/pglab/ConnectionList.cpp similarity index 100% rename from src/ConnectionList.cpp rename to pglab/ConnectionList.cpp diff --git a/src/ConnectionList.h b/pglab/ConnectionList.h similarity index 100% rename from src/ConnectionList.h rename to pglab/ConnectionList.h diff --git a/src/ConnectionListModel.cpp b/pglab/ConnectionListModel.cpp similarity index 100% rename from src/ConnectionListModel.cpp rename to pglab/ConnectionListModel.cpp diff --git a/src/ConnectionListModel.h b/pglab/ConnectionListModel.h similarity index 100% rename from src/ConnectionListModel.h rename to pglab/ConnectionListModel.h diff --git a/src/ConnectionManagerWindow.cpp b/pglab/ConnectionManagerWindow.cpp similarity index 100% rename from src/ConnectionManagerWindow.cpp rename to pglab/ConnectionManagerWindow.cpp diff --git a/src/ConnectionManagerWindow.h b/pglab/ConnectionManagerWindow.h similarity index 100% rename from src/ConnectionManagerWindow.h rename to pglab/ConnectionManagerWindow.h diff --git a/src/ConnectionManagerWindow.ui b/pglab/ConnectionManagerWindow.ui similarity index 100% rename from src/ConnectionManagerWindow.ui rename to pglab/ConnectionManagerWindow.ui diff --git a/src/DatabaseInspectorWidget.cpp b/pglab/DatabaseInspectorWidget.cpp similarity index 100% rename from src/DatabaseInspectorWidget.cpp rename to pglab/DatabaseInspectorWidget.cpp diff --git a/src/DatabaseInspectorWidget.h b/pglab/DatabaseInspectorWidget.h similarity index 100% rename from src/DatabaseInspectorWidget.h rename to pglab/DatabaseInspectorWidget.h diff --git a/src/DatabaseInspectorWidget.ui b/pglab/DatabaseInspectorWidget.ui similarity index 100% rename from src/DatabaseInspectorWidget.ui rename to pglab/DatabaseInspectorWidget.ui diff --git a/src/DatabaseWindow.cpp b/pglab/DatabaseWindow.cpp similarity index 100% rename from src/DatabaseWindow.cpp rename to pglab/DatabaseWindow.cpp diff --git a/src/DatabaseWindow.h b/pglab/DatabaseWindow.h similarity index 100% rename from src/DatabaseWindow.h rename to pglab/DatabaseWindow.h diff --git a/src/DatabaseWindow.ui b/pglab/DatabaseWindow.ui similarity index 100% rename from src/DatabaseWindow.ui rename to pglab/DatabaseWindow.ui diff --git a/src/DatabasesTableModel.cpp b/pglab/DatabasesTableModel.cpp similarity index 100% rename from src/DatabasesTableModel.cpp rename to pglab/DatabasesTableModel.cpp diff --git a/src/DatabasesTableModel.h b/pglab/DatabasesTableModel.h similarity index 100% rename from src/DatabasesTableModel.h rename to pglab/DatabasesTableModel.h diff --git a/src/Doxyfile b/pglab/Doxyfile similarity index 100% rename from src/Doxyfile rename to pglab/Doxyfile diff --git a/src/ExplainTreeModelItem.cpp b/pglab/ExplainTreeModelItem.cpp similarity index 100% rename from src/ExplainTreeModelItem.cpp rename to pglab/ExplainTreeModelItem.cpp diff --git a/src/ExplainTreeModelItem.h b/pglab/ExplainTreeModelItem.h similarity index 100% rename from src/ExplainTreeModelItem.h rename to pglab/ExplainTreeModelItem.h diff --git a/src/MainWindow.cpp b/pglab/MainWindow.cpp similarity index 100% rename from src/MainWindow.cpp rename to pglab/MainWindow.cpp diff --git a/src/MainWindow.h b/pglab/MainWindow.h similarity index 100% rename from src/MainWindow.h rename to pglab/MainWindow.h diff --git a/src/MainWindow.ui b/pglab/MainWindow.ui similarity index 100% rename from src/MainWindow.ui rename to pglab/MainWindow.ui diff --git a/src/MasterController.cpp b/pglab/MasterController.cpp similarity index 100% rename from src/MasterController.cpp rename to pglab/MasterController.cpp diff --git a/src/MasterController.h b/pglab/MasterController.h similarity index 100% rename from src/MasterController.h rename to pglab/MasterController.h diff --git a/src/OpenDatabase.cpp b/pglab/OpenDatabase.cpp similarity index 100% rename from src/OpenDatabase.cpp rename to pglab/OpenDatabase.cpp diff --git a/src/OpenDatabase.h b/pglab/OpenDatabase.h similarity index 100% rename from src/OpenDatabase.h rename to pglab/OpenDatabase.h diff --git a/src/ParamListModel.cpp b/pglab/ParamListModel.cpp similarity index 100% rename from src/ParamListModel.cpp rename to pglab/ParamListModel.cpp diff --git a/src/ParamListModel.h b/pglab/ParamListModel.h similarity index 100% rename from src/ParamListModel.h rename to pglab/ParamListModel.h diff --git a/src/ParamTypeDelegate.cpp b/pglab/ParamTypeDelegate.cpp similarity index 100% rename from src/ParamTypeDelegate.cpp rename to pglab/ParamTypeDelegate.cpp diff --git a/src/ParamTypeDelegate.h b/pglab/ParamTypeDelegate.h similarity index 100% rename from src/ParamTypeDelegate.h rename to pglab/ParamTypeDelegate.h diff --git a/src/PgAuthId.cpp b/pglab/PgAuthId.cpp similarity index 100% rename from src/PgAuthId.cpp rename to pglab/PgAuthId.cpp diff --git a/src/PgAuthId.h b/pglab/PgAuthId.h similarity index 100% rename from src/PgAuthId.h rename to pglab/PgAuthId.h diff --git a/src/PgAuthIdContainer.cpp b/pglab/PgAuthIdContainer.cpp similarity index 100% rename from src/PgAuthIdContainer.cpp rename to pglab/PgAuthIdContainer.cpp diff --git a/src/PgAuthIdContainer.h b/pglab/PgAuthIdContainer.h similarity index 100% rename from src/PgAuthIdContainer.h rename to pglab/PgAuthIdContainer.h diff --git a/src/PgClass.cpp b/pglab/PgClass.cpp similarity index 100% rename from src/PgClass.cpp rename to pglab/PgClass.cpp diff --git a/src/PgClass.h b/pglab/PgClass.h similarity index 100% rename from src/PgClass.h rename to pglab/PgClass.h diff --git a/src/PgContainer.h b/pglab/PgContainer.h similarity index 100% rename from src/PgContainer.h rename to pglab/PgContainer.h diff --git a/src/PgDatabase.cpp b/pglab/PgDatabase.cpp similarity index 100% rename from src/PgDatabase.cpp rename to pglab/PgDatabase.cpp diff --git a/src/PgDatabase.h b/pglab/PgDatabase.h similarity index 100% rename from src/PgDatabase.h rename to pglab/PgDatabase.h diff --git a/src/PgDatabaseContainer.cpp b/pglab/PgDatabaseContainer.cpp similarity index 100% rename from src/PgDatabaseContainer.cpp rename to pglab/PgDatabaseContainer.cpp diff --git a/src/PgDatabaseContainer.h b/pglab/PgDatabaseContainer.h similarity index 100% rename from src/PgDatabaseContainer.h rename to pglab/PgDatabaseContainer.h diff --git a/src/PgNamespace.cpp b/pglab/PgNamespace.cpp similarity index 100% rename from src/PgNamespace.cpp rename to pglab/PgNamespace.cpp diff --git a/src/PgNamespace.h b/pglab/PgNamespace.h similarity index 100% rename from src/PgNamespace.h rename to pglab/PgNamespace.h diff --git a/src/PgType.cpp b/pglab/PgType.cpp similarity index 100% rename from src/PgType.cpp rename to pglab/PgType.cpp diff --git a/src/PgType.h b/pglab/PgType.h similarity index 100% rename from src/PgType.h rename to pglab/PgType.h diff --git a/src/PgTypeContainer.cpp b/pglab/PgTypeContainer.cpp similarity index 100% rename from src/PgTypeContainer.cpp rename to pglab/PgTypeContainer.cpp diff --git a/src/PgTypeContainer.h b/pglab/PgTypeContainer.h similarity index 100% rename from src/PgTypeContainer.h rename to pglab/PgTypeContainer.h diff --git a/src/PgsqlConn.cpp b/pglab/PgsqlConn.cpp similarity index 100% rename from src/PgsqlConn.cpp rename to pglab/PgsqlConn.cpp diff --git a/src/PgsqlConn.h b/pglab/PgsqlConn.h similarity index 99% rename from src/PgsqlConn.h rename to pglab/PgsqlConn.h index 80654c7..74dbf1c 100644 --- a/src/PgsqlConn.h +++ b/pglab/PgsqlConn.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include diff --git a/src/PgsqlDatabaseCatalogue.cpp b/pglab/PgsqlDatabaseCatalogue.cpp similarity index 100% rename from src/PgsqlDatabaseCatalogue.cpp rename to pglab/PgsqlDatabaseCatalogue.cpp diff --git a/src/PgsqlDatabaseCatalogue.h b/pglab/PgsqlDatabaseCatalogue.h similarity index 100% rename from src/PgsqlDatabaseCatalogue.h rename to pglab/PgsqlDatabaseCatalogue.h diff --git a/src/Pgsql_Params.cpp b/pglab/Pgsql_Params.cpp similarity index 100% rename from src/Pgsql_Params.cpp rename to pglab/Pgsql_Params.cpp diff --git a/src/Pgsql_Params.h b/pglab/Pgsql_Params.h similarity index 98% rename from src/Pgsql_Params.h rename to pglab/Pgsql_Params.h index 7e10e88..a9e9950 100644 --- a/src/Pgsql_Params.h +++ b/pglab/Pgsql_Params.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include "Pgsql_declare.h" namespace Pgsql { diff --git a/src/Pgsql_Result.cpp b/pglab/Pgsql_Result.cpp similarity index 100% rename from src/Pgsql_Result.cpp rename to pglab/Pgsql_Result.cpp diff --git a/src/Pgsql_Result.h b/pglab/Pgsql_Result.h similarity index 100% rename from src/Pgsql_Result.h rename to pglab/Pgsql_Result.h diff --git a/src/Pgsql_Row.cpp b/pglab/Pgsql_Row.cpp similarity index 100% rename from src/Pgsql_Row.cpp rename to pglab/Pgsql_Row.cpp diff --git a/src/Pgsql_Row.h b/pglab/Pgsql_Row.h similarity index 100% rename from src/Pgsql_Row.h rename to pglab/Pgsql_Row.h diff --git a/src/Pgsql_Value.cpp b/pglab/Pgsql_Value.cpp similarity index 100% rename from src/Pgsql_Value.cpp rename to pglab/Pgsql_Value.cpp diff --git a/src/Pgsql_Value.h b/pglab/Pgsql_Value.h similarity index 97% rename from src/Pgsql_Value.h rename to pglab/Pgsql_Value.h index 2eec654..30da472 100644 --- a/src/Pgsql_Value.h +++ b/pglab/Pgsql_Value.h @@ -21,7 +21,7 @@ namespace Pgsql { operator short() const; operator int() const; operator Oid() const; - operator __int64() const; + operator long long() const; operator bool() const; private: const char *m_val; diff --git a/src/Pgsql_declare.h b/pglab/Pgsql_declare.h similarity index 94% rename from src/Pgsql_declare.h rename to pglab/Pgsql_declare.h index 9454641..279d09b 100644 --- a/src/Pgsql_declare.h +++ b/pglab/Pgsql_declare.h @@ -1,7 +1,7 @@ #ifndef PGSQL_DECLARE_H #define PGSQL_DECLARE_H -#include +#include namespace Pgsql { diff --git a/src/ProcessStdioWidget.cpp b/pglab/ProcessStdioWidget.cpp similarity index 100% rename from src/ProcessStdioWidget.cpp rename to pglab/ProcessStdioWidget.cpp diff --git a/src/ProcessStdioWidget.h b/pglab/ProcessStdioWidget.h similarity index 100% rename from src/ProcessStdioWidget.h rename to pglab/ProcessStdioWidget.h diff --git a/src/ProcessStdioWidget.ui b/pglab/ProcessStdioWidget.ui similarity index 100% rename from src/ProcessStdioWidget.ui rename to pglab/ProcessStdioWidget.ui diff --git a/src/QueryExplainModel.cpp b/pglab/QueryExplainModel.cpp similarity index 100% rename from src/QueryExplainModel.cpp rename to pglab/QueryExplainModel.cpp diff --git a/src/QueryExplainModel.h b/pglab/QueryExplainModel.h similarity index 100% rename from src/QueryExplainModel.h rename to pglab/QueryExplainModel.h diff --git a/src/QueryResultModel.cpp b/pglab/QueryResultModel.cpp similarity index 100% rename from src/QueryResultModel.cpp rename to pglab/QueryResultModel.cpp diff --git a/src/QueryResultModel.h b/pglab/QueryResultModel.h similarity index 100% rename from src/QueryResultModel.h rename to pglab/QueryResultModel.h diff --git a/src/QueryTab.cpp b/pglab/QueryTab.cpp similarity index 100% rename from src/QueryTab.cpp rename to pglab/QueryTab.cpp diff --git a/src/QueryTab.h b/pglab/QueryTab.h similarity index 100% rename from src/QueryTab.h rename to pglab/QueryTab.h diff --git a/src/QueryTab.ui b/pglab/QueryTab.ui similarity index 100% rename from src/QueryTab.ui rename to pglab/QueryTab.ui diff --git a/src/RolesTableModel.cpp b/pglab/RolesTableModel.cpp similarity index 100% rename from src/RolesTableModel.cpp rename to pglab/RolesTableModel.cpp diff --git a/src/RolesTableModel.h b/pglab/RolesTableModel.h similarity index 100% rename from src/RolesTableModel.h rename to pglab/RolesTableModel.h diff --git a/src/ServerWindow.cpp b/pglab/ServerWindow.cpp similarity index 100% rename from src/ServerWindow.cpp rename to pglab/ServerWindow.cpp diff --git a/src/ServerWindow.h b/pglab/ServerWindow.h similarity index 100% rename from src/ServerWindow.h rename to pglab/ServerWindow.h diff --git a/src/ServerWindow.ui b/pglab/ServerWindow.ui similarity index 100% rename from src/ServerWindow.ui rename to pglab/ServerWindow.ui diff --git a/src/SqlSyntaxHighlighter.cpp b/pglab/SqlSyntaxHighlighter.cpp similarity index 100% rename from src/SqlSyntaxHighlighter.cpp rename to pglab/SqlSyntaxHighlighter.cpp diff --git a/src/SqlSyntaxHighlighter.h b/pglab/SqlSyntaxHighlighter.h similarity index 100% rename from src/SqlSyntaxHighlighter.h rename to pglab/SqlSyntaxHighlighter.h diff --git a/src/icons/16x16/document_green.png b/pglab/icons/16x16/document_green.png similarity index 100% rename from src/icons/16x16/document_green.png rename to pglab/icons/16x16/document_green.png diff --git a/src/icons/16x16/document_red.png b/pglab/icons/16x16/document_red.png similarity index 100% rename from src/icons/16x16/document_red.png rename to pglab/icons/16x16/document_red.png diff --git a/src/icons/16x16/document_yellow.png b/pglab/icons/16x16/document_yellow.png similarity index 100% rename from src/icons/16x16/document_yellow.png rename to pglab/icons/16x16/document_yellow.png diff --git a/src/icons/backups.png b/pglab/icons/backups.png similarity index 100% rename from src/icons/backups.png rename to pglab/icons/backups.png diff --git a/src/icons/desktop.ini b/pglab/icons/desktop.ini similarity index 100% rename from src/icons/desktop.ini rename to pglab/icons/desktop.ini diff --git a/src/icons/folder.png b/pglab/icons/folder.png similarity index 100% rename from src/icons/folder.png rename to pglab/icons/folder.png diff --git a/src/icons/information.png b/pglab/icons/information.png similarity index 100% rename from src/icons/information.png rename to pglab/icons/information.png diff --git a/src/icons/lightbulb.png b/pglab/icons/lightbulb.png similarity index 100% rename from src/icons/lightbulb.png rename to pglab/icons/lightbulb.png diff --git a/src/icons/lightbulb_off.png b/pglab/icons/lightbulb_off.png similarity index 100% rename from src/icons/lightbulb_off.png rename to pglab/icons/lightbulb_off.png diff --git a/src/icons/page_white_add.png b/pglab/icons/page_white_add.png similarity index 100% rename from src/icons/page_white_add.png rename to pglab/icons/page_white_add.png diff --git a/src/icons/page_white_copy.png b/pglab/icons/page_white_copy.png similarity index 100% rename from src/icons/page_white_copy.png rename to pglab/icons/page_white_copy.png diff --git a/src/icons/page_white_delete.png b/pglab/icons/page_white_delete.png similarity index 100% rename from src/icons/page_white_delete.png rename to pglab/icons/page_white_delete.png diff --git a/src/icons/script_delete.png b/pglab/icons/script_delete.png similarity index 100% rename from src/icons/script_delete.png rename to pglab/icons/script_delete.png diff --git a/src/icons/script_go.png b/pglab/icons/script_go.png similarity index 100% rename from src/icons/script_go.png rename to pglab/icons/script_go.png diff --git a/src/icons/script_save.png b/pglab/icons/script_save.png similarity index 100% rename from src/icons/script_save.png rename to pglab/icons/script_save.png diff --git a/src/icons/server_add.png b/pglab/icons/server_add.png similarity index 100% rename from src/icons/server_add.png rename to pglab/icons/server_add.png diff --git a/src/icons/server_delete.png b/pglab/icons/server_delete.png similarity index 100% rename from src/icons/server_delete.png rename to pglab/icons/server_delete.png diff --git a/src/icons/server_edit.png b/pglab/icons/server_edit.png similarity index 100% rename from src/icons/server_edit.png rename to pglab/icons/server_edit.png diff --git a/src/icons/server_go.png b/pglab/icons/server_go.png similarity index 100% rename from src/icons/server_go.png rename to pglab/icons/server_go.png diff --git a/src/icons/table_save.png b/pglab/icons/table_save.png similarity index 100% rename from src/icons/table_save.png rename to pglab/icons/table_save.png diff --git a/src/icons/token_shortland_character.png b/pglab/icons/token_shortland_character.png similarity index 100% rename from src/icons/token_shortland_character.png rename to pglab/icons/token_shortland_character.png diff --git a/src/json/json-forwards.h b/pglab/json/json-forwards.h similarity index 100% rename from src/json/json-forwards.h rename to pglab/json/json-forwards.h diff --git a/src/json/json.h b/pglab/json/json.h similarity index 100% rename from src/json/json.h rename to pglab/json/json.h diff --git a/src/jsoncpp.cpp b/pglab/jsoncpp.cpp similarity index 100% rename from src/jsoncpp.cpp rename to pglab/jsoncpp.cpp diff --git a/src/main.cpp b/pglab/main.cpp similarity index 100% rename from src/main.cpp rename to pglab/main.cpp diff --git a/src/pglab.ico b/pglab/pglab.ico similarity index 100% rename from src/pglab.ico rename to pglab/pglab.ico diff --git a/src/resources.qrc b/pglab/resources.qrc similarity index 100% rename from src/resources.qrc rename to pglab/resources.qrc diff --git a/src/sqlhighlighter.cpp b/pglab/sqlhighlighter.cpp similarity index 100% rename from src/sqlhighlighter.cpp rename to pglab/sqlhighlighter.cpp diff --git a/src/sqlhighlighter.h b/pglab/sqlhighlighter.h similarity index 100% rename from src/sqlhighlighter.h rename to pglab/sqlhighlighter.h diff --git a/src/sqlparser.cpp b/pglab/sqlparser.cpp similarity index 100% rename from src/sqlparser.cpp rename to pglab/sqlparser.cpp diff --git a/src/sqlparser.h b/pglab/sqlparser.h similarity index 100% rename from src/sqlparser.h rename to pglab/sqlparser.h diff --git a/src/src.pro b/pglab/src.pro similarity index 100% rename from src/src.pro rename to pglab/src.pro diff --git a/src/stopwatch.cpp b/pglab/stopwatch.cpp similarity index 100% rename from src/stopwatch.cpp rename to pglab/stopwatch.cpp diff --git a/src/stopwatch.h b/pglab/stopwatch.h similarity index 100% rename from src/stopwatch.h rename to pglab/stopwatch.h diff --git a/src/tsqueue.cpp b/pglab/tsqueue.cpp similarity index 100% rename from src/tsqueue.cpp rename to pglab/tsqueue.cpp diff --git a/src/tsqueue.h b/pglab/tsqueue.h similarity index 100% rename from src/tsqueue.h rename to pglab/tsqueue.h diff --git a/src/tuplesresultwidget.cpp b/pglab/tuplesresultwidget.cpp similarity index 100% rename from src/tuplesresultwidget.cpp rename to pglab/tuplesresultwidget.cpp diff --git a/src/tuplesresultwidget.h b/pglab/tuplesresultwidget.h similarity index 100% rename from src/tuplesresultwidget.h rename to pglab/tuplesresultwidget.h diff --git a/src/tuplesresultwidget.ui b/pglab/tuplesresultwidget.ui similarity index 100% rename from src/tuplesresultwidget.ui rename to pglab/tuplesresultwidget.ui diff --git a/src/typeselectionitemmodel.cpp b/pglab/typeselectionitemmodel.cpp similarity index 100% rename from src/typeselectionitemmodel.cpp rename to pglab/typeselectionitemmodel.cpp diff --git a/src/typeselectionitemmodel.h b/pglab/typeselectionitemmodel.h similarity index 100% rename from src/typeselectionitemmodel.h rename to pglab/typeselectionitemmodel.h diff --git a/src/util.cpp b/pglab/util.cpp similarity index 100% rename from src/util.cpp rename to pglab/util.cpp diff --git a/src/util.h b/pglab/util.h similarity index 100% rename from src/util.h rename to pglab/util.h diff --git a/src/waithandlelist.cpp b/pglab/waithandlelist.cpp similarity index 100% rename from src/waithandlelist.cpp rename to pglab/waithandlelist.cpp diff --git a/src/waithandlelist.h b/pglab/waithandlelist.h similarity index 93% rename from src/waithandlelist.h rename to pglab/waithandlelist.h index 376e817..38852b6 100644 --- a/src/waithandlelist.h +++ b/pglab/waithandlelist.h @@ -1,6 +1,7 @@ #ifndef WAITHANDLELIST_H #define WAITHANDLELIST_H +#ifdef _WIN32 #include #include @@ -22,5 +23,6 @@ public: private: std::vector m_waitHandles; }; +#endif // _WIN32 #endif // WAITHANDLELIST_H diff --git a/src/win32event.cpp b/pglab/win32event.cpp similarity index 100% rename from src/win32event.cpp rename to pglab/win32event.cpp diff --git a/src/win32event.h b/pglab/win32event.h similarity index 97% rename from src/win32event.h rename to pglab/win32event.h index 684d13f..d197556 100644 --- a/src/win32event.h +++ b/pglab/win32event.h @@ -1,8 +1,9 @@ #ifndef WIN32EVENT_H #define WIN32EVENT_H -#include +#ifdef _WIN32 +#include #include /** Simpel wrapper around a Win32 Event object. @@ -43,5 +44,6 @@ public: private: HANDLE hEvent; }; +#endif // _WIN32 #endif // WIN32EVENT_H diff --git a/pglabAll.pro b/pglabAll.pro deleted file mode 100644 index 14311a6..0000000 --- a/pglabAll.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = subdirs - -DEFINES += BOOST_ENABLE_ASSERT_HANDLER - -SUBDIRS += src \ - core - -CONFIG(debug, debug|release) { - SUBDIRS += tests -} From 6a97c0447a9fbf01e365591e32327f2f8f8228bc Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Wed, 23 Aug 2017 13:27:23 +0200 Subject: [PATCH 02/34] Compiles, links and runs (functionality not tested) --- BUILD | 4 + CMakeLists.txt | 61 +++++---- pglab/ASyncDBConnection.cpp | 118 ++++++++++++------ pglab/ASyncDBConnection.h | 14 ++- pglab/BackupDialog.cpp | 9 +- pglab/BackupRestore.cpp | 2 +- pglab/ConnectionConfig.cpp | 2 +- pglab/ConnectionList.cpp | 2 +- pglab/ConnectionListModel.cpp | 2 +- pglab/ConnectionListModel.h | 4 +- pglab/ConnectionManagerWindow.cpp | 7 +- pglab/DatabaseInspectorWidget.cpp | 4 +- pglab/DatabaseWindow.cpp | 4 +- pglab/DatabaseWindow.h | 2 +- pglab/ExplainTreeModelItem.cpp | 2 +- pglab/MainWindow.cpp | 5 +- pglab/MainWindow.h | 4 +- pglab/OpenDatabase.cpp | 4 +- pglab/OpenDatabase.h | 4 +- pglab/PgAuthId.h | 2 +- pglab/PgClass.cpp | 2 +- pglab/PgClass.h | 2 +- pglab/PgContainer.h | 2 +- pglab/PgDatabase.h | 2 +- pglab/PgNamespace.cpp | 2 +- pglab/PgNamespace.h | 2 +- pglab/PgType.cpp | 2 +- pglab/PgType.h | 2 +- pglab/PgTypeContainer.cpp | 2 +- pglab/PgTypeContainer.h | 2 +- pglab/PgsqlDatabaseCatalogue.h | 2 +- pglab/Pgsql_Value.cpp | 2 +- pglab/QueryExplainModel.cpp | 5 +- pglab/QueryExplainModel.h | 2 +- pglab/QueryResultModel.cpp | 2 +- pglab/QueryTab.cpp | 10 +- pglab/QueryTab.h | 6 +- ...{sqlhighlighter.cpp => SqlHighlighter.cpp} | 20 +-- pglab/{sqlhighlighter.h => SqlHighlighter.h} | 0 pglab/SqlSyntaxHighlighter.cpp | 2 +- ...emmodel.cpp => TypeSelectionItemModel.cpp} | 6 +- ...onitemmodel.h => TypeSelectionItemModel.h} | 0 pglab/main.cpp | 10 +- pglab/tsqueue.cpp | 14 +-- pglab/tsqueue.h | 6 +- pglab/tuplesresultwidget.h | 2 +- pglab/util.cpp | 5 +- pglab/waithandlelist.cpp | 3 + 48 files changed, 224 insertions(+), 149 deletions(-) create mode 100644 BUILD rename pglab/{sqlhighlighter.cpp => SqlHighlighter.cpp} (82%) rename pglab/{sqlhighlighter.h => SqlHighlighter.h} (100%) rename pglab/{typeselectionitemmodel.cpp => TypeSelectionItemModel.cpp} (94%) rename pglab/{typeselectionitemmodel.h => TypeSelectionItemModel.h} (100%) diff --git a/BUILD b/BUILD new file mode 100644 index 0000000..7ff14d1 --- /dev/null +++ b/BUILD @@ -0,0 +1,4 @@ + +If it doesn't detect Qt CMAKE_PREFIX_PATH needs to be set + +export CMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0dcfbb3..871c289 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,29 +1,35 @@ cmake_minimum_required(VERSION 3.1.0) project(pglaball) -#include(CheckCXXCompilerFlag) +set (CMAKE_PREFIX_PATH /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake) + find_package(PkgConfig REQUIRED) +# include(CheckCXXCompilerFlag) +# +# # Check for standard to use +# check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) +# if(HAVE_FLAG_STD_CXX17) +# # Have -std=c++17, use it +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") +# else() +# check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) +# if(HAVE_FLAG_STD_CXX1Z) +# # Have -std=c++1z, use it +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") +# else() +# check_cxx_compiler_flag(-std=c++14 HAVE_FLAG_STD_CXX14) +# if(HAVE_FLAG_STD_CXX14) +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") +# endif() +# +# # And so on and on... +# endif() +# endif() -# Check for standard to use -#set(CMAKE_CXX_STANDARD 14) - -include(CheckCXXCompilerFlag) - -# Check for standard to use -check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) -if(HAVE_FLAG_STD_CXX17) - # Have -std=c++17, use it - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") -else() - check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) - if(HAVE_FLAG_STD_CXX1Z) - # Have -std=c++1z, use it - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") - else() - # And so on and on... - endif() -endif() +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) add_compile_options( -Wall -fpic -march=native ) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") @@ -32,6 +38,7 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) pkg_check_modules(Botan REQUIRED botan-2) include_directories( ${Botan_INCLUDE_DIRS} ) @@ -94,17 +101,27 @@ add_executable(pglab pglab/QueryTab.cpp pglab/RolesTableModel.cpp pglab/ServerWindow.cpp - pglab/sqlhighlighter.cpp + pglab/SqlHighlighter.cpp pglab/sqlparser.cpp pglab/SqlSyntaxHighlighter.cpp pglab/stopwatch.cpp pglab/tsqueue.cpp pglab/tuplesresultwidget.cpp - pglab/typeselectionitemmodel.cpp + pglab/TypeSelectionItemModel.cpp pglab/util.cpp pglab/waithandlelist.cpp pglab/win32event.cpp ) + target_include_directories(pglab PUBLIC ./core ) + +target_link_libraries( pglab + core + ${Boost_LIBRARIES} + Qt5::Widgets + ${Pq_LIBRARIES} + ${Botan_LIBRARIES} + pthread + ) diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index eb4387b..29366e4 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -2,6 +2,7 @@ #include "waithandlelist.h" #include "ScopeGuard.h" #include +#include ASyncDBConnection::ASyncDBConnection() { @@ -46,7 +47,7 @@ bool ASyncDBConnection::send(const std::string &command, on_result_callback on_r { std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); m_threadData.m_commandQueue.m_queue.emplace(command, on_result); - m_threadData.m_commandQueue.m_newEvent.set(); + m_threadData.m_commandQueue.m_newEvent.notify_one(); } return true; } @@ -56,7 +57,7 @@ bool ASyncDBConnection::send(const std::string &command, Pgsql::Params params, o { std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); m_threadData.m_commandQueue.m_queue.emplace(command, std::move(params), on_result); - m_threadData.m_commandQueue.m_newEvent.set(); + m_threadData.m_commandQueue.m_newEvent.notify_one(); } return true; } @@ -79,7 +80,6 @@ void ASyncDBConnection::setNoticeCallback(on_notice_callback notice_callback) } ASyncDBConnection::Thread::Thread() - : m_stopEvent(Win32Event::Reset::Manual, Win32Event::Initial::Clear) {} void ASyncDBConnection::Thread::run() @@ -124,14 +124,16 @@ bool ASyncDBConnection::Thread::cancel() bool ASyncDBConnection::Thread::makeConnection() { - using namespace std::chrono_literals; + //using namespace std::literals::chrono_literals; + // start connecting + auto keywords = m_config.getKeywords(); + auto values = m_config.getValues(); +#if true + return m_connection.connect(keywords, values, 0); +#else while (!terminateRequested) { - // start connecting - //bool ok = m_connection.connectStart(m_initString + " client_encoding=utf8"); - auto keywords = m_config.getKeywords(); - auto values = m_config.getValues(); bool ok = m_connection.connectStart(keywords, values); auto start = std::chrono::steady_clock::now(); if (ok && m_connection.status() != CONNECTION_BAD) { @@ -144,7 +146,7 @@ bool ASyncDBConnection::Thread::makeConnection() WSAEventSelect(sock, socket_event.handle(), fd); WaitHandleList whl; auto wait_result_socket_event = whl.add(socket_event); - auto wait_result_stop = whl.add(m_stopEvent); + //auto wait_result_stop = whl.add(m_stopEvent); auto nu = std::chrono::steady_clock::now(); std::chrono::duration diff = -(nu-start); @@ -185,6 +187,7 @@ bool ASyncDBConnection::Thread::makeConnection() } } return false; +#endif } void ASyncDBConnection::Thread::communicate() @@ -217,7 +220,7 @@ void ASyncDBConnection::Thread::communicate() void ASyncDBConnection::Thread::stop() { terminateRequested = true; - m_stopEvent.set(); + //m_stopEvent.set(); } void ASyncDBConnection::Thread::doStateCallback(State state) @@ -231,10 +234,21 @@ void ASyncDBConnection::Thread::doStateCallback(State state) void ASyncDBConnection::Thread::waitForAndSendCommand() { + // lock the data + std::unique_lock lk(m_commandQueue.m_mutex); + if (m_commandQueue.m_queue.empty()) { + // no data wait till there is data + m_commandQueue.m_newEvent.wait(lk); + // can we use the predicate to reimplement the stop function???, []{return ready;}); + + } + doNewCommand(); + +#if false WaitHandleList whl; auto wait_result_new_command = whl.add(m_commandQueue.m_newEvent); //auto wait_result_stop = - whl.add(m_stopEvent); + //whl.add(m_stopEvent); DWORD res = MsgWaitForMultipleObjectsEx( whl.count(), // _In_ DWORD nCount, @@ -247,6 +261,7 @@ void ASyncDBConnection::Thread::waitForAndSendCommand() doNewCommand(); } // if (res == wait_result_stop) return; +#endif } void ASyncDBConnection::Thread::doNewCommand() @@ -278,10 +293,60 @@ void ASyncDBConnection::Thread::doNewCommand() } +bool ASyncDBConnection::Thread::consumeResultInput() +{ + bool finished = false; + if (m_connection.consumeInput()) { + while ( ! finished && ! m_connection.isBusy()) { + auto res(m_connection.getResult()); + { + qint64 ms = m_timer.restart(); + std::lock_guard lg(m_commandQueue.m_mutex); + m_commandQueue.m_queue.front().on_result(res, ms); + if (res == nullptr) { + m_timer.invalidate(); + m_commandQueue.m_queue.pop(); + doStateCallback(State::Connected); + finished = true; + } + } + + } + // else is still waiting for more data + + } + else { + // error during consume + + } + return finished; +} + void ASyncDBConnection::Thread::waitForResult() { - int sock = m_connection.socket(); + + fd_set readfds; + timeval timeout; + bool finished = false; + while (!finished && !terminateRequested) { + FD_ZERO(&readfds); + FD_SET(sock, &readfds); + + timeout.tv_sec = 5; + timeout.tv_usec = 0; + + int select_result = select(1, &readfds, nullptr, nullptr, &timeout); + if (select_result > 0) { + if (FD_ISSET(sock, &readfds)) { + if (consumeResultInput()) { + finished = true; + } + } + } + + } +#if false Win32Event socket_event(Win32Event::Reset::Manual, Win32Event::Initial::Clear); long fd = FD_READ | FD_CLOSE; @@ -292,7 +357,7 @@ void ASyncDBConnection::Thread::waitForResult() WaitHandleList whl; auto wait_result_socket = whl.add(socket_event); - auto wait_result_stop = whl.add(m_stopEvent); + //auto wait_result_stop = whl.add(m_stopEvent); DWORD res = MsgWaitForMultipleObjectsEx( whl.count(), // _In_ DWORD nCount, @@ -306,29 +371,9 @@ void ASyncDBConnection::Thread::waitForResult() WSAEnumNetworkEvents(sock, socket_event.handle(), &net_events); if (net_events.lNetworkEvents & FD_READ) { - if (m_connection.consumeInput()) { - while ( ! finished && ! m_connection.isBusy()) { - auto res(m_connection.getResult()); - { - qint64 ms = m_timer.restart(); - std::lock_guard lg(m_commandQueue.m_mutex); - m_commandQueue.m_queue.front().on_result(res, ms); - if (res == nullptr) { - m_timer.invalidate(); - m_commandQueue.m_queue.pop(); - doStateCallback(State::Connected); - finished = true; - } - } - - } - // else is still waiting for more data - - } - else { - // error during consume - - } + if (consumeResultInput()) { + finished = true; + } } } if (res == wait_result_stop) { @@ -339,6 +384,7 @@ void ASyncDBConnection::Thread::waitForResult() } } // end while // When last result received, remove command from queue +#endif } void ASyncDBConnection::Thread::processNotice(const PGresult *result) diff --git a/pglab/ASyncDBConnection.h b/pglab/ASyncDBConnection.h index 033beb5..cfc5dae 100644 --- a/pglab/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -3,10 +3,10 @@ #include "PgsqlConn.h" #include "Pgsql_Params.h" -#include "win32event.h" #include "ConnectionConfig.h" #include #include +#include #include #include #include @@ -86,9 +86,8 @@ private: struct t_Command { std::mutex m_mutex; t_CommandQueue m_queue; - Win32Event m_newEvent; + std::condition_variable m_newEvent; t_Command() - : m_newEvent(Win32Event::Reset::Auto, Win32Event::Initial::Clear) {} } m_commandQueue; @@ -108,8 +107,8 @@ private: private: - - Win32Event m_stopEvent; + /// \todo Implement new method to stop the thread + //Win32Event m_stopEvent; Pgsql::Connection m_connection; bool terminateRequested = false; ///< is set when the thread should stop bool m_terminated = true; @@ -128,6 +127,11 @@ private: void processNotice(const PGresult *result); + /** Function to call when after sending a command the socket is ready for reading. + * + * It might take several consumes before all data is read. + */ + bool consumeResultInput(); }; Thread m_threadData; diff --git a/pglab/BackupDialog.cpp b/pglab/BackupDialog.cpp index 56a4c66..a5be3e2 100644 --- a/pglab/BackupDialog.cpp +++ b/pglab/BackupDialog.cpp @@ -1,5 +1,5 @@ -#include "backupdialog.h" -#include "ui_backupdialog.h" +#include "BackupDialog.h" +#include "ui_BackupDialog.h" #include "BackupFormatModel.h" @@ -9,8 +9,6 @@ #include #include -#include - BackupDialog::BackupDialog(QWidget *parent) : QDialog(parent), ui(new Ui::BackupDialog) @@ -234,13 +232,14 @@ void BackupDialog::on_btnStart_clicked() auto p = new QProcess(this); ConnectTo(p); p->setProcessEnvironment(env); - +#ifdef _WIN32 p->setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; args->flags &= ~DETACHED_PROCESS; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; }); +#endif p->start(program, arguments); } diff --git a/pglab/BackupRestore.cpp b/pglab/BackupRestore.cpp index 801d582..5cbfe07 100644 --- a/pglab/BackupRestore.cpp +++ b/pglab/BackupRestore.cpp @@ -1,6 +1,6 @@ #include #include -#include "connectionconfig.h" +#include "ConnectionConfig.h" void setupEnvironment(const ConnectionConfig &cc) { diff --git a/pglab/ConnectionConfig.cpp b/pglab/ConnectionConfig.cpp index 7b14dbb..d6fcb21 100644 --- a/pglab/ConnectionConfig.cpp +++ b/pglab/ConnectionConfig.cpp @@ -1,4 +1,4 @@ -#include "connectionconfig.h" +#include "ConnectionConfig.h" #include "util.h" #include #include diff --git a/pglab/ConnectionList.cpp b/pglab/ConnectionList.cpp index 39eb6ed..c373474 100644 --- a/pglab/ConnectionList.cpp +++ b/pglab/ConnectionList.cpp @@ -1,5 +1,5 @@ #include "ConnectionList.h" -#include "scopeguard.h" +#include "ScopeGuard.h" #include "util.h" #include #include diff --git a/pglab/ConnectionListModel.cpp b/pglab/ConnectionListModel.cpp index 597ea13..dfb87c2 100644 --- a/pglab/ConnectionListModel.cpp +++ b/pglab/ConnectionListModel.cpp @@ -1,6 +1,6 @@ #include "ConnectionListModel.h" #include "ConnectionList.h" -#include "scopeguard.h" +#include "ScopeGuard.h" #include "util.h" #include diff --git a/pglab/ConnectionListModel.h b/pglab/ConnectionListModel.h index acbfa31..78ce96a 100644 --- a/pglab/ConnectionListModel.h +++ b/pglab/ConnectionListModel.h @@ -6,8 +6,8 @@ #include -#include "connectionconfig.h" -#include "expected.h" +#include "ConnectionConfig.h" +#include "Expected.h" class ConnectionList; diff --git a/pglab/ConnectionManagerWindow.cpp b/pglab/ConnectionManagerWindow.cpp index 5e431a5..cd5740a 100644 --- a/pglab/ConnectionManagerWindow.cpp +++ b/pglab/ConnectionManagerWindow.cpp @@ -1,12 +1,11 @@ -#include "connectionmanagerwindow.h" -#include "ui_connectionmanagerwindow.h" +#include "ConnectionManagerWindow.h" +#include "ui_ConnectionManagerWindow.h" //#include "mainwindow.h" #include "MasterController.h" #include #include #include - -#include "connectionlistmodel.h" +#include "ConnectionListModel.h" ConnectionManagerWindow::ConnectionManagerWindow(MasterController *master, QWidget *parent) : QMainWindow(parent) diff --git a/pglab/DatabaseInspectorWidget.cpp b/pglab/DatabaseInspectorWidget.cpp index 93d7f38..aa0be11 100644 --- a/pglab/DatabaseInspectorWidget.cpp +++ b/pglab/DatabaseInspectorWidget.cpp @@ -1,5 +1,5 @@ -#include "databaseinspectorwidget.h" -#include "ui_databaseinspectorwidget.h" +#include "DatabaseInspectorWidget.h" +#include "ui_DatabaseInspectorWidget.h" DatabaseInspectorWidget::DatabaseInspectorWidget(QWidget *parent) : QWidget(parent), diff --git a/pglab/DatabaseWindow.cpp b/pglab/DatabaseWindow.cpp index 5494534..db0653e 100644 --- a/pglab/DatabaseWindow.cpp +++ b/pglab/DatabaseWindow.cpp @@ -1,5 +1,5 @@ -#include "databasewindow.h" -#include "ui_databasewindow.h" +#include "DatabaseWindow.h" +#include "ui_DatabaseWindow.h" #include DatabaseWindow::DatabaseWindow(QWidget *parent) : diff --git a/pglab/DatabaseWindow.h b/pglab/DatabaseWindow.h index 6addd3d..d5a87d7 100644 --- a/pglab/DatabaseWindow.h +++ b/pglab/DatabaseWindow.h @@ -1,7 +1,7 @@ #ifndef DATABASEWINDOW_H #define DATABASEWINDOW_H -#include "asyncdbconnection.h" +#include "ASyncDBConnection.h" #include "tsqueue.h" #include diff --git a/pglab/ExplainTreeModelItem.cpp b/pglab/ExplainTreeModelItem.cpp index deacd17..f756b1f 100644 --- a/pglab/ExplainTreeModelItem.cpp +++ b/pglab/ExplainTreeModelItem.cpp @@ -1,4 +1,4 @@ -#include "explaintreemodelitem.h" +#include "ExplainTreeModelItem.h" #include "json/json.h" #include diff --git a/pglab/MainWindow.cpp b/pglab/MainWindow.cpp index 76300f1..f830664 100644 --- a/pglab/MainWindow.cpp +++ b/pglab/MainWindow.cpp @@ -1,17 +1,16 @@ #include "MainWindow.h" -#include "ui_mainwindow.h" +#include "ui_MainWindow.h" #include #include #include #include #include -#include #include #include #include #include -#include +#include "QueryTab.h" #include "util.h" #include "MasterController.h" #include "OpenDatabase.h" diff --git a/pglab/MainWindow.h b/pglab/MainWindow.h index 13edb47..b1fa2cb 100644 --- a/pglab/MainWindow.h +++ b/pglab/MainWindow.h @@ -1,8 +1,8 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include "asyncdbconnection.h" -#include "connectionconfig.h" +#include "ASyncDBConnection.h" +#include "ConnectionConfig.h" #include "tsqueue.h" #include #include "ASyncWindow.h" diff --git a/pglab/OpenDatabase.cpp b/pglab/OpenDatabase.cpp index 2cb0832..56b1991 100644 --- a/pglab/OpenDatabase.cpp +++ b/pglab/OpenDatabase.cpp @@ -1,7 +1,7 @@ #include "OpenDatabase.h" -#include "pgsqldatabasecatalogue.h" +#include "PgsqlDatabaseCatalogue.h" #include "PgsqlConn.h" -#include "typeselectionitemmodel.h" +#include "TypeSelectionItemModel.h" Expected OpenDatabase::createOpenDatabase(const ConnectionConfig &cfg) { diff --git a/pglab/OpenDatabase.h b/pglab/OpenDatabase.h index 19de20f..871ea5a 100644 --- a/pglab/OpenDatabase.h +++ b/pglab/OpenDatabase.h @@ -2,8 +2,8 @@ #define OPENDATABASE_H #include -#include "connectionconfig.h" -#include "expected.h" +#include "ConnectionConfig.h" +#include "Expected.h" class PgsqlDatabaseCatalogue; class TypeSelectionItemModel; diff --git a/pglab/PgAuthId.h b/pglab/PgAuthId.h index bea69e6..c71c4f8 100644 --- a/pglab/PgAuthId.h +++ b/pglab/PgAuthId.h @@ -1,7 +1,7 @@ #ifndef PGAUTHID_H #define PGAUTHID_H -#include +#include #include #include diff --git a/pglab/PgClass.cpp b/pglab/PgClass.cpp index 3d066ad..c4d74ed 100644 --- a/pglab/PgClass.cpp +++ b/pglab/PgClass.cpp @@ -1,3 +1,3 @@ -#include "pgclass.h" +#include "PgClass.h" PgClass::PgClass() = default; diff --git a/pglab/PgClass.h b/pglab/PgClass.h index acdec0d..05f0c64 100644 --- a/pglab/PgClass.h +++ b/pglab/PgClass.h @@ -2,7 +2,7 @@ #define PGCLASS_H #include -#include +#include class PgClass { public: diff --git a/pglab/PgContainer.h b/pglab/PgContainer.h index 835b848..ecde222 100644 --- a/pglab/PgContainer.h +++ b/pglab/PgContainer.h @@ -3,7 +3,7 @@ #include #include -#include +#include class PgsqlDatabaseCatalogue; diff --git a/pglab/PgDatabase.h b/pglab/PgDatabase.h index 724e2b9..679c0dd 100644 --- a/pglab/PgDatabase.h +++ b/pglab/PgDatabase.h @@ -2,7 +2,7 @@ #define PGDATABASE_H #include -#include +#include class PgDatabase { public: diff --git a/pglab/PgNamespace.cpp b/pglab/PgNamespace.cpp index a1d6590..c395bf5 100644 --- a/pglab/PgNamespace.cpp +++ b/pglab/PgNamespace.cpp @@ -1,4 +1,4 @@ -#include "pgnamespace.h" +#include "PgNamespace.h" PgNamespace::PgNamespace() = default; diff --git a/pglab/PgNamespace.h b/pglab/PgNamespace.h index 2c33805..f406c20 100644 --- a/pglab/PgNamespace.h +++ b/pglab/PgNamespace.h @@ -2,7 +2,7 @@ #define PGNAMESPACE_H #include -#include +#include class PgNamespace { diff --git a/pglab/PgType.cpp b/pglab/PgType.cpp index 71939b7..7b19a7a 100644 --- a/pglab/PgType.cpp +++ b/pglab/PgType.cpp @@ -1,4 +1,4 @@ -#include "pgtype.h" +#include "PgType.h" #include "PgsqlConn.h" PgType::PgType() = default; diff --git a/pglab/PgType.h b/pglab/PgType.h index 1246700..b39b42d 100644 --- a/pglab/PgType.h +++ b/pglab/PgType.h @@ -2,7 +2,7 @@ #define PGTYPE_H #include -#include +#include class PgType { public: diff --git a/pglab/PgTypeContainer.cpp b/pglab/PgTypeContainer.cpp index f1538c6..652ef3d 100644 --- a/pglab/PgTypeContainer.cpp +++ b/pglab/PgTypeContainer.cpp @@ -1,4 +1,4 @@ -#include "pgtypecontainer.h" +#include "PgTypeContainer.h" #include "PgsqlConn.h" #include diff --git a/pglab/PgTypeContainer.h b/pglab/PgTypeContainer.h index 7c5656d..d7f059c 100644 --- a/pglab/PgTypeContainer.h +++ b/pglab/PgTypeContainer.h @@ -2,7 +2,7 @@ #define PGTYPECONTAINER_H #include -#include "pgtype.h" +#include "PgType.h" #include "PgContainer.h" namespace Pgsql { diff --git a/pglab/PgsqlDatabaseCatalogue.h b/pglab/PgsqlDatabaseCatalogue.h index 0fa8162..0357237 100644 --- a/pglab/PgsqlDatabaseCatalogue.h +++ b/pglab/PgsqlDatabaseCatalogue.h @@ -1,7 +1,7 @@ #ifndef PGSQLDATABASECATALOGUE_H #define PGSQLDATABASECATALOGUE_H -#include +#include #include #include diff --git a/pglab/Pgsql_Value.cpp b/pglab/Pgsql_Value.cpp index 731b2e8..e4095cb 100644 --- a/pglab/Pgsql_Value.cpp +++ b/pglab/Pgsql_Value.cpp @@ -44,7 +44,7 @@ Value::operator Oid() const return operator int(); } -Value::operator __int64() const +Value::operator long long() const { return std::strtoull(m_val, nullptr, 10); } diff --git a/pglab/QueryExplainModel.cpp b/pglab/QueryExplainModel.cpp index 5e0a27d..67ccfca 100644 --- a/pglab/QueryExplainModel.cpp +++ b/pglab/QueryExplainModel.cpp @@ -1,6 +1,7 @@ -#include "queryexplainmodel.h" +#include "QueryExplainModel.h" #include #include +#include const int c_ColumnNode = 0; const int c_ColumnExclusive = 1; @@ -79,7 +80,7 @@ if (role == Qt::DisplayRole) { } } if (col == c_ColumnEstErr) { - float e = fabs(item->estimateError()); + float e = std::fabs(item->estimateError()); if (e > 1000.0f) { result = QColor(255, 192, 192); } diff --git a/pglab/QueryExplainModel.h b/pglab/QueryExplainModel.h index 721c608..0aa318a 100644 --- a/pglab/QueryExplainModel.h +++ b/pglab/QueryExplainModel.h @@ -2,7 +2,7 @@ #include #include -#include "explaintreemodelitem.h" +#include "ExplainTreeModelItem.h" /** \brief Model class for displaying the explain of a query in a tree like format. */ diff --git a/pglab/QueryResultModel.cpp b/pglab/QueryResultModel.cpp index 623d2be..9371ffd 100644 --- a/pglab/QueryResultModel.cpp +++ b/pglab/QueryResultModel.cpp @@ -1,4 +1,4 @@ -#include "queryresultmodel.h" +#include "QueryResultModel.h" #include "Pgsql_declare.h" #include #include diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index 31d41c3..d2c0c15 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -1,5 +1,5 @@ -#include "querytab.h" -#include "ui_querytab.h" +#include "QueryTab.h" +#include "ui_QueryTab.h" #include "SqlSyntaxHighlighter.h" @@ -12,12 +12,12 @@ #include #include #include -#include "explaintreemodelitem.h" +#include "ExplainTreeModelItem.h" #include "json/json.h" #include "MainWindow.h" #include "OpenDatabase.h" -#include "pgtypecontainer.h" -#include "pgsqldatabasecatalogue.h" +#include "PgTypeContainer.h" +#include "PgsqlDatabaseCatalogue.h" #include "util.h" diff --git a/pglab/QueryTab.h b/pglab/QueryTab.h index e0ed32b..8214b62 100644 --- a/pglab/QueryTab.h +++ b/pglab/QueryTab.h @@ -1,11 +1,11 @@ #ifndef QUERYTAB_H #define QUERYTAB_H -#include "asyncdbconnection.h" +#include "ASyncDBConnection.h" #include "ParamListModel.h" #include "ParamTypeDelegate.h" -#include "queryresultmodel.h" -#include "queryexplainmodel.h" +#include "QueryResultModel.h" +#include "QueryExplainModel.h" #include "stopwatch.h" #include "tuplesresultwidget.h" diff --git a/pglab/sqlhighlighter.cpp b/pglab/SqlHighlighter.cpp similarity index 82% rename from pglab/sqlhighlighter.cpp rename to pglab/SqlHighlighter.cpp index d503f16..36885b4 100644 --- a/pglab/sqlhighlighter.cpp +++ b/pglab/SqlHighlighter.cpp @@ -1,14 +1,14 @@ #include "SqlHighlighter.h" -static const wchar_t *keywords[] = { - L"as", L"alter", L"all", L"and", L"any", L"by", L"char", L"column", L"create", L"database", L"date", L"from", L"full", L"group", L"having", - L"in", L"inner", L"int", L"join", L"left", L"not", L"numeric", L"or", L"order", L"outer", L"right", L"select", L"smallint", L"table", L"time", - L"timestamp", L"timestamptz", L"varchar", L"where" -}; - -static const wchar_t *operators[] = { - L"+", L"-", L"*", L"/", L"<", L">", L"<=", L">=", L"<>", L"!=", L"~" -}; +// static const wchar_t *keywords[] = { +// L"as", L"alter", L"all", L"and", L"any", L"by", L"char", L"column", L"create", L"database", L"date", L"from", L"full", L"group", L"having", +// L"in", L"inner", L"int", L"join", L"left", L"not", L"numeric", L"or", L"order", L"outer", L"right", L"select", L"smallint", L"table", L"time", +// L"timestamp", L"timestamptz", L"varchar", L"where" +// }; +// +// static const wchar_t *operators[] = { +// L"+", L"-", L"*", L"/", L"<", L">", L"<=", L">=", L"<>", L"!=", L"~" +// }; /* @@ -17,7 +17,7 @@ static const wchar_t *operators[] = { There are a few restrictions on your choice of name: - -- and /* cannot appear anywhere in an operator name, since they will be taken as the start of a comment. + -- and C-comment start cannot appear anywhere in an operator name, since they will be taken as the start of a comment. A multicharacter operator name cannot end in + or -, unless the name also contains at least one of these characters: diff --git a/pglab/sqlhighlighter.h b/pglab/SqlHighlighter.h similarity index 100% rename from pglab/sqlhighlighter.h rename to pglab/SqlHighlighter.h diff --git a/pglab/SqlSyntaxHighlighter.cpp b/pglab/SqlSyntaxHighlighter.cpp index 92961ee..8367a80 100644 --- a/pglab/SqlSyntaxHighlighter.cpp +++ b/pglab/SqlSyntaxHighlighter.cpp @@ -1,6 +1,6 @@ #include "SqlSyntaxHighlighter.h" -#include "pgtypecontainer.h" +#include "PgTypeContainer.h" #include "SqlLexer.h" namespace { diff --git a/pglab/typeselectionitemmodel.cpp b/pglab/TypeSelectionItemModel.cpp similarity index 94% rename from pglab/typeselectionitemmodel.cpp rename to pglab/TypeSelectionItemModel.cpp index ed6e930..859058f 100644 --- a/pglab/typeselectionitemmodel.cpp +++ b/pglab/TypeSelectionItemModel.cpp @@ -1,4 +1,4 @@ -#include "typeselectionitemmodel.h" +#include "TypeSelectionItemModel.h" #include "PgTypeContainer.h" #include @@ -61,8 +61,8 @@ void TypeSelectionItemModel::setTypeList(const PgTypeContainer* types) beginResetModel(); m_types.clear(); for (const auto &e : *types) { - if (e.typcategory != 'A' - && e.typtype != 'c') { + if (e.typcategory != "A" + && e.typtype != "c") { m_types.push_back(e.typname); } } diff --git a/pglab/typeselectionitemmodel.h b/pglab/TypeSelectionItemModel.h similarity index 100% rename from pglab/typeselectionitemmodel.h rename to pglab/TypeSelectionItemModel.h diff --git a/pglab/main.cpp b/pglab/main.cpp index e7d0552..c4f3139 100644 --- a/pglab/main.cpp +++ b/pglab/main.cpp @@ -1,12 +1,15 @@ #include "MasterController.h" #include -#include +#ifdef _WIN32 +# include +#endif #include int main(int argc, char *argv[]) { /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ +#ifdef _WIN32 WORD wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); @@ -16,7 +19,7 @@ int main(int argc, char *argv[]) printf("WSAStartup failed with error: %d\n", err); return 1; } - +#endif QApplication a(argc, argv); QCoreApplication::setOrganizationName("pglab"); @@ -26,8 +29,9 @@ int main(int argc, char *argv[]) auto master_controller = std::make_unique(); master_controller->init(); int result = a.exec(); +#ifdef _WIN32 WSACleanup(); - +#endif return result; } diff --git a/pglab/tsqueue.cpp b/pglab/tsqueue.cpp index 9200692..b49b6a0 100644 --- a/pglab/tsqueue.cpp +++ b/pglab/tsqueue.cpp @@ -1,14 +1,14 @@ #include "tsqueue.h" TSQueue::TSQueue() - : newData(Win32Event::Reset::Manual, Win32Event::Initial::Clear) +// : newData(Win32Event::Reset::Manual, Win32Event::Initial::Clear) {} void TSQueue::add(t_Callable callable) { std::lock_guard g(m); futureQueue.push_back(std::move(callable)); - newData.set(); +// newData.set(); } bool TSQueue::empty() @@ -23,12 +23,12 @@ TSQueue::t_Callable TSQueue::pop() auto f = std::move(futureQueue.front()); futureQueue.pop_front(); if (futureQueue.empty()) { - newData.reset(); +// newData.reset(); } return f; } -HANDLE TSQueue::getNewDataEventHandle() -{ - return newData.handle(); -} +// HANDLE TSQueue::getNewDataEventHandle() +// { +// return newData.handle(); +// } diff --git a/pglab/tsqueue.h b/pglab/tsqueue.h index acb7934..8b93d34 100644 --- a/pglab/tsqueue.h +++ b/pglab/tsqueue.h @@ -1,7 +1,7 @@ #ifndef TSQUEUE_H #define TSQUEUE_H -#include "Win32Event.h" +//#include "Win32Event.h" #include #include #include @@ -15,11 +15,11 @@ public: bool empty(); t_Callable pop(); - HANDLE getNewDataEventHandle(); + //HANDLE getNewDataEventHandle(); private: using t_CallableQueue = std::deque; - Win32Event newData; + //Win32Event newData; std::mutex m; t_CallableQueue futureQueue; }; diff --git a/pglab/tuplesresultwidget.h b/pglab/tuplesresultwidget.h index e1414af..7511404 100644 --- a/pglab/tuplesresultwidget.h +++ b/pglab/tuplesresultwidget.h @@ -1,7 +1,7 @@ #ifndef TUPLESRESULTWIDGET_H #define TUPLESRESULTWIDGET_H -#include "queryresultmodel.h" +#include "QueryResultModel.h" #include namespace Ui { diff --git a/pglab/util.cpp b/pglab/util.cpp index 749c7cc..ae4bb71 100644 --- a/pglab/util.cpp +++ b/pglab/util.cpp @@ -1,5 +1,5 @@ #include "util.h" -#include "csvwriter.h" +#include "CsvWriter.h" #include #include #include @@ -108,8 +108,7 @@ void copySelectionToClipboard(const QTableView *view) QString ConvertToMultiLineCString(const QString &in) { - // We need to atleast escape " and \ - // also any multi byte utf8 char + // We need to atleast escape " and \ and also any multi byte utf8 char QString out; out.append('"'); diff --git a/pglab/waithandlelist.cpp b/pglab/waithandlelist.cpp index e05bba4..e8f507a 100644 --- a/pglab/waithandlelist.cpp +++ b/pglab/waithandlelist.cpp @@ -1,6 +1,7 @@ #include "waithandlelist.h" #include "win32event.h" +#ifdef _WIN32 WaitHandleList::WaitHandleList() = default; WaitHandleList::~WaitHandleList() = default; @@ -29,3 +30,5 @@ WaitHandleList::operator const HANDLE*() const { return m_waitHandles.data(); } + +#endif From c3d604e7b4533ff176a771f1ff22891a9a384cff Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Wed, 23 Aug 2017 13:42:01 +0200 Subject: [PATCH 03/34] Resources (icons on buttons) are compiled and linked --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 871c289..72a6af4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) pkg_check_modules(Botan REQUIRED botan-2) include_directories( ${Botan_INCLUDE_DIRS} ) @@ -111,6 +112,7 @@ add_executable(pglab pglab/util.cpp pglab/waithandlelist.cpp pglab/win32event.cpp + pglab/resources.qrc ) target_include_directories(pglab PUBLIC From 4167c483f5bbfa2cc06a7952d15c0d902beb5c59 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Wed, 23 Aug 2017 17:41:10 +0200 Subject: [PATCH 04/34] Most seems to work. Multi threading is not optimal however some points use a timeout with select or wait_for to poll a condition at the same time. --- pglab/ASyncDBConnection.cpp | 51 +++++++++++++++--------------- pglab/ConnectionManagerWindow.ui | 27 ++++++++-------- pglab/MainWindow.cpp | 3 ++ pglab/MainWindow.ui | 50 ++++++++++++++--------------- pglab/icons/about.png | Bin 0 -> 436 bytes pglab/icons/add_connection.png | Bin 0 -> 416 bytes pglab/icons/backup_database.png | Bin 0 -> 471 bytes pglab/icons/backups.png | Bin 2377 -> 0 bytes pglab/icons/delete_connection.png | Bin 0 -> 473 bytes pglab/icons/information.png | Bin 2112 -> 0 bytes pglab/icons/manage_server.png | Bin 0 -> 618 bytes pglab/icons/new_query_tab.png | Bin 0 -> 419 bytes pglab/icons/open_query_window.png | Bin 0 -> 525 bytes pglab/icons/server_add.png | Bin 1480 -> 0 bytes pglab/resources.qrc | 10 ++++-- pglab/tsqueue.h | 2 +- 16 files changed, 76 insertions(+), 67 deletions(-) create mode 100644 pglab/icons/about.png create mode 100644 pglab/icons/add_connection.png create mode 100644 pglab/icons/backup_database.png delete mode 100644 pglab/icons/backups.png create mode 100644 pglab/icons/delete_connection.png delete mode 100644 pglab/icons/information.png create mode 100644 pglab/icons/manage_server.png create mode 100644 pglab/icons/new_query_tab.png create mode 100644 pglab/icons/open_query_window.png delete mode 100644 pglab/icons/server_add.png diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index 29366e4..7166502 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -130,7 +130,11 @@ bool ASyncDBConnection::Thread::makeConnection() auto keywords = m_config.getKeywords(); auto values = m_config.getValues(); #if true - return m_connection.connect(keywords, values, 0); + bool result = m_connection.connect(keywords, values, 0); + if (result) { + doStateCallback(State::Connected); + } + return result; #else while (!terminateRequested) { @@ -234,11 +238,12 @@ void ASyncDBConnection::Thread::doStateCallback(State state) void ASyncDBConnection::Thread::waitForAndSendCommand() { + using namespace std::chrono_literals; // lock the data std::unique_lock lk(m_commandQueue.m_mutex); if (m_commandQueue.m_queue.empty()) { // no data wait till there is data - m_commandQueue.m_newEvent.wait(lk); + m_commandQueue.m_newEvent.wait_for(lk, 1000ms); // can we use the predicate to reimplement the stop function???, []{return ready;}); } @@ -266,30 +271,26 @@ void ASyncDBConnection::Thread::waitForAndSendCommand() void ASyncDBConnection::Thread::doNewCommand() { - // todo: send command // get command from top of queue (but leave it in the queue, we need the callback) - { - std::lock_guard lg(m_commandQueue.m_mutex); - if (! m_commandQueue.m_queue.empty()) { - const Command &command = m_commandQueue.m_queue.front(); - if (!command.command.empty()) { - bool query_send = false; - if (command.params.empty()) - query_send = m_connection.sendQuery(command.command.c_str()); - else - query_send = m_connection.sendQueryParams(command.command.c_str(), command.params); + if (! m_commandQueue.m_queue.empty()) { + const Command &command = m_commandQueue.m_queue.front(); + if (!command.command.empty()) { + bool query_send = false; + if (command.params.empty()) + query_send = m_connection.sendQuery(command.command.c_str()); + else + query_send = m_connection.sendQueryParams(command.command.c_str(), command.params); - if (query_send) { - m_timer.start(); - doStateCallback(State::QuerySend); - } - else { - std::string error = m_connection.getErrorMessage(); - // todo: need to report the error - } - } - } - } + if (query_send) { + m_timer.start(); + doStateCallback(State::QuerySend); + } + else { + std::string error = m_connection.getErrorMessage(); + // todo: need to report the error + } + } + } } @@ -336,7 +337,7 @@ void ASyncDBConnection::Thread::waitForResult() timeout.tv_sec = 5; timeout.tv_usec = 0; - int select_result = select(1, &readfds, nullptr, nullptr, &timeout); + int select_result = select(sock + 1, &readfds, nullptr, nullptr, &timeout); if (select_result > 0) { if (FD_ISSET(sock, &readfds)) { if (consumeResultInput()) { diff --git a/pglab/ConnectionManagerWindow.ui b/pglab/ConnectionManagerWindow.ui index c98eafd..225e2af 100644 --- a/pglab/ConnectionManagerWindow.ui +++ b/pglab/ConnectionManagerWindow.ui @@ -201,12 +201,12 @@ 0 0 800 - 23 + 24 - File + Fi&le @@ -240,7 +240,7 @@ - :/icons/server_add.png:/icons/server_add.png + :/icons/add_connection.png:/icons/add_connection.png Add Connection @@ -248,9 +248,9 @@ - - :/icons/server_delete.png - + + :/icons/delete_connection.png + :/icons/delete_connection.png:/icons/delete_connection.png Delete connection @@ -261,8 +261,9 @@ - - :/icons/server_go.png:/icons/server_go.png + + :/icons/open_query_window.png + Connect @@ -270,14 +271,14 @@ - Quit application + &Quit application - - :/icons/backups.png - + + :/icons/backup_database.png + :/icons/backups.png:/icons/backup_database.png Backup database @@ -286,7 +287,7 @@ - :/icons/server_edit.png + :/icons/manage_server.png diff --git a/pglab/MainWindow.cpp b/pglab/MainWindow.cpp index f830664..aa4f038 100644 --- a/pglab/MainWindow.cpp +++ b/pglab/MainWindow.cpp @@ -131,6 +131,9 @@ void MainWindow::on_actionAbout_triggered() "\n" "Icons by fatcow http://www.fatcow.com/free-icons provided under Creative Commons " "attribution 3.0 license\n" + "\n" + "More icons by https://icons8.com/ under Creative Commons Attribution-NoDerivs 3.0 Unported " + "license." )); } diff --git a/pglab/MainWindow.ui b/pglab/MainWindow.ui index 7a19461..d3e2cf3 100644 --- a/pglab/MainWindow.ui +++ b/pglab/MainWindow.ui @@ -45,12 +45,12 @@ 0 0 993 - 22 + 24 - File + Fi&le @@ -69,7 +69,7 @@ - Query + &Query @@ -79,7 +79,7 @@ - Window + Wi&ndow @@ -126,7 +126,7 @@ :/icons/folder.png:/icons/folder.png - Load SQL + &Load SQL Ctrl+O @@ -138,7 +138,7 @@ :/icons/script_save.png:/icons/script_save.png - Save SQL + &Save SQL Ctrl+S @@ -150,7 +150,7 @@ :/icons/table_save.png:/icons/table_save.png - Export data + &Export data @@ -160,7 +160,7 @@ - Close + &Close Ctrl+F4 @@ -168,12 +168,12 @@ - - :/icons/information.png - + + :/icons/about.png + :/icons/information.png:/icons/about.png - About + &About @@ -183,7 +183,7 @@ - Execute queries + &Execute queries Execute the (selected) queries @@ -199,7 +199,7 @@ - Cancel + &Cancel Alt+Pause @@ -211,7 +211,7 @@ :/icons/lightbulb.png:/icons/lightbulb.png - Explain Analyze + Ex&plain Analyze Shift+F7 @@ -219,22 +219,22 @@ - Save SQL as + Sa&ve SQL as - Save copy of SQL as + Save copy &of SQL as - - :/icons/page_white_add.png - + + :/icons/new_query_tab.png + :/icons/page_white_add.png:/icons/new_query_tab.png - New SQL + &New SQL Ctrl+N @@ -247,7 +247,7 @@ - Explain + E&xplain Explain the (selected) query @@ -258,7 +258,7 @@ - Show connection manager + &Show connection manager @@ -268,7 +268,7 @@ - Copy + &Copy Ctrl+C @@ -281,7 +281,7 @@ - Copy as C-string + Copy as C-&string Ctrl+Alt+C diff --git a/pglab/icons/about.png b/pglab/icons/about.png new file mode 100644 index 0000000000000000000000000000000000000000..1a02d2bd7d2cc56b26440197f30eead86dc1c3c7 GIT binary patch literal 436 zcmV;l0ZaagP)!cw011o@XeEcBH9W;-1TuSH@vrijy}B$&WE3jg262QyQlpQPcV@z+9AL@&7QgnyV{s~H zuA2=PVwXi@mqlZT3k}4B?uf|jTsK-3jlIOGXfy!Zd#8^z>GTD-Ye=^E1wLk+XhsgVwzT;9+;+;It#xKKwE+k0I+O=O&AE! zVM1ja1_5-oq4FXM1Gw`tYOZ2$05ZEy@pBfOA0yxObX0rsbKEvx3m~Zxu{rb)U=Ggn z;g61Fw-9|~!W_K+3g@xh+Y?~Py~pw!5H@2?i$-L2y?jhsAXLU6nS&+2emlUj0ZR^& e`AfcLe>#q-EW5q9It73L0000`cyVCV0Yk|F1DpsM z7$Dh@nwTWZVGbBA2S#!(7psXC2vt?aG z=#rT2&I{cCBV(rpZttBIy45?(cMu@T0p#TO#`QheD@6qOWhwh&v#pZ9_#=V?MxVFRpw{_0000< KMNUMnLSTZ@nY?fR;1+J_CV`C4M6H@ z53~q?z9ApbHxj^K0<5?Q6~%2snJZHAFF-N}{&N?|12mc@G@9mW0M)t$=@Nx%-TM7G zkk@Tc2?K-~cgvV0~96x9H`yfds`RIgG!hSm|k5B9ibvSK?O*C3lOK@ZyxR4 z&C6hb4`HvN2-!z)T(jYzGJa7B9Sg8l2tZyDZU{w)iW7tgd-HdKXQcr;h6(!>2Reos z+J*@8jBpgXG(fd(fl3&pOVmvmGKj=okPc7@gR{HgGJvrJ5WNURz|plG0PsIXUNK_Y zTUdy3X23dexJnqT5r>`M+J`~^1BmdP-wCw55D+I2X4*`zW1g9LPIwMsI`ZBrPLNzc z0a9Xtc@V-{V&dt2O=|Kvgdrvin1nx*d5I8Vw?dVR09th(n|*OZEgvBp{NoSb`9uL=nt3gcOpA$shqmW2sV5Tu_#x zhzdneq@q-%pv7WY6tHYs*{L94WeZXfu-st9-XGUH&olEa&pGEk@A6~feSJKPk*kmh z1j5+Mlfl-m!0c7ggpd@=pT%HRQn{9mKsdRmz^o!)07bxbwASfADM;m?WM#^aWzrT5r{c?T1T20wr8yvr_5Yz#=_j-jW`qCw z{hz{0PLv$Pu|Xvip%7{t7qV_Pl$_?K0QoSa;6PCLTorvoAsAAILUO>(pMoU-0TP)A zid25Uvsg4QnG)v9grFCLj@Bw*B@z+M-Q9ug=uTo%9Nnn|0+Z;<&{oQUOtL319SKwd zWsb{$gb`9u2G4Ot|8m_w%bgtssazYG0V*W>K#{uwk^&!6rb#~U#qG0tAGxB>dtrQ* zi_@CH%{KPG8a;QVou1k4r?J%@J`Fx7(@wiWJJ!}NS5G1kdiT5-t{hcMX+Yq%-P@N3 z_YuWB>~Y;1gmuww8}fSO%3a80POD&5mP8;}CM9oGX-w0aOdIScIWy|f2LWg9Pw>3I z&oO=dgG=Uj}Srr&Cyv^z`1)(9G25)X+cL}tVzTg ztMnQ=P*bcz3N&U3%%EzJA@F9+f8|8b@D1)#5r#(0w96G@#aX<*RRCXYKTCx&WywELKcK#NI?5E6+hzr$4vF zuHD7uW{15l?#7{6&%iz6;hKEC`8&%kM8GkUqv4uUN3;d0*s;Xd+3{U>!N$HNy-7Yl zyhQu%39!9%A?-XmcI*cdm7;&NK~;KQP)M{UadiGN%Cx-6y;jg+IdHfD4%rUt>T-h( zt5Ck?24@ee04%~UBn3oHjnYqhR$1gc%5LCTJEs)pov9X+#tN^HMt1}RF!K(37HfKn z=2<%2uwQlYSHWmqQWCyT6R&EF;<;oTnE9q>*;xN+hkl+%iOS^U0rSMbShuqR{Hdat z8D~rDsPSQ+?GcYqez7th;_;WUVs)K`$C`%UlUi3hEEsr__g!0e-T-Q6A8D=c+Hho-o=Po!C^S`L@5%Z_$xoAOR_3t0C}m zu(f=;bJQTyxV&m_xzM2}MBF#<_j{^W@=#-Fq}#puD%lXuCm!3rWWNLp@$fqw*19A^ z>Xh1$+J*-9F7EE-i|U;ac&F*OGf#}Wg5!3dV_cG}gL_j9vw%%R`yn%Rf}lW@wr!Ma zRGJWe9FbWcteJ{w8~47=-TV9+{ry+EV==TNv98_TAgCAl*v9e;&&a8|pbdJtW@PdS z16ViK_^QUS3w3eF!xvj>;Fjuh9ywQD+|tQkF_;?Lx0{xN89yYRz|s#)+*#aQvWSO= zb;}B^<*Q~b{{jbV!Z$byw7L%F|(5H98 zx9n~>4-H5k@EPj(>nW*~kDmWhq#QwY^zGVU`)cN0l5zt8hPuBChRjkJmaH6>-TE*{)_dpO#rczU3w zhHPx2xUNjJ)jN3NxyI@-J1oq$Gi}pATR@*oWnJc2-}1DgIPh|MMv0;ZldCh7wcZT5 z?1rkea%_`X*Nb=i@MeOilkb9Yk)8AOPN)Y20OGBv%? z@%!}A6r=WQ9zk#G2O7mzGbRfSUCc-9#>dBde~KCcH4~%41O~b_X(rJLv115zJERP` zXZeG+K=~A#xA5tD-KFthK|NZh(?|DwWvynVzEyzrVx#a$3a39aL`aet%@Lm7_ diff --git a/pglab/icons/delete_connection.png b/pglab/icons/delete_connection.png new file mode 100644 index 0000000000000000000000000000000000000000..556398415d250dd7238581fbf1ff5d93d9e90591 GIT binary patch literal 473 zcmV;~0Ve*5P)YU6vp!ieFPt&ORjFl8=b@sPC}P1cJ1IIE~cZC_yiWKI0*#>krpgeT(uU5{zDz? zA3A80YZN8<9BR{~(vrk0Ma+S-WXSis=ljkPgrI^NQKdphy1DGk@@h}w#X?&tUbMlr z3vI;%Kr7E5pp_2*{u021LnsKnHRRcz#QOlj9r({%5CHHAVJTZjC7nYhox{WS-mYr^ zLHOAnxZ62cd0t*RWio-iH7Y*6P_hXr9C8KVXWtte$%HyTqYaBYTf7 literal 0 HcmV?d00001 diff --git a/pglab/icons/information.png b/pglab/icons/information.png deleted file mode 100644 index 93c67f2bf0e6e07da700bc508b7b9f55e5c6f89a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2112 zcmV-G2*3Ak7RCwB)S8Z@q`L{>?WIR zLb5R*d>IqI3RYpTwqr-Jno@97P<|*<+Zp?#?XR{o^=I23b~;o0quLH-S_iP884C=> zsg+KP;(&-i0+K}XLEe`@}mh^^+d! zP5{W&&m8)_th&Dc%;W2^c|$Y2E}+~Ccs=ATYqcC9`_K&_F>4~4$RI{?{>m3PdAf&z z{Bh#V9Y3JgjsFLL8r=ET(5jW;`WK$O9}P7Msw#jppT%+J@;EN{PhujTw!@B`d!b4X z+MB9yZ)+{qEU&`w4Gld*as1;{4@M%f(dfY^o9VUe?Ep|Kb{rmj`my!lEf1_fLkPGQ zN#VC|UqF01167tF$%5`%%pbPwXjt}D=!S_3pBsBR+EHKS!^OTBKJFU9*-!f;lW#uV zQVc@A)$_yGpL%S4JsWSS2ll_$kA26l*jBtQ1*#%LkqCs8Pd))z680K{b19My;&k^Y zvbu?fHrz#5B*By<|8(u6-%E8J{vFvdO97CpckF+?y|wY{J3H24Syo8{Il@4P#-}lrOylAEnxM^D7@wRiw_3gxPIY%4 z&nIRcfT;ZD%dKj#`AjnPkIKKJ-$}>dvROtfM=3 zV`xmnzs`@4=ZYOtR+<;az<2%J=J0&z_&2ZdUg5h8$m5dn@zrs}rqgI^38H;v7;^2} zPPRD@pzNNGkgR&zHh!fEHI(gq=RWe>MR%SLZC+Gaw*MDDg?okKCcf~JBS%m7V|lm& z4dF^is;kXMHuC^vPusRV8`n0H$H2vbB$0}4d#)6CGcOccFL`zF%;>yv{>^K=Czm+G zkx0+!7#K^SHt0oNZ2)Dfw(nuv3jJ|eYWc2~#wz%IGEQBZBGe9gQKCpCN*xdFzxvN% z{QBMN_L`dvFaSjsCF@#-vwkfSM{8pUJ|8ie%fE}3e!~DfmgH({Y6wy?0Ry9PqFKfE zrugBs)hX+Biz^|Ql$^nw8|*!UUXXJI#$qWvxYmm@;t3(U+t@Y(P?%0t3I=L+zXsz@BMDpts_JF^8vQoIt;CEFfxT`Jd36!ejAW1NehZ1%O!|N zUi6GCB-B)TF--j-mC8^#X?<*)0q8VB9s6Q*3Xy0E%jyG8SxI8SgjzHLCB$yugn3D@ z9KFLa%%!u?%XHMlU4rwKWYkcZs5_kenfa5=knNWX_&c6naTG z;cul`^4w>mNF+3fOsYRaHrckEBRJWbOI(Sm_w4cqe7L)*(ncPinJe(xnS!`d4t=-v z768wFwFXBn#i&BQY{`6;9Lf6XatH$W&cA!1C1#O4`}%X)*uXV9rYX7eDed$3yS(k& zj-0*V+vX-Fd~{PIbg~win0Cf5;UIOBH@o-u*+Zz6<1=Rq_xy0nLOSb#G zM|Ff75w9sZ??o<8YAVXfcsbrU(S;imNir}ydE>1Yc9Sh`rRn04jM>3Vb-#TgRrm1r ztSOa^C+4uGC4~A=ITAA(QMKhHXO5_pn-WvZM~Y{FrrJu-Cj;I%-c81*q0c0vV+VF_ zB^$#e$^2X>7d5*KPpzrTo$t&YGnDdTIX{1oWy5+TY7IR{mmT41<^EJfX5OyR2 z)MjhR>rlW;2{(q$lRcP8%)r!UVq*t)eus1qlEk?D79GoZ%qM9MZGH7+CD`0iPpvvs z6|hOFg?OT&#z)~+>^rt{9a78c7>p$8TOf+7Lov+K2&ShqFyceUCyxH`7o=~9Bw9R{ zFZf|X5+tefv^=odzv-o4N~*slP~nA}CuADeI5(KnIZ^p)OloEsqFIypT&E$_%1#d^ zKYH!w+Te%Xq-Ts|>UKX&3P<)bl4_C~B@kW`xc|kiO7-232$yf^%}Ru=$;!+OWTU0000! zx(C+%CoC7s^|u@Vziz_kD-FOFWqEh<(e{Y}5IWsIke*t!U#{%-?9^IPvM|5k1;A!; z3zJe8LI`1#N|@xkj|Je_^Zdi7!kD^TNG5ohW*^z;;{hRwuRE8DC-5VsCwMT2nMVB)SPga9<^O)yK3q5pOo zWJQBmBI~O?n0fY2Rx}6=jymn9(h(lu2Y9vi0fuw45KU%4Ry2s{cYO6RGV@7RH0T>j zxg8i0X2P}AUC<|{*=$4CZaH1Z!Q9*nn6T%W8844zJtm|i5Q1m_%jJzrUK2)>891-T zzInGmRy2r=j33&9BLH{ zu}Z^G6b9fvLLb3L2?@RFT3^6SO4mSeY0;^m8QR6k;YLNAN`fF{Y9bT@Ati}m=h~%3 z2rd=cNIec}+B7B5-WvtY4`&I1^X25+TPWmNlcqg2TlNgLEc|PL&hQP+dK3`b0(#GL z@Pj!yf&}pN`c94@1rQ@>0EiH@0LzG`9kwzDC=VfAKPKzkok7!{nwbOADhK3%9PmE@ zvK2thbf9KBaM-zbe+V^aS)o!ABypWrU*cQ;} z4inA2u@BzJhjw3Gg&5QUf_jqp+V6N{Klw{=NuUOhtzhlA(*PXiHEMvm;l#$C7Eza? zcmF1!-B&-CZwWF9C(*P0+v?X2@B^w#SiY=mxC2O`3aH-UjQ|WT?@$HERsfZogIE($ zmq65|XzYt4h>q7bCk=y{B8!okb`xgSd^s#G2^{9NMN@vjVWg~%{R6K>Ae!dRc)tJu N002ovPDHLkV1mjwwQ2wW literal 0 HcmV?d00001 diff --git a/pglab/icons/open_query_window.png b/pglab/icons/open_query_window.png new file mode 100644 index 0000000000000000000000000000000000000000..46cd65a5489c6a5da93eef268491acb85c0256cd GIT binary patch literal 525 zcmV+o0`mQdP)fUv*F1x%QMH+Owc@Sig3dxC#@ z*L)hj9mN7D^hW%tmt{NZ1s}q746O^+Sh%rg>2H6@w*C<+bCckNS z3SFaUoVyZG*XU*dyOd%3lB1lp(7bq*?mjCLv@f}wuM})`009#q#ss=XWe8RQs(FO~ zx<+AjLIg}m1A7fYtIkj<*r=6ysOD|BWVV!q&RP=IN4#zgA!+KtNai#N7tMBIr$yVLZIDC{qCJ`=Y-n?LwW40r5$-!-A( z=bpD=f06rV~)Zyf%2{F?!O&6Vt6m(o3j;J^=)Oy=Whrcx7)|4DfVL&rCLE&cP9 P00000NkvXXu0mjf|GDpA literal 0 HcmV?d00001 diff --git a/pglab/icons/server_add.png b/pglab/icons/server_add.png deleted file mode 100644 index 210979f31ca08af75bb0ceda8cc97bb07c1e444b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmV;(1vmPMP)HNysR=|AMDPzlFeuWfph1jcj3mYnq80bh%w=)b-i%UPDWXZ^E_7tyDQel%WR^fEwyY3q)XF=Iy;WlWw3X-o8F0!s)@;8epo zTxkAt*DK4Oc$9{$fg0di_x5MIY-scDyyG?)h6{EA2xw$@Flgdr-EYuff4kwiCyNqA zLh0ro$B3b8-}zix^x+FwvZFI7+Y{(KkLR--%kw(@LBJL9?XfKjfuM~;wP%sQ<|B9j z%)EONSf1CR-j=9rqyfUFAKSLo$E~so@Egm?!5Y9jFr`g#ZDV@+n1mPM`7C#R z5HP!=B5zu{19DsnqO7JNEH^j<*r&7;PA;#P99A(Nmjk4f(PFv&tB-+zX>~)%{?~*S z*8t%_&vJuDfaERa01;~1#8HWJfabH@0Q5&AV41dJbbeNbvMAnJz*(sD*eQ~ez+eqf zd4QC&?>Cot=@}=jNag?ttu&PnAYIoX3fQM2!~qf40Kr|;>BE37QwM1PDKp6hOsFa2 zZcL~a&}a!wCZoRj5KhaL$a@VfTIi@2D!(7HJF&X#WmLtA>liLzT!A^+Q{u3iLR2&0 zrp>STcmaOBvIp~WAH&oM%i%Fn)Qqm6A152DAKYJCQc+Os`>=EkmiDd}qQlTOX<^{a zuZ}{9K9oa;E>ckQ*E6t4J?H zMd^!J5^01M6$J!8>(w;^SJ$uUhVG)yyLKbV<-yfpHTZ2AO8e&2{Cb5>*cu+*m>Sc#lSYR61O90?h>47-MZA%E+d2mB_4ft^2pfWoZD zQG4MdT=t!Zi?$OG*VYLO5QP971VTudk=6{!A)1 zgDAK!lgc!D=4PTR;K!_-4EVZQQIIo6+14ItR4~VDy4F2c^s1Vo!Z2u>%8=a$enjES z8Q5Ls#r)a1;peXXUM$F`?}H6Wp*$mHH5O&wBi>#*(_{ zT%x%_A8H~KlGgihk(7cBw}H~~8hDbEu-_Z&>Be{7I%H3H9%s)Hyd+2>psR#Z6lzJ% z82`s}cy99vYzaj`Zx=|vukGl*?~mjpbR|=XXefpnvr&2C0CKWO3GJBD2Z}317y&kb zSz2)%xN;s}*L{O>8u5qMiMSc@g+Kb(7mjJldR@#*PjZBHJ?i1d8S7@v)$?i(;Q>|t6Za23BaR^k0K zW$@BSGxgR`DvotI9Z2J|m`|S(4tlB17#v0I)Gtye3Zf(O9JpQvg!pSX2)ZK>ln&w8 i=fU2`G3)+MfB^u<+UI7ii(}US0000 - icons/server_add.png icons/server_delete.png icons/server_go.png icons/script_delete.png @@ -12,13 +11,18 @@ icons/page_white_add.png icons/page_white_delete.png icons/lightbulb_off.png - icons/information.png icons/16x16/document_green.png icons/16x16/document_red.png icons/16x16/document_yellow.png - icons/backups.png icons/page_white_copy.png icons/token_shortland_character.png icons/server_edit.png + icons/new_query_tab.png + icons/about.png + icons/backup_database.png + icons/add_connection.png + icons/delete_connection.png + icons/open_query_window.png + icons/manage_server.png diff --git a/pglab/tsqueue.h b/pglab/tsqueue.h index 8b93d34..12a915e 100644 --- a/pglab/tsqueue.h +++ b/pglab/tsqueue.h @@ -15,7 +15,7 @@ public: bool empty(); t_Callable pop(); - //HANDLE getNewDataEventHandle(); + //HANDLE getNewDataEventHandle(); Looks like this wasn't use at all so we can leave the event out. private: using t_CallableQueue = std::deque; From a6755c20f2d8504287dab2291f12dff6fe499353 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Thu, 24 Aug 2017 19:43:17 +0200 Subject: [PATCH 05/34] Splitter between sql and parameters. --- pglab/QueryTab.ui | 175 +++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 89 deletions(-) diff --git a/pglab/QueryTab.ui b/pglab/QueryTab.ui index 4c459db..ccac5ac 100644 --- a/pglab/QueryTab.ui +++ b/pglab/QueryTab.ui @@ -15,101 +15,98 @@ - + Qt::Vertical - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 + + + Qt::Horizontal + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel - - 0 + + QFrame::Raised - - 0 + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Add + + + + + + + Remove + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + true - - 0 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Add - - - - - - - Remove - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - true - - - - - - - + + + + From 4beea05ba602d258f3739d481b3e310b96c3d35c Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Thu, 24 Aug 2017 19:45:00 +0200 Subject: [PATCH 06/34] Adding in boost::asio support main starts a thread that keep a global io_service object running and makes sure it is stopped when everything else is stopped. --- BUILD | 9 +++++++++ CMakeLists.txt | 9 +++++++-- pglab/GlobalIoService.cpp | 7 +++++++ pglab/GlobalIoService.h | 6 ++++++ pglab/MasterController.h | 5 ++++- pglab/QueryTab.cpp | 1 - pglab/main.cpp | 22 +++++++++++++++++----- 7 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 pglab/GlobalIoService.cpp create mode 100644 pglab/GlobalIoService.h diff --git a/BUILD b/BUILD index 7ff14d1..017087d 100644 --- a/BUILD +++ b/BUILD @@ -2,3 +2,12 @@ If it doesn't detect Qt CMAKE_PREFIX_PATH needs to be set export CMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake + +Dependencies: +- Botan-2 +- libpq +- Qt5 +- fmt (should we include this one in the project? + + +- jsoncpp (included) diff --git a/CMakeLists.txt b/CMakeLists.txt index 72a6af4..5b4e800 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.1.0) project(pglaball) set (CMAKE_PREFIX_PATH /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake) +set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") find_package(PkgConfig REQUIRED) @@ -52,8 +53,11 @@ include_directories( ${Qt5Widgets_INCLUDE_DIRS} ) find_package(fmt 4.0 REQUIRED) include_directories( ${fmt_INCLUDE_DIRS} ) -#find_package(Boost 1.62 REQUIRED) # COMPONENTS program_options REQUIRED ) -#include_directories( ${Boost_INCLUDE_DIRS} ) +#find_package(Libevent 2.0 REQUIRED) +#include_directories( ${Libevent_INCLUDE_DIRS} ) + +find_package(Boost 1.63 COMPONENTS system REQUIRED ) +include_directories( ${Boost_INCLUDE_DIRS} ) add_library(core STATIC core/BackupFormatModel.cpp @@ -75,6 +79,7 @@ add_executable(pglab pglab/DatabasesTableModel.cpp pglab/DatabaseWindow.cpp pglab/ExplainTreeModelItem.cpp + pglab/GlobalIoService.cpp pglab/jsoncpp.cpp pglab/main.cpp pglab/MainWindow.cpp diff --git a/pglab/GlobalIoService.cpp b/pglab/GlobalIoService.cpp new file mode 100644 index 0000000..99ddd2b --- /dev/null +++ b/pglab/GlobalIoService.cpp @@ -0,0 +1,7 @@ +#include "GlobalIoService.h" + +std::shared_ptr getGlobalAsioIoService() +{ + static auto ios = std::make_shared(); + return ios; +} diff --git a/pglab/GlobalIoService.h b/pglab/GlobalIoService.h new file mode 100644 index 0000000..5e92327 --- /dev/null +++ b/pglab/GlobalIoService.h @@ -0,0 +1,6 @@ +#pragma once + +#include +#include + +std::shared_ptr getGlobalAsioIoService(); diff --git a/pglab/MasterController.h b/pglab/MasterController.h index 68b4bd1..562e9ee 100644 --- a/pglab/MasterController.h +++ b/pglab/MasterController.h @@ -2,8 +2,10 @@ #define MASTERCONTROLLER_H #include +#include #include + class ConnectionConfig; class ConnectionList; class ConnectionListModel; @@ -30,7 +32,7 @@ public: void openSqlWindowForConnection(int connection_index); void openServerWindowForConnection(int connection_index); void openBackupDlgForConnection(int connection_index); - + signals: public slots: @@ -39,6 +41,7 @@ private: ConnectionList *m_connectionList = nullptr; ConnectionListModel *m_connectionListModel = nullptr; ConnectionManagerWindow *m_connectionManagerWindow = nullptr; + }; #endif // MASTERCONTROLLER_H diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index d2c0c15..bcb7bd6 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -20,7 +20,6 @@ #include "PgsqlDatabaseCatalogue.h" #include "util.h" - QueryParamListController::QueryParamListController(QTableView *tv, OpenDatabase *opendb, QWidget *parent) : QObject(parent) diff --git a/pglab/main.cpp b/pglab/main.cpp index c4f3139..505265d 100644 --- a/pglab/main.cpp +++ b/pglab/main.cpp @@ -4,12 +4,13 @@ # include #endif #include +#include "GlobalIoService.h" int main(int argc, char *argv[]) { /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ -#ifdef _WIN32 +#ifdef WIN32 WORD wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; int err = WSAStartup(wVersionRequested, &wsaData); @@ -20,16 +21,27 @@ int main(int argc, char *argv[]) return 1; } #endif + QApplication a(argc, argv); QCoreApplication::setOrganizationName("pglab"); QCoreApplication::setOrganizationDomain("eelkeklein.nl"); QCoreApplication::setApplicationName("pglab"); - auto master_controller = std::make_unique(); - master_controller->init(); - int result = a.exec(); -#ifdef _WIN32 + std::thread asio_service_thread; + int result = -1; + { + auto ios = getGlobalAsioIoService(); + boost::asio::io_service::work work(*ios); // Prevent service from running out of work so run doesn't return + asio_service_thread = std::thread([ios](){ ios->run(); }); + + // make sure the io_service is stopped before we wait on the future + auto master_controller = std::make_unique(); + master_controller->init(); + result = a.exec(); + } + asio_service_thread.join(); +#ifdef WIN32 WSACleanup(); #endif return result; From f11f9545acf2b25407ceddd2b940e53188812028 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Thu, 24 Aug 2017 21:12:32 +0200 Subject: [PATCH 07/34] ASyncDBConnection is now based of boost::asio instead of using it's own thread. connection: tested OK querying: tested OK notices: should be working cancel: todo --- pglab/ASyncDBConnection.cpp | 748 +++++++++++++++++++----------------- pglab/ASyncDBConnection.h | 194 +++++----- pglab/DatabaseWindow.cpp | 5 +- pglab/QueryTab.cpp | 4 +- 4 files changed, 519 insertions(+), 432 deletions(-) diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index 7166502..633a034 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -4,396 +4,458 @@ #include #include -ASyncDBConnection::ASyncDBConnection() +using namespace boost::asio; + +ASyncDBConnection::ASyncDBConnection(boost::asio::io_service &ios) + : m_asioSock(ios) { } ASyncDBConnection::State ASyncDBConnection::state() const { - return m_threadData.m_state; + return m_state; } -//void ASyncDBConnection::setupConnection(const std::string &connstring) -//{ -// if (m_thread.joinable()) { -// m_threadData.stop(); -// m_thread.join(); -// } -// m_threadData.m_initString = connstring; -// m_thread = std::thread([this] () { m_threadData.run(); }); -//} - void ASyncDBConnection::setupConnection(const ConnectionConfig &config) { - if (m_thread.joinable()) { - m_threadData.stop(); - m_thread.join(); - } - m_threadData.m_config = config; - m_thread = std::thread([this] () { m_threadData.run(); }); +// if (m_thread.joinable()) { +// m_threadData.stop(); +// m_thread.join(); +// } +// m_threadData.m_config = config; +// m_thread = std::thread([this] () { m_threadData.run(); }); + + m_config = config; + auto keywords = m_config.getKeywords(); + auto values = m_config.getValues(); + + bool ok = m_connection.connectStart(keywords, values); + // auto start = std::chrono::steady_clock::now(); + if (ok && m_connection.status() != CONNECTION_BAD) { + auto sock_handle = m_connection.socket(); + m_asioSock.assign(ip::tcp::v4(), sock_handle); + m_asioSock.non_blocking(true); + + m_asioSock.async_write_some(null_buffers(), + [this] (boost::system::error_code ec, std::size_t s) + { async_connect_handler(ec, s); } + ); + } } +void ASyncDBConnection::async_connect_handler(boost::system::error_code ec, std::size_t s) +{ + auto poll_state = m_connection.connectPoll(); + if (poll_state == PGRES_POLLING_OK) { + // if connected return true + doStateCallback(State::Connected); + } + else if (poll_state == PGRES_POLLING_FAILED) { + doStateCallback(State::NotConnected); + } + else if (poll_state == PGRES_POLLING_READING) { + doStateCallback(State::Connecting); + m_asioSock.async_read_some(null_buffers(), + [this] (boost::system::error_code ec, std::size_t s) + { async_connect_handler(ec, s); } + ); + } + else if (poll_state == PGRES_POLLING_WRITING) { + doStateCallback(State::Connecting); + m_asioSock.async_write_some(null_buffers(), + [this] (boost::system::error_code ec, std::size_t s) + { async_connect_handler(ec, s); } + ); + } +} + +void ASyncDBConnection::doStateCallback(State state) +{ + m_state = state; + if (state == State::Connected) { + m_connection.setNoticeReceiver( + [this](const PGresult *result) { processNotice(result); }); + } + + std::lock_guard lg(m_stateCallback.m_mutex); + if (m_stateCallback.m_func) { + m_stateCallback.m_func(state); + } + +} + + void ASyncDBConnection::closeConnection() { - m_threadData.stop(); - if (m_thread.joinable()) { - m_thread.join(); - } +// m_threadData.stop(); +// if (m_thread.joinable()) { +// m_thread.join(); +// } + // SHould this be async too???? + m_connection.close(); } bool ASyncDBConnection::send(const std::string &command, on_result_callback on_result) { - { - std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); - m_threadData.m_commandQueue.m_queue.emplace(command, on_result); - m_threadData.m_commandQueue.m_newEvent.notify_one(); - } +// { +// std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); +// m_threadData.m_commandQueue.m_queue.emplace(command, on_result); +// m_threadData.m_commandQueue.m_newEvent.notify_one(); +// } + + m_connection.sendQuery(command); + m_timer.start(); + doStateCallback(State::QuerySend); + m_asioSock.async_read_some(null_buffers(), + [this, on_result] (boost::system::error_code ec, std::size_t s) + { async_query_handler(ec, s, on_result); } + ); return true; } bool ASyncDBConnection::send(const std::string &command, Pgsql::Params params, on_result_callback on_result) { - { - std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); - m_threadData.m_commandQueue.m_queue.emplace(command, std::move(params), on_result); - m_threadData.m_commandQueue.m_newEvent.notify_one(); - } +// { +// std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); +// m_threadData.m_commandQueue.m_queue.emplace(command, std::move(params), on_result); +// m_threadData.m_commandQueue.m_newEvent.notify_one(); +// } + m_connection.sendQueryParams(command.c_str(), params); + m_timer.start(); + doStateCallback(State::QuerySend); + m_asioSock.async_read_some(null_buffers(), + [this, on_result] (boost::system::error_code ec, std::size_t s) + { async_query_handler(ec, s, on_result); } + ); return true; } -bool ASyncDBConnection::cancel() -{ - return m_threadData.cancel(); -} - -void ASyncDBConnection::setStateCallback(on_state_callback state_callback) -{ - std::lock_guard lg(m_threadData.m_stateCallback.m_mutex); - m_threadData.m_stateCallback.m_func = state_callback; -} - -void ASyncDBConnection::setNoticeCallback(on_notice_callback notice_callback) -{ - std::lock_guard lg(m_threadData.m_noticeCallback.m_mutex); - m_threadData.m_noticeCallback.m_func = notice_callback; -} - -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 - if (makeConnection()) { - m_connection.setNoticeReceiver( - [this](const PGresult *result) { processNotice(result); }); - m_canceller = m_connection.getCancel(); - - - // send commands and receive results - communicate(); - } - else { - // It is not possible to determine the source of the problem. - // Accept for PQconnectionNeedsPassword - - // Pass problem to main thread and stop this thread - - // Main thread needs to know it has to restart connecting if it want's to. - // TODO: add status functions to help main thread so it doesn't have to remember - // everything reported through callbacks. - - break; - } - } - // close connection -} - -bool ASyncDBConnection::Thread::cancel() -{ - return m_canceller.cancel(nullptr); -} - -bool ASyncDBConnection::Thread::makeConnection() -{ - //using namespace std::literals::chrono_literals; - - // start connecting - auto keywords = m_config.getKeywords(); - auto values = m_config.getValues(); -#if true - bool result = m_connection.connect(keywords, values, 0); - if (result) { - doStateCallback(State::Connected); - } - return result; -#else - while (!terminateRequested) { - - bool ok = m_connection.connectStart(keywords, values); - auto start = std::chrono::steady_clock::now(); - if (ok && m_connection.status() != CONNECTION_BAD) { - int sock = m_connection.socket(); - Win32Event socket_event(Win32Event::Reset::Auto, Win32Event::Initial::Clear); - - long fd = FD_WRITE; - while (true) { - // poll till complete or failed (we can get an abort command) - WSAEventSelect(sock, socket_event.handle(), fd); - WaitHandleList whl; - auto wait_result_socket_event = whl.add(socket_event); - //auto wait_result_stop = whl.add(m_stopEvent); - - auto nu = std::chrono::steady_clock::now(); - std::chrono::duration diff = -(nu-start); - diff += 30s; - DWORD timeout = diff.count(); - - DWORD res = MsgWaitForMultipleObjectsEx( - whl.count(), // _In_ DWORD nCount, - whl, // _In_ const HANDLE *pHandles, - timeout, // _In_ DWORD dwMilliseconds, - 0, // _In_ DWORD dwWakeMask, - 0 // _In_ DWORD dwFlags - ); - if (res == wait_result_socket_event) { - auto poll_state = m_connection.connectPoll(); - if (poll_state == PGRES_POLLING_OK) { - // if connected return true - doStateCallback(State::Connected); - return true; - } - else if (poll_state == PGRES_POLLING_FAILED) { - doStateCallback(State::NotConnected); - return false; - } - else if (poll_state == PGRES_POLLING_READING) { - doStateCallback(State::Connecting); - fd = FD_READ; - } - else if (poll_state == PGRES_POLLING_WRITING) { - doStateCallback(State::Connecting); - fd = FD_WRITE; - } - } - else if (res == wait_result_stop) { - - } - } // end while (true) - } - } - return false; -#endif -} - -void ASyncDBConnection::Thread::communicate() -{ - while (!terminateRequested) { - // wait for something to do: - // - command to send to server - // - wait for results and (notifies can also come in) - // - pass each result on to the completion routine - // - notify comming in from the server - // - pass to notify callback - // - connection raises an error - // - return - // - stop signal - // - return - - - if (m_state == State::Connected) { - waitForAndSendCommand(); - } - else if (m_state == State::QuerySend || m_state == State::CancelSend) { - // Wait for result, even after a cancel we should wait, for all results - // New command's are not excepted when one has been send - waitForResult(); - } - - } -} - -void ASyncDBConnection::Thread::stop() -{ - terminateRequested = true; - //m_stopEvent.set(); -} - -void ASyncDBConnection::Thread::doStateCallback(State state) -{ - m_state = state; - std::lock_guard lg(m_stateCallback.m_mutex); - if (m_stateCallback.m_func) { - m_stateCallback.m_func(state); - } -} - -void ASyncDBConnection::Thread::waitForAndSendCommand() -{ - using namespace std::chrono_literals; - // lock the data - std::unique_lock lk(m_commandQueue.m_mutex); - if (m_commandQueue.m_queue.empty()) { - // no data wait till there is data - m_commandQueue.m_newEvent.wait_for(lk, 1000ms); - // can we use the predicate to reimplement the stop function???, []{return ready;}); - - } - doNewCommand(); - -#if false - WaitHandleList whl; - auto wait_result_new_command = whl.add(m_commandQueue.m_newEvent); - //auto wait_result_stop = - //whl.add(m_stopEvent); - - DWORD res = MsgWaitForMultipleObjectsEx( - whl.count(), // _In_ DWORD nCount, - whl, // _In_ const HANDLE *pHandles, - INFINITE, // _In_ DWORD dwMilliseconds, - 0, // _In_ DWORD dwWakeMask, - 0 // _In_ DWORD dwFlags - ); - if (res == wait_result_new_command) { - doNewCommand(); - } - // if (res == wait_result_stop) return; -#endif -} - -void ASyncDBConnection::Thread::doNewCommand() -{ - // get command from top of queue (but leave it in the queue, we need the callback) - if (! m_commandQueue.m_queue.empty()) { - const Command &command = m_commandQueue.m_queue.front(); - if (!command.command.empty()) { - bool query_send = false; - if (command.params.empty()) - query_send = m_connection.sendQuery(command.command.c_str()); - else - query_send = m_connection.sendQueryParams(command.command.c_str(), command.params); - - if (query_send) { - m_timer.start(); - doStateCallback(State::QuerySend); - } - else { - std::string error = m_connection.getErrorMessage(); - // todo: need to report the error - } - } - } - -} - -bool ASyncDBConnection::Thread::consumeResultInput() +void ASyncDBConnection::async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result) { bool finished = false; if (m_connection.consumeInput()) { while ( ! finished && ! m_connection.isBusy()) { - auto res(m_connection.getResult()); - { - qint64 ms = m_timer.restart(); - std::lock_guard lg(m_commandQueue.m_mutex); - m_commandQueue.m_queue.front().on_result(res, ms); - if (res == nullptr) { - m_timer.invalidate(); - m_commandQueue.m_queue.pop(); - doStateCallback(State::Connected); - finished = true; - } + auto res = m_connection.getResult(); + qint64 ms = m_timer.restart(); + on_result(res, ms); + if (res == nullptr) { + m_timer.invalidate(); + doStateCallback(State::Connected); + finished = true; } - } // else is still waiting for more data - } else { // error during consume } - return finished; + //return finished; + if (!finished) { + // wait for more + m_asioSock.async_read_some(null_buffers(), + [this, on_result] (boost::system::error_code ec, std::size_t s) + { async_query_handler(ec, s, on_result); } + ); + } } -void ASyncDBConnection::Thread::waitForResult() +bool ASyncDBConnection::cancel() { - int sock = m_connection.socket(); - - fd_set readfds; - timeval timeout; - bool finished = false; - while (!finished && !terminateRequested) { - FD_ZERO(&readfds); - FD_SET(sock, &readfds); - - timeout.tv_sec = 5; - timeout.tv_usec = 0; - - int select_result = select(sock + 1, &readfds, nullptr, nullptr, &timeout); - if (select_result > 0) { - if (FD_ISSET(sock, &readfds)) { - if (consumeResultInput()) { - finished = true; - } - } - } - - } -#if false - Win32Event socket_event(Win32Event::Reset::Manual, Win32Event::Initial::Clear); - - long fd = FD_READ | FD_CLOSE; - - bool finished = false; - while ( ! finished) { - WSAEventSelect(sock, socket_event.handle(), fd); - - WaitHandleList whl; - auto wait_result_socket = whl.add(socket_event); - //auto wait_result_stop = whl.add(m_stopEvent); - - DWORD res = MsgWaitForMultipleObjectsEx( - whl.count(), // _In_ DWORD nCount, - whl, // _In_ const HANDLE *pHandles, - INFINITE, // _In_ DWORD dwMilliseconds, - 0, // _In_ DWORD dwWakeMask, - 0 // _In_ DWORD dwFlags - ); - if (res == wait_result_socket) { - WSANETWORKEVENTS net_events; - WSAEnumNetworkEvents(sock, socket_event.handle(), &net_events); - - if (net_events.lNetworkEvents & FD_READ) { - if (consumeResultInput()) { - finished = true; - } - } - } - if (res == wait_result_stop) { - // Send cancel, close connection and terminate thread - cancel(); - doStateCallback(State::Terminating); - finished = true; - } - } // end while - // When last result received, remove command from queue -#endif + return false; //m_threadData.cancel(); } -void ASyncDBConnection::Thread::processNotice(const PGresult *result) +void ASyncDBConnection::setStateCallback(on_state_callback state_callback) +{ + std::lock_guard lg(m_stateCallback.m_mutex); + m_stateCallback.m_func = state_callback; +} + +void ASyncDBConnection::setNoticeCallback(on_notice_callback notice_callback) +{ + std::lock_guard lg(m_noticeCallback.m_mutex); + m_noticeCallback.m_func = notice_callback; +} + +void ASyncDBConnection::processNotice(const PGresult *result) { -// Pgsql::Result res(result); std::lock_guard lg(m_noticeCallback.m_mutex); if (m_noticeCallback.m_func) { Pgsql::ErrorDetails details = Pgsql::ErrorDetails::createErrorDetailsFromPGresult(result); m_noticeCallback.m_func(details); } } + +// 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 +// if (makeConnection()) { +// m_connection.setNoticeReceiver( +// [this](const PGresult *result) { processNotice(result); }); +// m_canceller = m_connection.getCancel(); +// +// +// // send commands and receive results +// communicate(); +// } +// else { +// // It is not possible to determine the source of the problem. +// // Accept for PQconnectionNeedsPassword +// +// // Pass problem to main thread and stop this thread +// +// // Main thread needs to know it has to restart connecting if it want's to. +// // TODO: add status functions to help main thread so it doesn't have to remember +// // everything reported through callbacks. +// +// break; +// } +// } +// // close connection +// } +// +// bool ASyncDBConnection::Thread::cancel() +// { +// return m_canceller.cancel(nullptr); +// } + +// bool ASyncDBConnection::Thread::makeConnection() +// { +// //using namespace std::literals::chrono_literals; +// +// // start connecting +// auto keywords = m_config.getKeywords(); +// auto values = m_config.getValues(); +// #if true +// bool result = m_connection.connect(keywords, values, 0); +// if (result) { +// doStateCallback(State::Connected); +// } +// return result; +// #else +// while (!terminateRequested) { +// +// bool ok = m_connection.connectStart(keywords, values); +// auto start = std::chrono::steady_clock::now(); +// if (ok && m_connection.status() != CONNECTION_BAD) { +// int sock = m_connection.socket(); +// Win32Event socket_event(Win32Event::Reset::Auto, Win32Event::Initial::Clear); +// +// long fd = FD_WRITE; +// while (true) { +// // poll till complete or failed (we can get an abort command) +// WSAEventSelect(sock, socket_event.handle(), fd); +// WaitHandleList whl; +// auto wait_result_socket_event = whl.add(socket_event); +// //auto wait_result_stop = whl.add(m_stopEvent); +// +// auto nu = std::chrono::steady_clock::now(); +// std::chrono::duration diff = -(nu-start); +// diff += 30s; +// DWORD timeout = diff.count(); +// +// DWORD res = MsgWaitForMultipleObjectsEx( +// whl.count(), // _In_ DWORD nCount, +// whl, // _In_ const HANDLE *pHandles, +// timeout, // _In_ DWORD dwMilliseconds, +// 0, // _In_ DWORD dwWakeMask, +// 0 // _In_ DWORD dwFlags +// ); +// if (res == wait_result_socket_event) { +// auto poll_state = m_connection.connectPoll(); +// if (poll_state == PGRES_POLLING_OK) { +// // if connected return true +// doStateCallback(State::Connected); +// return true; +// } +// else if (poll_state == PGRES_POLLING_FAILED) { +// doStateCallback(State::NotConnected); +// return false; +// } +// else if (poll_state == PGRES_POLLING_READING) { +// doStateCallback(State::Connecting); +// fd = FD_READ; +// } +// else if (poll_state == PGRES_POLLING_WRITING) { +// doStateCallback(State::Connecting); +// fd = FD_WRITE; +// } +// } +// else if (res == wait_result_stop) { +// +// } +// } // end while (true) +// } +// } +// return false; +// #endif +// } +// +// void ASyncDBConnection::Thread::communicate() +// { +// while (!terminateRequested) { +// // wait for something to do: +// // - command to send to server +// // - wait for results and (notifies can also come in) +// // - pass each result on to the completion routine +// // - notify comming in from the server +// // - pass to notify callback +// // - connection raises an error +// // - return +// // - stop signal +// // - return +// +// +// if (m_state == State::Connected) { +// waitForAndSendCommand(); +// } +// else if (m_state == State::QuerySend || m_state == State::CancelSend) { +// // Wait for result, even after a cancel we should wait, for all results +// // New command's are not excepted when one has been send +// waitForResult(); +// } +// +// } +// } +// +// void ASyncDBConnection::Thread::stop() +// { +// terminateRequested = true; +// //m_stopEvent.set(); +// } + +// void ASyncDBConnection::Thread::doStateCallback(State state) +// { +// m_state = state; +// std::lock_guard lg(m_stateCallback.m_mutex); +// if (m_stateCallback.m_func) { +// m_stateCallback.m_func(state); +// } +// } + +// void ASyncDBConnection::Thread::waitForAndSendCommand() +// { +// using namespace std::chrono_literals; +// // lock the data +// std::unique_lock lk(m_commandQueue.m_mutex); +// if (m_commandQueue.m_queue.empty()) { +// // no data wait till there is data +// m_commandQueue.m_newEvent.wait_for(lk, 1000ms); +// // can we use the predicate to reimplement the stop function???, []{return ready;}); +// +// } +// doNewCommand(); +// +// #if false +// WaitHandleList whl; +// auto wait_result_new_command = whl.add(m_commandQueue.m_newEvent); +// //auto wait_result_stop = +// //whl.add(m_stopEvent); +// +// DWORD res = MsgWaitForMultipleObjectsEx( +// whl.count(), // _In_ DWORD nCount, +// whl, // _In_ const HANDLE *pHandles, +// INFINITE, // _In_ DWORD dwMilliseconds, +// 0, // _In_ DWORD dwWakeMask, +// 0 // _In_ DWORD dwFlags +// ); +// if (res == wait_result_new_command) { +// doNewCommand(); +// } +// // if (res == wait_result_stop) return; +// #endif +// } + +// void ASyncDBConnection::Thread::doNewCommand() +// { +// // get command from top of queue (but leave it in the queue, we need the callback) +// if (! m_commandQueue.m_queue.empty()) { +// const Command &command = m_commandQueue.m_queue.front(); +// if (!command.command.empty()) { +// bool query_send = false; +// if (command.params.empty()) +// query_send = m_connection.sendQuery(command.command.c_str()); +// else +// query_send = m_connection.sendQueryParams(command.command.c_str(), command.params); +// +// if (query_send) { +// m_timer.start(); +// doStateCallback(State::QuerySend); +// } +// else { +// std::string error = m_connection.getErrorMessage(); +// // todo: need to report the error +// } +// } +// } +// +// } + +// bool ASyncDBConnection::Thread::consumeResultInput() +// { +// bool finished = false; +// if (m_connection.consumeInput()) { +// while ( ! finished && ! m_connection.isBusy()) { +// auto res(m_connection.getResult()); +// { +// qint64 ms = m_timer.restart(); +// std::lock_guard lg(m_commandQueue.m_mutex); +// m_commandQueue.m_queue.front().on_result(res, ms); +// if (res == nullptr) { +// m_timer.invalidate(); +// m_commandQueue.m_queue.pop(); +// doStateCallback(State::Connected); +// finished = true; +// } +// } +// +// } +// // else is still waiting for more data +// +// } +// else { +// // error during consume +// +// } +// return finished; +// } + +// void ASyncDBConnection::Thread::waitForResult() +// { +// int sock = m_connection.socket(); +// +// fd_set readfds; +// timeval timeout; +// bool finished = false; +// while (!finished && !terminateRequested) { +// FD_ZERO(&readfds); +// FD_SET(sock, &readfds); +// +// timeout.tv_sec = 5; +// timeout.tv_usec = 0; +// +// int select_result = select(sock + 1, &readfds, nullptr, nullptr, &timeout); +// if (select_result > 0) { +// if (FD_ISSET(sock, &readfds)) { +// if (consumeResultInput()) { +// finished = true; +// } +// } +// } +// +// } +// } + +/* +*/ diff --git a/pglab/ASyncDBConnection.h b/pglab/ASyncDBConnection.h index cfc5dae..99dab70 100644 --- a/pglab/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -5,12 +5,14 @@ #include "Pgsql_Params.h" #include "ConnectionConfig.h" #include -#include -#include +// #include +// #include #include -#include -#include -#include +// #include +// #include +// #include +#include +#include /** \brief Class that handles asynchronous execution of queries. * @@ -32,7 +34,7 @@ public: using on_state_callback = std::function; using on_notice_callback = std::function; - ASyncDBConnection(); + ASyncDBConnection(boost::asio::io_service &ios); State state() const; // void setupConnection(const std::string &connstring); @@ -54,88 +56,106 @@ public: bool cancel(); private: + Pgsql::Connection m_connection; + boost::asio::ip::tcp::socket m_asioSock; + ConnectionConfig m_config; + State m_state = State::NotConnected; + struct { + std::mutex m_mutex; + on_state_callback m_func; + } m_stateCallback; + struct { + std::mutex m_mutex; + on_notice_callback m_func; + } m_noticeCallback; + QElapsedTimer m_timer; + + void async_connect_handler(boost::system::error_code ec, std::size_t s); + void async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result); + void doStateCallback(State state); + void processNotice(const PGresult *result); - class Command { - public: - std::string command; - Pgsql::Params params; - on_result_callback on_result; - - Command() = default; - Command(const std::string &cmd, on_result_callback cb) - : command(cmd), on_result(cb) - {} - Command(const std::string &cmd, Pgsql::Params &&p, on_result_callback cb) - : command(cmd), params(p), on_result(cb) - {} - }; - - /// Contains all the members accessed by the thread - class Thread { - public: - using t_CommandQueue = std::queue; - struct { - std::mutex m_mutex; - on_state_callback m_func; - } m_stateCallback; - struct { - std::mutex m_mutex; - on_notice_callback m_func; - } m_noticeCallback; - - struct t_Command { - std::mutex m_mutex; - t_CommandQueue m_queue; - std::condition_variable m_newEvent; - t_Command() - {} - } m_commandQueue; - -// std::string m_initString; - ConnectionConfig m_config; - State m_state = State::NotConnected; - - Thread(); - - /// Is started as a seperate thread by ASyncDBConnection - void run(); - - /// Sends a cancel request to the DB server - bool cancel(); - - void stop(); - - private: - - /// \todo Implement new method to stop the thread - //Win32Event m_stopEvent; - Pgsql::Connection m_connection; - bool terminateRequested = false; ///< is set when the thread should stop - bool m_terminated = true; - Pgsql::Canceller m_canceller; - QElapsedTimer m_timer; - - - bool makeConnection(); - void communicate(); - - void doStateCallback(State state); - /// Wait's for a command to come in and send's it to the server - void waitForAndSendCommand(); - void doNewCommand(); - void waitForResult(); - - - void processNotice(const PGresult *result); - /** Function to call when after sending a command the socket is ready for reading. - * - * It might take several consumes before all data is read. - */ - bool consumeResultInput(); - }; - - Thread m_threadData; - std::thread m_thread; +// class Command { +// public: +// std::string command; +// Pgsql::Params params; +// on_result_callback on_result; +// +// Command() = default; +// Command(const std::string &cmd, on_result_callback cb) +// : command(cmd), on_result(cb) +// {} +// Command(const std::string &cmd, Pgsql::Params &&p, on_result_callback cb) +// : command(cmd), params(p), on_result(cb) +// {} +// }; +// +// /// Contains all the members accessed by the thread +// class Thread { +// public: +// using t_CommandQueue = std::queue; +// struct { +// std::mutex m_mutex; +// on_state_callback m_func; +// } m_stateCallback; +// struct { +// std::mutex m_mutex; +// on_notice_callback m_func; +// } m_noticeCallback; +// +// struct t_Command { +// std::mutex m_mutex; +// t_CommandQueue m_queue; +// std::condition_variable m_newEvent; +// t_Command() +// {} +// } m_commandQueue; +// +// // std::string m_initString; +// ConnectionConfig m_config; +// State m_state = State::NotConnected; +// +// Thread(); +// +// /// Is started as a seperate thread by ASyncDBConnection +// void run(); +// +// /// Sends a cancel request to the DB server +// bool cancel(); +// +// void stop(); +// +// private: +// +// /// \todo Implement new method to stop the thread +// //Win32Event m_stopEvent; +// Pgsql::Connection m_connection; +// bool terminateRequested = false; ///< is set when the thread should stop +// bool m_terminated = true; +// Pgsql::Canceller m_canceller; +// QElapsedTimer m_timer; +// +// +// bool makeConnection(); +// void communicate(); +// +// void doStateCallback(State state); +// /// Wait's for a command to come in and send's it to the server +// void waitForAndSendCommand(); +// void doNewCommand(); +// void waitForResult(); +// +// +// void processNotice(const PGresult *result); +// /** Function to call when after sending a command the socket is ready for reading. +// * +// * It might take several consumes before all data is read. +// */ +// bool consumeResultInput(); +// }; +// +// Thread m_threadData; +// std::thread m_thread; }; #endif // ASYNCDBCONNECTION_H diff --git a/pglab/DatabaseWindow.cpp b/pglab/DatabaseWindow.cpp index db0653e..da890b3 100644 --- a/pglab/DatabaseWindow.cpp +++ b/pglab/DatabaseWindow.cpp @@ -1,10 +1,13 @@ #include "DatabaseWindow.h" #include "ui_DatabaseWindow.h" #include +#include "GlobalIoService.h" + DatabaseWindow::DatabaseWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::DatabaseWindow) + ui(new Ui::DatabaseWindow), + m_dbConnection(*getGlobalAsioIoService()) { ui->setupUi(this); diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index bcb7bd6..7c5780a 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -19,6 +19,7 @@ #include "PgTypeContainer.h" #include "PgsqlDatabaseCatalogue.h" #include "util.h" +#include "GlobalIoService.h" QueryParamListController::QueryParamListController(QTableView *tv, OpenDatabase *opendb, QWidget *parent) @@ -60,7 +61,8 @@ void QueryParamListController::on_removeParam() QueryTab::QueryTab(MainWindow *win, QWidget *parent) : QWidget(parent), ui(new Ui::QueryTab), - m_win(win) + m_win(win), + m_dbConnection(*getGlobalAsioIoService()) { ui->setupUi(this); From 16676aa9101da9e0e09a4193ac8e0391719b83a7 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 25 Aug 2017 08:37:18 +0200 Subject: [PATCH 08/34] Cancel functionality works again. Also async operations are now cancelled when the dbconnection is closed and if needed also a cancel is send before closing the connection. --- pglab/ASyncDBConnection.cpp | 103 ++++++++++++++++++++---------------- pglab/ASyncDBConnection.h | 13 +++-- 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index 633a034..c1e97e9 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -8,9 +8,9 @@ using namespace boost::asio; ASyncDBConnection::ASyncDBConnection(boost::asio::io_service &ios) : m_asioSock(ios) -{ +{} -} +ASyncDBConnection::~ASyncDBConnection() = default; ASyncDBConnection::State ASyncDBConnection::state() const { @@ -46,27 +46,30 @@ void ASyncDBConnection::setupConnection(const ConnectionConfig &config) void ASyncDBConnection::async_connect_handler(boost::system::error_code ec, std::size_t s) { - auto poll_state = m_connection.connectPoll(); - if (poll_state == PGRES_POLLING_OK) { - // if connected return true - doStateCallback(State::Connected); - } - else if (poll_state == PGRES_POLLING_FAILED) { - doStateCallback(State::NotConnected); - } - else if (poll_state == PGRES_POLLING_READING) { - doStateCallback(State::Connecting); - m_asioSock.async_read_some(null_buffers(), - [this] (boost::system::error_code ec, std::size_t s) - { async_connect_handler(ec, s); } - ); - } - else if (poll_state == PGRES_POLLING_WRITING) { - doStateCallback(State::Connecting); - m_asioSock.async_write_some(null_buffers(), - [this] (boost::system::error_code ec, std::size_t s) - { async_connect_handler(ec, s); } - ); + // boost::asio::error::operation_aborted + if (ec == boost::system::errc::success) { + auto poll_state = m_connection.connectPoll(); + if (poll_state == PGRES_POLLING_OK) { + // if connected return true + doStateCallback(State::Connected); + } + else if (poll_state == PGRES_POLLING_FAILED) { + doStateCallback(State::NotConnected); + } + else if (poll_state == PGRES_POLLING_READING) { + doStateCallback(State::Connecting); + m_asioSock.async_read_some(null_buffers(), + [this] (boost::system::error_code ec, std::size_t s) + { async_connect_handler(ec, s); } + ); + } + else if (poll_state == PGRES_POLLING_WRITING) { + doStateCallback(State::Connecting); + m_asioSock.async_write_some(null_buffers(), + [this] (boost::system::error_code ec, std::size_t s) + { async_connect_handler(ec, s); } + ); + } } } @@ -74,6 +77,7 @@ void ASyncDBConnection::doStateCallback(State state) { m_state = state; if (state == State::Connected) { + m_canceller = m_connection.getCancel(); m_connection.setNoticeReceiver( [this](const PGresult *result) { processNotice(result); }); } @@ -93,7 +97,12 @@ void ASyncDBConnection::closeConnection() // m_thread.join(); // } // SHould this be async too???? + if (m_state == State::QuerySend) { + m_canceller.cancel(nullptr); + } + m_asioSock.close(); m_connection.close(); + doStateCallback(State::NotConnected); } bool ASyncDBConnection::send(const std::string &command, on_result_callback on_result) @@ -133,37 +142,39 @@ bool ASyncDBConnection::send(const std::string &command, Pgsql::Params params, o void ASyncDBConnection::async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result) { - bool finished = false; - if (m_connection.consumeInput()) { - while ( ! finished && ! m_connection.isBusy()) { - auto res = m_connection.getResult(); - qint64 ms = m_timer.restart(); - on_result(res, ms); - if (res == nullptr) { - m_timer.invalidate(); - doStateCallback(State::Connected); - finished = true; + if (ec == boost::system::errc::success) { + bool finished = false; + if (m_connection.consumeInput()) { + while ( ! finished && ! m_connection.isBusy()) { + auto res = m_connection.getResult(); + qint64 ms = m_timer.restart(); + on_result(res, ms); + if (res == nullptr) { + m_timer.invalidate(); + doStateCallback(State::Connected); + finished = true; + } } + // else is still waiting for more data } - // else is still waiting for more data - } - else { - // error during consume + else { + // error during consume - } - //return finished; - if (!finished) { - // wait for more - m_asioSock.async_read_some(null_buffers(), - [this, on_result] (boost::system::error_code ec, std::size_t s) - { async_query_handler(ec, s, on_result); } - ); + } + //return finished; + if (!finished) { + // wait for more + m_asioSock.async_read_some(null_buffers(), + [this, on_result] (boost::system::error_code ec, std::size_t s) + { async_query_handler(ec, s, on_result); } + ); + } } } bool ASyncDBConnection::cancel() { - return false; //m_threadData.cancel(); + return m_canceller.cancel(nullptr); } void ASyncDBConnection::setStateCallback(on_state_callback state_callback) diff --git a/pglab/ASyncDBConnection.h b/pglab/ASyncDBConnection.h index 99dab70..622f41e 100644 --- a/pglab/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -24,17 +24,18 @@ public: enum class State { NotConnected, Connecting, - Connected, - QuerySend, - CancelSend, - Terminating + Connected, ///< connected and idle + QuerySend, ///< connected query send expecting result + CancelSend, ///< cancel send expecting result + Terminating ///< shutting down }; using on_result_callback = std::function, qint64)>; using on_state_callback = std::function; using on_notice_callback = std::function; - ASyncDBConnection(boost::asio::io_service &ios); + explicit ASyncDBConnection(boost::asio::io_service &ios); + ~ASyncDBConnection(); State state() const; // void setupConnection(const std::string &connstring); @@ -60,10 +61,12 @@ private: boost::asio::ip::tcp::socket m_asioSock; ConnectionConfig m_config; State m_state = State::NotConnected; + Pgsql::Canceller m_canceller; struct { std::mutex m_mutex; on_state_callback m_func; } m_stateCallback; + struct { std::mutex m_mutex; on_notice_callback m_func; From 03f1c55f0b17f730ce76660b71378070044de108 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 25 Aug 2017 08:38:07 +0200 Subject: [PATCH 09/34] Added the kdeveloper files --- .kdev4/pglab.kdev4 | 21 +++++++++++++++++++++ pglab.kdev4 | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 .kdev4/pglab.kdev4 create mode 100644 pglab.kdev4 diff --git a/.kdev4/pglab.kdev4 b/.kdev4/pglab.kdev4 new file mode 100644 index 0000000..fae07a0 --- /dev/null +++ b/.kdev4/pglab.kdev4 @@ -0,0 +1,21 @@ +[Buildset] +BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\n\x00p\x00g\x00l\x00a\x00b) + +[CMake] +Build Directory Count=1 +Current Build Directory Index=0 + +[CMake][CMake Build Directory 0] +Build Directory Path=/home/eelke/prog/builds/pglab/debug +Build Type=Debug +CMake Binary=/usr/bin/cmake +Environment Profile= +Extra Arguments= +Install Directory=/usr/local + +[MakeBuilder] +Number Of Jobs=5 +Override Number Of Jobs=true + +[Project] +VersionControlSupport=kdevgit diff --git a/pglab.kdev4 b/pglab.kdev4 new file mode 100644 index 0000000..2796a40 --- /dev/null +++ b/pglab.kdev4 @@ -0,0 +1,4 @@ +[Project] +CreatedFrom=pglab +Manager=KDevCMakeManager +Name=pglab From 52442a145d37c00f3b346405fe5c6b1e6fb0163b Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 25 Aug 2017 08:45:54 +0200 Subject: [PATCH 10/34] Cleanup, removed commented out code, removed two units specific to windows which were not needed anymore because we are using boost::asio now. --- CMakeLists.txt | 2 - pglab/ASyncDBConnection.cpp | 297 ------------------------------------ pglab/ASyncDBConnection.h | 83 ---------- pglab/waithandlelist.cpp | 34 ----- pglab/waithandlelist.h | 28 ---- pglab/win32event.cpp | 1 - pglab/win32event.h | 49 ------ 7 files changed, 494 deletions(-) delete mode 100644 pglab/waithandlelist.cpp delete mode 100644 pglab/waithandlelist.h delete mode 100644 pglab/win32event.cpp delete mode 100644 pglab/win32event.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b4e800..afeb4c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,8 +115,6 @@ add_executable(pglab pglab/tuplesresultwidget.cpp pglab/TypeSelectionItemModel.cpp pglab/util.cpp - pglab/waithandlelist.cpp - pglab/win32event.cpp pglab/resources.qrc ) diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index c1e97e9..c1ee412 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -1,8 +1,6 @@ #include "ASyncDBConnection.h" -#include "waithandlelist.h" #include "ScopeGuard.h" #include -#include using namespace boost::asio; @@ -19,13 +17,6 @@ ASyncDBConnection::State ASyncDBConnection::state() const void ASyncDBConnection::setupConnection(const ConnectionConfig &config) { -// if (m_thread.joinable()) { -// m_threadData.stop(); -// m_thread.join(); -// } -// m_threadData.m_config = config; -// m_thread = std::thread([this] () { m_threadData.run(); }); - m_config = config; auto keywords = m_config.getKeywords(); auto values = m_config.getValues(); @@ -92,10 +83,6 @@ void ASyncDBConnection::doStateCallback(State state) void ASyncDBConnection::closeConnection() { -// m_threadData.stop(); -// if (m_thread.joinable()) { -// m_thread.join(); -// } // SHould this be async too???? if (m_state == State::QuerySend) { m_canceller.cancel(nullptr); @@ -107,12 +94,6 @@ void ASyncDBConnection::closeConnection() bool ASyncDBConnection::send(const std::string &command, on_result_callback on_result) { -// { -// std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); -// m_threadData.m_commandQueue.m_queue.emplace(command, on_result); -// m_threadData.m_commandQueue.m_newEvent.notify_one(); -// } - m_connection.sendQuery(command); m_timer.start(); doStateCallback(State::QuerySend); @@ -125,11 +106,6 @@ bool ASyncDBConnection::send(const std::string &command, on_result_callback on_r bool ASyncDBConnection::send(const std::string &command, Pgsql::Params params, on_result_callback on_result) { -// { -// std::lock_guard lg(m_threadData.m_commandQueue.m_mutex); -// m_threadData.m_commandQueue.m_queue.emplace(command, std::move(params), on_result); -// m_threadData.m_commandQueue.m_newEvent.notify_one(); -// } m_connection.sendQueryParams(command.c_str(), params); m_timer.start(); doStateCallback(State::QuerySend); @@ -197,276 +173,3 @@ void ASyncDBConnection::processNotice(const PGresult *result) m_noticeCallback.m_func(details); } } - -// 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 -// if (makeConnection()) { -// m_connection.setNoticeReceiver( -// [this](const PGresult *result) { processNotice(result); }); -// m_canceller = m_connection.getCancel(); -// -// -// // send commands and receive results -// communicate(); -// } -// else { -// // It is not possible to determine the source of the problem. -// // Accept for PQconnectionNeedsPassword -// -// // Pass problem to main thread and stop this thread -// -// // Main thread needs to know it has to restart connecting if it want's to. -// // TODO: add status functions to help main thread so it doesn't have to remember -// // everything reported through callbacks. -// -// break; -// } -// } -// // close connection -// } -// -// bool ASyncDBConnection::Thread::cancel() -// { -// return m_canceller.cancel(nullptr); -// } - -// bool ASyncDBConnection::Thread::makeConnection() -// { -// //using namespace std::literals::chrono_literals; -// -// // start connecting -// auto keywords = m_config.getKeywords(); -// auto values = m_config.getValues(); -// #if true -// bool result = m_connection.connect(keywords, values, 0); -// if (result) { -// doStateCallback(State::Connected); -// } -// return result; -// #else -// while (!terminateRequested) { -// -// bool ok = m_connection.connectStart(keywords, values); -// auto start = std::chrono::steady_clock::now(); -// if (ok && m_connection.status() != CONNECTION_BAD) { -// int sock = m_connection.socket(); -// Win32Event socket_event(Win32Event::Reset::Auto, Win32Event::Initial::Clear); -// -// long fd = FD_WRITE; -// while (true) { -// // poll till complete or failed (we can get an abort command) -// WSAEventSelect(sock, socket_event.handle(), fd); -// WaitHandleList whl; -// auto wait_result_socket_event = whl.add(socket_event); -// //auto wait_result_stop = whl.add(m_stopEvent); -// -// auto nu = std::chrono::steady_clock::now(); -// std::chrono::duration diff = -(nu-start); -// diff += 30s; -// DWORD timeout = diff.count(); -// -// DWORD res = MsgWaitForMultipleObjectsEx( -// whl.count(), // _In_ DWORD nCount, -// whl, // _In_ const HANDLE *pHandles, -// timeout, // _In_ DWORD dwMilliseconds, -// 0, // _In_ DWORD dwWakeMask, -// 0 // _In_ DWORD dwFlags -// ); -// if (res == wait_result_socket_event) { -// auto poll_state = m_connection.connectPoll(); -// if (poll_state == PGRES_POLLING_OK) { -// // if connected return true -// doStateCallback(State::Connected); -// return true; -// } -// else if (poll_state == PGRES_POLLING_FAILED) { -// doStateCallback(State::NotConnected); -// return false; -// } -// else if (poll_state == PGRES_POLLING_READING) { -// doStateCallback(State::Connecting); -// fd = FD_READ; -// } -// else if (poll_state == PGRES_POLLING_WRITING) { -// doStateCallback(State::Connecting); -// fd = FD_WRITE; -// } -// } -// else if (res == wait_result_stop) { -// -// } -// } // end while (true) -// } -// } -// return false; -// #endif -// } -// -// void ASyncDBConnection::Thread::communicate() -// { -// while (!terminateRequested) { -// // wait for something to do: -// // - command to send to server -// // - wait for results and (notifies can also come in) -// // - pass each result on to the completion routine -// // - notify comming in from the server -// // - pass to notify callback -// // - connection raises an error -// // - return -// // - stop signal -// // - return -// -// -// if (m_state == State::Connected) { -// waitForAndSendCommand(); -// } -// else if (m_state == State::QuerySend || m_state == State::CancelSend) { -// // Wait for result, even after a cancel we should wait, for all results -// // New command's are not excepted when one has been send -// waitForResult(); -// } -// -// } -// } -// -// void ASyncDBConnection::Thread::stop() -// { -// terminateRequested = true; -// //m_stopEvent.set(); -// } - -// void ASyncDBConnection::Thread::doStateCallback(State state) -// { -// m_state = state; -// std::lock_guard lg(m_stateCallback.m_mutex); -// if (m_stateCallback.m_func) { -// m_stateCallback.m_func(state); -// } -// } - -// void ASyncDBConnection::Thread::waitForAndSendCommand() -// { -// using namespace std::chrono_literals; -// // lock the data -// std::unique_lock lk(m_commandQueue.m_mutex); -// if (m_commandQueue.m_queue.empty()) { -// // no data wait till there is data -// m_commandQueue.m_newEvent.wait_for(lk, 1000ms); -// // can we use the predicate to reimplement the stop function???, []{return ready;}); -// -// } -// doNewCommand(); -// -// #if false -// WaitHandleList whl; -// auto wait_result_new_command = whl.add(m_commandQueue.m_newEvent); -// //auto wait_result_stop = -// //whl.add(m_stopEvent); -// -// DWORD res = MsgWaitForMultipleObjectsEx( -// whl.count(), // _In_ DWORD nCount, -// whl, // _In_ const HANDLE *pHandles, -// INFINITE, // _In_ DWORD dwMilliseconds, -// 0, // _In_ DWORD dwWakeMask, -// 0 // _In_ DWORD dwFlags -// ); -// if (res == wait_result_new_command) { -// doNewCommand(); -// } -// // if (res == wait_result_stop) return; -// #endif -// } - -// void ASyncDBConnection::Thread::doNewCommand() -// { -// // get command from top of queue (but leave it in the queue, we need the callback) -// if (! m_commandQueue.m_queue.empty()) { -// const Command &command = m_commandQueue.m_queue.front(); -// if (!command.command.empty()) { -// bool query_send = false; -// if (command.params.empty()) -// query_send = m_connection.sendQuery(command.command.c_str()); -// else -// query_send = m_connection.sendQueryParams(command.command.c_str(), command.params); -// -// if (query_send) { -// m_timer.start(); -// doStateCallback(State::QuerySend); -// } -// else { -// std::string error = m_connection.getErrorMessage(); -// // todo: need to report the error -// } -// } -// } -// -// } - -// bool ASyncDBConnection::Thread::consumeResultInput() -// { -// bool finished = false; -// if (m_connection.consumeInput()) { -// while ( ! finished && ! m_connection.isBusy()) { -// auto res(m_connection.getResult()); -// { -// qint64 ms = m_timer.restart(); -// std::lock_guard lg(m_commandQueue.m_mutex); -// m_commandQueue.m_queue.front().on_result(res, ms); -// if (res == nullptr) { -// m_timer.invalidate(); -// m_commandQueue.m_queue.pop(); -// doStateCallback(State::Connected); -// finished = true; -// } -// } -// -// } -// // else is still waiting for more data -// -// } -// else { -// // error during consume -// -// } -// return finished; -// } - -// void ASyncDBConnection::Thread::waitForResult() -// { -// int sock = m_connection.socket(); -// -// fd_set readfds; -// timeval timeout; -// bool finished = false; -// while (!finished && !terminateRequested) { -// FD_ZERO(&readfds); -// FD_SET(sock, &readfds); -// -// timeout.tv_sec = 5; -// timeout.tv_usec = 0; -// -// int select_result = select(sock + 1, &readfds, nullptr, nullptr, &timeout); -// if (select_result > 0) { -// if (FD_ISSET(sock, &readfds)) { -// if (consumeResultInput()) { -// finished = true; -// } -// } -// } -// -// } -// } - -/* -*/ diff --git a/pglab/ASyncDBConnection.h b/pglab/ASyncDBConnection.h index 622f41e..4d16f54 100644 --- a/pglab/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -38,7 +38,6 @@ public: ~ASyncDBConnection(); State state() const; -// void setupConnection(const std::string &connstring); void setupConnection(const ConnectionConfig &config); void closeConnection(); @@ -77,88 +76,6 @@ private: void async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result); void doStateCallback(State state); void processNotice(const PGresult *result); - -// class Command { -// public: -// std::string command; -// Pgsql::Params params; -// on_result_callback on_result; -// -// Command() = default; -// Command(const std::string &cmd, on_result_callback cb) -// : command(cmd), on_result(cb) -// {} -// Command(const std::string &cmd, Pgsql::Params &&p, on_result_callback cb) -// : command(cmd), params(p), on_result(cb) -// {} -// }; -// -// /// Contains all the members accessed by the thread -// class Thread { -// public: -// using t_CommandQueue = std::queue; -// struct { -// std::mutex m_mutex; -// on_state_callback m_func; -// } m_stateCallback; -// struct { -// std::mutex m_mutex; -// on_notice_callback m_func; -// } m_noticeCallback; -// -// struct t_Command { -// std::mutex m_mutex; -// t_CommandQueue m_queue; -// std::condition_variable m_newEvent; -// t_Command() -// {} -// } m_commandQueue; -// -// // std::string m_initString; -// ConnectionConfig m_config; -// State m_state = State::NotConnected; -// -// Thread(); -// -// /// Is started as a seperate thread by ASyncDBConnection -// void run(); -// -// /// Sends a cancel request to the DB server -// bool cancel(); -// -// void stop(); -// -// private: -// -// /// \todo Implement new method to stop the thread -// //Win32Event m_stopEvent; -// Pgsql::Connection m_connection; -// bool terminateRequested = false; ///< is set when the thread should stop -// bool m_terminated = true; -// Pgsql::Canceller m_canceller; -// QElapsedTimer m_timer; -// -// -// bool makeConnection(); -// void communicate(); -// -// void doStateCallback(State state); -// /// Wait's for a command to come in and send's it to the server -// void waitForAndSendCommand(); -// void doNewCommand(); -// void waitForResult(); -// -// -// void processNotice(const PGresult *result); -// /** Function to call when after sending a command the socket is ready for reading. -// * -// * It might take several consumes before all data is read. -// */ -// bool consumeResultInput(); -// }; -// -// Thread m_threadData; -// std::thread m_thread; }; #endif // ASYNCDBCONNECTION_H diff --git a/pglab/waithandlelist.cpp b/pglab/waithandlelist.cpp deleted file mode 100644 index e8f507a..0000000 --- a/pglab/waithandlelist.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "waithandlelist.h" -#include "win32event.h" - -#ifdef _WIN32 -WaitHandleList::WaitHandleList() = default; -WaitHandleList::~WaitHandleList() = default; - -WaitResultValue WaitHandleList::add(HANDLE h) -{ - m_waitHandles.push_back(h); - return WAIT_OBJECT_0 + static_cast(m_waitHandles.size() - 1); -} - -WaitResultValue WaitHandleList::add(Win32Event &e) -{ - return add(e.handle()); -} - -DWORD WaitHandleList::count() const -{ - return static_cast(m_waitHandles.size()); -} - -void WaitHandleList::clear() -{ - m_waitHandles.clear(); -} - -WaitHandleList::operator const HANDLE*() const -{ - return m_waitHandles.data(); -} - -#endif diff --git a/pglab/waithandlelist.h b/pglab/waithandlelist.h deleted file mode 100644 index 38852b6..0000000 --- a/pglab/waithandlelist.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef WAITHANDLELIST_H -#define WAITHANDLELIST_H - -#ifdef _WIN32 -#include -#include - -class Win32Event; - -using WaitResultValue = DWORD; - -class WaitHandleList { -public: - WaitHandleList(); - ~WaitHandleList(); - - WaitResultValue add(HANDLE h); - WaitResultValue add(Win32Event &e); - DWORD count() const; - void clear(); - operator const HANDLE*() const; - -private: - std::vector m_waitHandles; -}; -#endif // _WIN32 - -#endif // WAITHANDLELIST_H diff --git a/pglab/win32event.cpp b/pglab/win32event.cpp deleted file mode 100644 index 3c3625d..0000000 --- a/pglab/win32event.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "win32event.h" diff --git a/pglab/win32event.h b/pglab/win32event.h deleted file mode 100644 index d197556..0000000 --- a/pglab/win32event.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef WIN32EVENT_H -#define WIN32EVENT_H - -#ifdef _WIN32 - -#include -#include -/** Simpel wrapper around a Win32 Event object. - -Mostly to make cleanup automatic.*/ -class Win32Event { -public: - enum class Reset { Auto=0, Manual=1 }; - enum class Initial { Clear=0, Set=1 }; - - Win32Event(Reset r, Initial is) - : hEvent(CreateEvent( - nullptr, // _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, - BOOL(r), // _In_ BOOL bManualReset, - BOOL(is), // _In_ BOOL bInitialState, - nullptr //_In_opt_ LPCTSTR lpName - )) - {} - - Win32Event(Reset r, Initial is, int sock, long net_events) - : Win32Event(r, is) - { - WSAEventSelect(sock, hEvent, net_events); - } - - ~Win32Event() - { - CloseHandle(hEvent); - } - - Win32Event(const Win32Event &) = delete; - Win32Event &operator=(const Win32Event &) = delete; - - void set() { SetEvent(hEvent); } - - void reset() { ResetEvent(hEvent); } - - HANDLE handle() { return hEvent; } -private: - HANDLE hEvent; -}; -#endif // _WIN32 - -#endif // WIN32EVENT_H From 243f1c0a42adb3dd5ef2bb21b243f52237219617 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 11:44:40 +0200 Subject: [PATCH 11/34] Renamed PgsqlDatabaseCatalogue to PgDatabaseCatalogue so name is consistend with other related classes. --- BUILD | 5 + CMakeLists.txt | 2 +- pglab/BackupDialog.cpp | 7 +- pglab/DatabasesTableModel.cpp | 6 +- pglab/DatabasesTableModel.h | 8 +- pglab/OpenDatabase.cpp | 8 +- pglab/OpenDatabase.h | 8 +- pglab/PgAuthIdContainer.cpp | 6 +- pglab/PgAuthIdContainer.h | 4 +- pglab/PgContainer.h | 8 +- ...eCatalogue.cpp => PgDatabaseCatalogue.cpp} | 28 +-- ...abaseCatalogue.h => PgDatabaseCatalogue.h} | 12 +- pglab/PgDatabaseContainer.cpp | 4 +- pglab/PgDatabaseContainer.h | 4 +- pglab/PgTypeContainer.cpp | 4 +- pglab/PgTypeContainer.h | 4 +- pglab/Pgsql_Connection.cpp | 206 +++++++++++++++++ pglab/Pgsql_Connection.h | 217 ++++++++++++++++++ pglab/Pgsql_Value.h | 3 +- pglab/QueryTab.cpp | 4 +- pglab/ServerWindow.cpp | 4 +- 21 files changed, 491 insertions(+), 61 deletions(-) rename pglab/{PgsqlDatabaseCatalogue.cpp => PgDatabaseCatalogue.cpp} (67%) rename pglab/{PgsqlDatabaseCatalogue.h => PgDatabaseCatalogue.h} (74%) create mode 100644 pglab/Pgsql_Connection.cpp create mode 100644 pglab/Pgsql_Connection.h diff --git a/BUILD b/BUILD index 017087d..3f4f16a 100644 --- a/BUILD +++ b/BUILD @@ -4,6 +4,7 @@ If it doesn't detect Qt CMAKE_PREFIX_PATH needs to be set export CMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake Dependencies: +- boost (asio, system, ???) - Botan-2 - libpq - Qt5 @@ -11,3 +12,7 @@ Dependencies: - jsoncpp (included) + +On ubuntu + +sudo apt install libpq-dev libboost1.63-all-dev diff --git a/CMakeLists.txt b/CMakeLists.txt index afeb4c9..0aff6ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,11 +90,11 @@ add_executable(pglab pglab/PgAuthIdContainer.cpp pglab/PgAuthId.cpp pglab/PgClass.cpp + pglab/PgDatabaseCatalogue.cpp pglab/PgDatabaseContainer.cpp pglab/PgDatabase.cpp pglab/PgNamespace.cpp pglab/PgsqlConn.cpp - pglab/PgsqlDatabaseCatalogue.cpp pglab/Pgsql_Params.cpp pglab/Pgsql_Result.cpp pglab/Pgsql_Row.cpp diff --git a/pglab/BackupDialog.cpp b/pglab/BackupDialog.cpp index a5be3e2..dd6062c 100644 --- a/pglab/BackupDialog.cpp +++ b/pglab/BackupDialog.cpp @@ -170,7 +170,8 @@ void BackupDialog::on_btnStart_clicked() { ui->stdOutput->clear(); - QString program = R"-(C:\Prog\bigsql\pg96\bin\pg_dump.exe)-"; + //QString program = R"-(C:\Prog\bigsql\pg96\bin\pg_dump.exe)-"; + QString program = "/usr/bin/pg_dump"; QStringList arguments; setParams(arguments); @@ -228,11 +229,11 @@ void BackupDialog::on_btnStart_clicked() // We use the systemEnvironment as a sane default. Then we let the connection overwrite all PG variables in it. QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); m_config.writeToEnvironment(env); - env.insert("SESSIONNAME", "Console"); + //env.insert("SESSIONNAME", "Console"); auto p = new QProcess(this); ConnectTo(p); p->setProcessEnvironment(env); -#ifdef _WIN32 +#ifdef WIN32 p->setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; diff --git a/pglab/DatabasesTableModel.cpp b/pglab/DatabasesTableModel.cpp index 864625e..0047af1 100644 --- a/pglab/DatabasesTableModel.cpp +++ b/pglab/DatabasesTableModel.cpp @@ -1,5 +1,5 @@ -#include "DatabasesTableModel.h" -#include "PgsqlDatabaseCatalogue.h" +#include "DatabasesTableModel.h" +#include "PgDatabaseCatalogue.h" #include "PgDatabaseContainer.h" #include "PgAuthIdContainer.h" @@ -8,7 +8,7 @@ DatabasesTableModel::DatabasesTableModel(QObject *parent) { } -void DatabasesTableModel::setDatabaseList(const PgsqlDatabaseCatalogue* cat) +void DatabasesTableModel::setDatabaseList(const PgDatabaseCatalogue* cat) { beginResetModel(); m_catalog = cat; diff --git a/pglab/DatabasesTableModel.h b/pglab/DatabasesTableModel.h index 55cde5d..cc15528 100644 --- a/pglab/DatabasesTableModel.h +++ b/pglab/DatabasesTableModel.h @@ -1,10 +1,10 @@ -#ifndef DATABASESTABLEMODEL_H +#ifndef DATABASESTABLEMODEL_H #define DATABASESTABLEMODEL_H #include class PgDatabaseContainer; -class PgsqlDatabaseCatalogue; +class PgDatabaseCatalogue; /** Class for displaying the list of databases of a server in a QTableView * @@ -22,7 +22,7 @@ public: explicit DatabasesTableModel(QObject *parent); - void setDatabaseList(const PgsqlDatabaseCatalogue* cat); + void setDatabaseList(const PgDatabaseCatalogue* cat); // Header: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; @@ -34,7 +34,7 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; private: - const PgsqlDatabaseCatalogue *m_catalog = nullptr; + const PgDatabaseCatalogue *m_catalog = nullptr; const PgDatabaseContainer *m_databases = nullptr; }; diff --git a/pglab/OpenDatabase.cpp b/pglab/OpenDatabase.cpp index 56b1991..027b33b 100644 --- a/pglab/OpenDatabase.cpp +++ b/pglab/OpenDatabase.cpp @@ -1,5 +1,5 @@ -#include "OpenDatabase.h" -#include "PgsqlDatabaseCatalogue.h" +#include "OpenDatabase.h" +#include "PgDatabaseCatalogue.h" #include "PgsqlConn.h" #include "TypeSelectionItemModel.h" @@ -17,7 +17,7 @@ Expected OpenDatabase::createOpenDatabase(const ConnectionConfig OpenDatabase::OpenDatabase(const ConnectionConfig& cfg, QObject *parent) : QObject(parent) , m_config(cfg) - , m_catalogue(new PgsqlDatabaseCatalogue) + , m_catalogue(new PgDatabaseCatalogue) { } @@ -37,7 +37,7 @@ bool OpenDatabase::Init() return true; } -PgsqlDatabaseCatalogue* OpenDatabase::catalogue() +PgDatabaseCatalogue* OpenDatabase::catalogue() { return m_catalogue; } diff --git a/pglab/OpenDatabase.h b/pglab/OpenDatabase.h index 871ea5a..4e1bd39 100644 --- a/pglab/OpenDatabase.h +++ b/pglab/OpenDatabase.h @@ -1,11 +1,11 @@ -#ifndef OPENDATABASE_H +#ifndef OPENDATABASE_H #define OPENDATABASE_H #include #include "ConnectionConfig.h" #include "Expected.h" -class PgsqlDatabaseCatalogue; +class PgDatabaseCatalogue; class TypeSelectionItemModel; /** Instances of this class represent a single database on which atleast one @@ -21,7 +21,7 @@ public: OpenDatabase& operator=(const OpenDatabase &) = delete; ~OpenDatabase(); - PgsqlDatabaseCatalogue* catalogue(); + PgDatabaseCatalogue* catalogue(); TypeSelectionItemModel* typeSelectionModel(); signals: @@ -29,7 +29,7 @@ public slots: private: ConnectionConfig m_config; - PgsqlDatabaseCatalogue *m_catalogue; + PgDatabaseCatalogue *m_catalogue; TypeSelectionItemModel *m_typeSelectionModel = nullptr; diff --git a/pglab/PgAuthIdContainer.cpp b/pglab/PgAuthIdContainer.cpp index 3859a41..f39dac3 100644 --- a/pglab/PgAuthIdContainer.cpp +++ b/pglab/PgAuthIdContainer.cpp @@ -1,8 +1,8 @@ -#include "PgAuthIdContainer.h" +#include "PgAuthIdContainer.h" #include "PgsqlConn.h" -#include "PgsqlDatabaseCatalogue.h" +#include "PgDatabaseCatalogue.h" -PgAuthIdContainer::PgAuthIdContainer(PgsqlDatabaseCatalogue *cat) +PgAuthIdContainer::PgAuthIdContainer(PgDatabaseCatalogue *cat) : PgContainer(cat) {} diff --git a/pglab/PgAuthIdContainer.h b/pglab/PgAuthIdContainer.h index 8787933..455681e 100644 --- a/pglab/PgAuthIdContainer.h +++ b/pglab/PgAuthIdContainer.h @@ -1,4 +1,4 @@ -#ifndef PGAUTHIDCONTAINER_H +#ifndef PGAUTHIDCONTAINER_H #define PGAUTHIDCONTAINER_H #include @@ -14,7 +14,7 @@ namespace Pgsql { class PgAuthIdContainer: public PgContainer { public: - explicit PgAuthIdContainer(PgsqlDatabaseCatalogue *cat); + explicit PgAuthIdContainer(PgDatabaseCatalogue *cat); std::string getLoadQuery() const; void load(const Pgsql::Result &res); diff --git a/pglab/PgContainer.h b/pglab/PgContainer.h index ecde222..21e9e0d 100644 --- a/pglab/PgContainer.h +++ b/pglab/PgContainer.h @@ -1,18 +1,18 @@ -#ifndef PGCONTAINER_H +#ifndef PGCONTAINER_H #define PGCONTAINER_H #include #include #include -class PgsqlDatabaseCatalogue; +class PgDatabaseCatalogue; template class PgContainer { public: using t_Container = std::vector; ///< Do not assume it will stay a vector only expect bidirectional access - explicit PgContainer(PgsqlDatabaseCatalogue *cat) + explicit PgContainer(PgDatabaseCatalogue *cat) : m_catalogue(cat) {} @@ -60,7 +60,7 @@ public: return m_container.at(idx); } protected: - PgsqlDatabaseCatalogue *m_catalogue; + PgDatabaseCatalogue *m_catalogue; t_Container m_container; private: T m_invalidInstance; diff --git a/pglab/PgsqlDatabaseCatalogue.cpp b/pglab/PgDatabaseCatalogue.cpp similarity index 67% rename from pglab/PgsqlDatabaseCatalogue.cpp rename to pglab/PgDatabaseCatalogue.cpp index fafe34e..5f00aa7 100644 --- a/pglab/PgsqlDatabaseCatalogue.cpp +++ b/pglab/PgDatabaseCatalogue.cpp @@ -1,11 +1,11 @@ -#include "PgsqlDatabaseCatalogue.h" +#include "PgDatabaseCatalogue.h" #include "PgTypeContainer.h" #include "PgDatabaseContainer.h" #include "PgAuthIdContainer.h" #include "PgsqlConn.h" -QString getRoleNameFromOid(const PgsqlDatabaseCatalogue *cat, Oid oid) +QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid) { QString name; const PgAuthIdContainer *auth_ids = cat->authIds(); @@ -18,23 +18,23 @@ QString getRoleNameFromOid(const PgsqlDatabaseCatalogue *cat, Oid oid) return name; } -PgsqlDatabaseCatalogue::PgsqlDatabaseCatalogue() +PgDatabaseCatalogue::PgDatabaseCatalogue() { } -PgsqlDatabaseCatalogue::~PgsqlDatabaseCatalogue() +PgDatabaseCatalogue::~PgDatabaseCatalogue() { delete m_types; } -void PgsqlDatabaseCatalogue::loadAll(Pgsql::Connection &conn) +void PgDatabaseCatalogue::loadAll(Pgsql::Connection &conn) { loadTypes(conn); loadDatabases(conn); loadAuthIds(conn); } -void PgsqlDatabaseCatalogue::loadInfo(Pgsql::Connection &conn) +void PgDatabaseCatalogue::loadInfo(Pgsql::Connection &conn) { Pgsql::Result r = conn.query("SHOW server_version_num"); if (r && r.resultStatus() == PGRES_TUPLES_OK) @@ -47,7 +47,7 @@ void PgsqlDatabaseCatalogue::loadInfo(Pgsql::Connection &conn) m_serverVersionString = r.get(0, 0).asQString(); } -void PgsqlDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) +void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) { if (m_types == nullptr) m_types = new PgTypeContainer(this); @@ -61,7 +61,7 @@ void PgsqlDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) } -void PgsqlDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) +void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) { if (m_databases == nullptr) m_databases = new PgDatabaseContainer(this); @@ -75,7 +75,7 @@ void PgsqlDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) throw std::runtime_error("Query failed"); } -void PgsqlDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) +void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) { if (m_authIds == nullptr) m_authIds = new PgAuthIdContainer(this); @@ -88,27 +88,27 @@ void PgsqlDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) throw std::runtime_error("Query failed"); } -const QString& PgsqlDatabaseCatalogue::serverVersionString() const +const QString& PgDatabaseCatalogue::serverVersionString() const { return m_serverVersionString; } -int PgsqlDatabaseCatalogue::serverVersion() const +int PgDatabaseCatalogue::serverVersion() const { return m_serverVersion; } -const PgTypeContainer* PgsqlDatabaseCatalogue::types() const +const PgTypeContainer* PgDatabaseCatalogue::types() const { return m_types; } -const PgDatabaseContainer *PgsqlDatabaseCatalogue::databases() const +const PgDatabaseContainer *PgDatabaseCatalogue::databases() const { return m_databases; } -const PgAuthIdContainer *PgsqlDatabaseCatalogue::authIds() const +const PgAuthIdContainer *PgDatabaseCatalogue::authIds() const { return m_authIds; } diff --git a/pglab/PgsqlDatabaseCatalogue.h b/pglab/PgDatabaseCatalogue.h similarity index 74% rename from pglab/PgsqlDatabaseCatalogue.h rename to pglab/PgDatabaseCatalogue.h index 0357237..1911708 100644 --- a/pglab/PgsqlDatabaseCatalogue.h +++ b/pglab/PgDatabaseCatalogue.h @@ -15,13 +15,13 @@ class PgTypeContainer; class PgDatabaseContainer; class PgAuthIdContainer; -class PgsqlDatabaseCatalogue { +class PgDatabaseCatalogue { public: - PgsqlDatabaseCatalogue(); - PgsqlDatabaseCatalogue(const PgsqlDatabaseCatalogue&) = delete; - PgsqlDatabaseCatalogue& operator = (const PgsqlDatabaseCatalogue&) = delete; + PgDatabaseCatalogue(); + PgDatabaseCatalogue(const PgDatabaseCatalogue&) = delete; + PgDatabaseCatalogue& operator = (const PgDatabaseCatalogue&) = delete; - ~PgsqlDatabaseCatalogue(); + ~PgDatabaseCatalogue(); void loadAll(Pgsql::Connection &conn); @@ -44,6 +44,6 @@ private: PgAuthIdContainer *m_authIds = nullptr; }; -QString getRoleNameFromOid(const PgsqlDatabaseCatalogue *cat, Oid oid); +QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid); #endif // PGSQLDATABASECATALOGUE_H diff --git a/pglab/PgDatabaseContainer.cpp b/pglab/PgDatabaseContainer.cpp index 927d93d..e0a5977 100644 --- a/pglab/PgDatabaseContainer.cpp +++ b/pglab/PgDatabaseContainer.cpp @@ -1,7 +1,7 @@ -#include "PgDatabaseContainer.h" +#include "PgDatabaseContainer.h" #include "PgsqlConn.h" -PgDatabaseContainer::PgDatabaseContainer(PgsqlDatabaseCatalogue *cat) +PgDatabaseContainer::PgDatabaseContainer(PgDatabaseCatalogue *cat) : PgContainer(cat) {} diff --git a/pglab/PgDatabaseContainer.h b/pglab/PgDatabaseContainer.h index c2b711e..d49c4f0 100644 --- a/pglab/PgDatabaseContainer.h +++ b/pglab/PgDatabaseContainer.h @@ -1,4 +1,4 @@ -#ifndef PGDATABASECONTAINER_H +#ifndef PGDATABASECONTAINER_H #define PGDATABASECONTAINER_H #include @@ -14,7 +14,7 @@ namespace Pgsql { class PgDatabaseContainer: public PgContainer { public: - explicit PgDatabaseContainer(PgsqlDatabaseCatalogue *cat); + explicit PgDatabaseContainer(PgDatabaseCatalogue *cat); std::string getLoadQuery() const; void load(const Pgsql::Result &res); diff --git a/pglab/PgTypeContainer.cpp b/pglab/PgTypeContainer.cpp index 652ef3d..fc10f7a 100644 --- a/pglab/PgTypeContainer.cpp +++ b/pglab/PgTypeContainer.cpp @@ -1,8 +1,8 @@ -#include "PgTypeContainer.h" +#include "PgTypeContainer.h" #include "PgsqlConn.h" #include -PgTypeContainer::PgTypeContainer(PgsqlDatabaseCatalogue *cat) +PgTypeContainer::PgTypeContainer(PgDatabaseCatalogue *cat) : PgContainer(cat) {} diff --git a/pglab/PgTypeContainer.h b/pglab/PgTypeContainer.h index d7f059c..af2cf84 100644 --- a/pglab/PgTypeContainer.h +++ b/pglab/PgTypeContainer.h @@ -1,4 +1,4 @@ -#ifndef PGTYPECONTAINER_H +#ifndef PGTYPECONTAINER_H #define PGTYPECONTAINER_H #include @@ -15,7 +15,7 @@ class PgTypeContainer: public PgContainer { public: // using t_Types = std::vector; ///< Do not assume it will stay a vector only expect bidirectional access - explicit PgTypeContainer(PgsqlDatabaseCatalogue *cat); + explicit PgTypeContainer(PgDatabaseCatalogue *cat); // t_Types::const_iterator begin() const { return m_types.begin(); } // t_Types::const_iterator end() const { return m_types.end(); } diff --git a/pglab/Pgsql_Connection.cpp b/pglab/Pgsql_Connection.cpp new file mode 100644 index 0000000..78b37d5 --- /dev/null +++ b/pglab/Pgsql_Connection.cpp @@ -0,0 +1,206 @@ +#include "PgsqlConn.h" +#include "Pgsql_declare.h" +#include "Pgsql_Params.h" +#include + + +using namespace Pgsql; + + + + +Canceller::Canceller(PGcancel *c) + : m_cancel(c) +{} + +Canceller::Canceller(Canceller&& rhs) + : m_cancel(rhs.m_cancel) +{ + rhs.m_cancel = nullptr; +} + +Canceller& Canceller::operator=(Canceller&& rhs) +{ + if (m_cancel) { + PQfreeCancel(m_cancel); + } + m_cancel = rhs.m_cancel; + rhs.m_cancel = nullptr; + return *this; +} + +Canceller::~Canceller() +{ + if (m_cancel) { + PQfreeCancel(m_cancel); + } +} + +bool Canceller::cancel(std::string *error) +{ + const int errbuf_size = 256; + char errbuf[errbuf_size]; + bool res = PQcancel(m_cancel, errbuf, errbuf_size); + if (!res && error) { + *error = errbuf; + } + return res; +} + + + +Connection::Connection() = default; + +Connection::~Connection() +{ + close(); +} + +Connection::Connection(Connection &&rhs) + : conn(rhs.conn) +{ + rhs.conn = nullptr; +} + +Connection& Connection::operator=(Connection &&rhs) +{ + close(); + conn = rhs.conn; + rhs.conn = nullptr; + return *this; +} + +void Connection::close() +{ + if (conn) { + PQfinish(conn); + conn = nullptr; + } +} + +Canceller Connection::getCancel() +{ + Canceller c(PQgetCancel(conn)); + return c; +} + +bool Connection::connect(const char *params) +{ + bool result = false; + conn = PQconnectdb(params); + if (conn) { + ConnStatusType status = PQstatus(conn); + result = (status == CONNECTION_OK); + } + return result; +} + +bool Connection::connect(const char *const * keywords, const char* const * values, int expand_dbname) +{ + bool result = false; + conn = PQconnectdbParams(keywords, values, expand_dbname); + if (conn) { + ConnStatusType status = PQstatus(conn); + result = (status == CONNECTION_OK); + } + return result; +} + +bool Connection::connectStart(const char* params) +{ + conn = PQconnectStart(params); + return conn != nullptr; +} + +bool Connection::connectStart(const char * const *keywords, + const char * const *values) +{ + conn = PQconnectStartParams(keywords, values, 0); + return conn != nullptr; +} + +PostgresPollingStatusType Connection::connectPoll() +{ + return PQconnectPoll(conn); +} + +ConnStatusType Connection::status() +{ + return PQstatus(conn); +} + +int Connection::socket() +{ + return PQsocket(conn); +} + +std::string Connection::getErrorMessage() const +{ + std::string result; + if (conn) { + result = PQerrorMessage(conn); + } + else { + result = "no connection"; + } + return result; +} + +Result Connection::query(const char * command) +{ + PGresult *result = PQexec(conn, command); + return Result(result); +} + + +bool Connection::sendQuery(const char *query) +{ + int res = PQsendQuery(conn, query); + return res == 1; +} + +bool Connection::sendQueryParams(const char * command, const Params ¶ms) +{ + int res = PQsendQueryParams(conn, command, params.size(), params.types(), + params.values(), params.lengths(), params.formats(), + 0); // text format + + return res == 1; +} + +std::shared_ptr Connection::getResult() +{ + PGresult *r = PQgetResult(conn); + if (r) { + return std::make_shared(r); + } + else { + return nullptr; + } +} + +bool Connection::consumeInput() +{ + int res = PQconsumeInput(conn); + return res == 1; +} + +bool Connection::isBusy() +{ + int res = PQisBusy(conn); + return res == 1; +} + +void Connection::setNoticeReceiver(std::function callback) +{ + notifyReceiver = callback; + PQsetNoticeReceiver(conn, + Connection::notifyReceiveFunc + , reinterpret_cast(this)); +} + +void Connection::notifyReceiveFunc(void *arg, const PGresult *result) +{ + Connection *c = reinterpret_cast(arg); + c->notifyReceiver(result); +} diff --git a/pglab/Pgsql_Connection.h b/pglab/Pgsql_Connection.h new file mode 100644 index 0000000..74dbf1c --- /dev/null +++ b/pglab/Pgsql_Connection.h @@ -0,0 +1,217 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "Pgsql_Result.h" + +namespace Pgsql { + + class Connection; + /* + This library has multiple layers. + + Layer 1 delivers lowlevel C++ wrappers for the basic libpq functionality. Adding + automatic resource management. + + */ + +// class ConnectionParams { +// public: +// std::string host; +// std::string hostaddr; +// unsigned short port = 5432; +// std::string dbname; +// std::string user; +// std::string password; +// int connect_timeout = -1; ///< -1 omit (ie uses default) +// std::string application_name; + +// }; + + + + class Result; + class Params; + + + + + + /** \brief Wrapper for a cancel object from libpq. + */ + class Canceller { + public: + Canceller() = default; + Canceller(PGcancel *c); + Canceller(const Canceller&) = delete; + Canceller& operator=(const Canceller&) = delete; + Canceller(Canceller&& rhs); + Canceller& operator=(Canceller&& rhs); + ~Canceller(); + + bool cancel(std::string *error); + private: + PGcancel *m_cancel = nullptr; + }; + + /** \brief Class for connecting to the database. + * + * The class isolates the programmer from the worst C style parts + * of the libpq API but is mostly a very thin wrapper. + */ + class Connection { + public: + Connection(); + ~Connection(); + + Connection(const Connection &rhs) = delete; + Connection& operator=(const Connection &rhs) = delete; + + Connection(Connection &&rhs); + Connection& operator=(Connection &&rhs); + +// void connect(const ConnectionParams ¶ms); + bool connect(const char *params); + bool connect(const QString ¶ms) + { + return connect(params.toUtf8().data()); + } + bool connect(const char *const * keywords, const char* const * values, int expand_dbname); + + bool connectStart(const char *params); + + bool connectStart(const std::string ¶ms) + { + return connectStart(params.c_str()); + } + + bool connectStart(const QString ¶ms) + { + return connectStart(params.toUtf8().data()); + } + bool connectStart(const char * const *keywords, + const char * const *values); + + PostgresPollingStatusType connectPoll(); + ConnStatusType status(); + int socket(); + + void close(); + Canceller getCancel(); + + std::string getErrorMessage() const; + + Result query(const char * command); + Result query(const QString &command) + { + return query(command.toUtf8().data()); + } + + bool sendQuery(const char * query); + bool sendQuery(const std::string &command) + { + return sendQuery(command.c_str()); + } + bool sendQuery(const QString &command) + { + return sendQuery(command.toUtf8().data()); + } + + bool sendQueryParams(const char * command, const Params ¶ms); + + std::shared_ptr getResult(); + + bool consumeInput(); + bool isBusy(); + + void setNoticeReceiver(std::function callback); + private: + PGconn *conn = nullptr; + std::function notifyReceiver; + + static void notifyReceiveFunc(void *arg, const PGresult *result); + }; + + + + +// class Field { +// public: + +// std::string getName() const; + +// private: +// //Tuples tuples; +// int field; +// // + +// }; + +// class Tuples { +// public: +// int getRowCount() const; +// int getColCount() const; + +// Field getField(const std::string &fname); +// Field getField(const int idx); + +// class const_iterator { +// public: +// const_iterator& operator++(); +// }; + +// void rewind(); + + +// }; + +// class OkResult: public Result { +// public: +// /** If the result is a data result then returns an interface for processing this data. + +// The returned interface remains valid as long as this OkResult exists. +// */ +// Tuples* hasTuples(); +// }; + +// class ErrorResult: public Result { +// +// }; + +// class ITransaction { +// public: +// +// Canceller Query(std::string query, +// std::function on_success, +// std::function on_cancelled, +// std::function on_error); +// +// Canceller Query(std::string query, +// std::function on_success, +// std::function on_cancelled, +// std::function on_error); +// +// +// void Rollback( +// std::function on_success, +// std::function on_error); +// void Commit( +// std::function on_success, +// std::function on_cancelled, +// std::function on_error); +// +// }; +} + + + diff --git a/pglab/Pgsql_Value.h b/pglab/Pgsql_Value.h index 30da472..8b07046 100644 --- a/pglab/Pgsql_Value.h +++ b/pglab/Pgsql_Value.h @@ -41,7 +41,8 @@ namespace Pgsql { { s = static_cast(v); } - + + } // end namespace Pgsql #endif // PGSQL_VALUE_H diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index 7c5780a..432616f 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -1,4 +1,4 @@ -#include "QueryTab.h" +#include "QueryTab.h" #include "ui_QueryTab.h" #include "SqlSyntaxHighlighter.h" @@ -17,7 +17,7 @@ #include "MainWindow.h" #include "OpenDatabase.h" #include "PgTypeContainer.h" -#include "PgsqlDatabaseCatalogue.h" +#include "PgDatabaseCatalogue.h" #include "util.h" #include "GlobalIoService.h" diff --git a/pglab/ServerWindow.cpp b/pglab/ServerWindow.cpp index a08075e..0d2f6cb 100644 --- a/pglab/ServerWindow.cpp +++ b/pglab/ServerWindow.cpp @@ -1,9 +1,9 @@ -#include "ServerWindow.h" +#include "ServerWindow.h" #include "ui_ServerWindow.h" #include "OpenDatabase.h" #include "DatabasesTableModel.h" #include "RolesTableModel.h" -#include "PgsqlDatabaseCatalogue.h" +#include "PgDatabaseCatalogue.h" ServerWindow::ServerWindow(MasterController *master, QWidget *parent) : ASyncWindow(parent) From 869d8671916b25e0398e1aa7cd2db5524bb20160 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 11:45:50 +0200 Subject: [PATCH 12/34] Removed duplicates with old name adjusted includes to match new header name. --- CMakeLists.txt | 2 +- pglab/ASyncDBConnection.h | 2 +- pglab/MainWindow.h | 2 +- pglab/OpenDatabase.cpp | 2 +- pglab/PgAuthIdContainer.cpp | 2 +- pglab/PgDatabaseCatalogue.cpp | 2 +- pglab/PgDatabaseContainer.cpp | 2 +- pglab/PgType.cpp | 2 +- pglab/PgTypeContainer.cpp | 2 +- pglab/PgsqlConn.cpp | 206 -------------------------------- pglab/PgsqlConn.h | 217 ---------------------------------- pglab/Pgsql_Connection.cpp | 2 +- pglab/QueryResultModel.h | 2 +- 13 files changed, 11 insertions(+), 434 deletions(-) delete mode 100644 pglab/PgsqlConn.cpp delete mode 100644 pglab/PgsqlConn.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0aff6ba..044da69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,7 @@ add_executable(pglab pglab/PgDatabaseContainer.cpp pglab/PgDatabase.cpp pglab/PgNamespace.cpp - pglab/PgsqlConn.cpp + pglab/Pgsql_Connection.cpp pglab/Pgsql_Params.cpp pglab/Pgsql_Result.cpp pglab/Pgsql_Row.cpp diff --git a/pglab/ASyncDBConnection.h b/pglab/ASyncDBConnection.h index 4d16f54..6ddb358 100644 --- a/pglab/ASyncDBConnection.h +++ b/pglab/ASyncDBConnection.h @@ -1,7 +1,7 @@ #ifndef ASYNCDBCONNECTION_H #define ASYNCDBCONNECTION_H -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include "Pgsql_Params.h" #include "ConnectionConfig.h" #include diff --git a/pglab/MainWindow.h b/pglab/MainWindow.h index b1fa2cb..438b66f 100644 --- a/pglab/MainWindow.h +++ b/pglab/MainWindow.h @@ -9,7 +9,7 @@ #include #include #include -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include #include #include diff --git a/pglab/OpenDatabase.cpp b/pglab/OpenDatabase.cpp index 027b33b..f00cf5d 100644 --- a/pglab/OpenDatabase.cpp +++ b/pglab/OpenDatabase.cpp @@ -1,6 +1,6 @@ #include "OpenDatabase.h" #include "PgDatabaseCatalogue.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include "TypeSelectionItemModel.h" Expected OpenDatabase::createOpenDatabase(const ConnectionConfig &cfg) diff --git a/pglab/PgAuthIdContainer.cpp b/pglab/PgAuthIdContainer.cpp index f39dac3..6c3a4a7 100644 --- a/pglab/PgAuthIdContainer.cpp +++ b/pglab/PgAuthIdContainer.cpp @@ -1,5 +1,5 @@ #include "PgAuthIdContainer.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include "PgDatabaseCatalogue.h" PgAuthIdContainer::PgAuthIdContainer(PgDatabaseCatalogue *cat) diff --git a/pglab/PgDatabaseCatalogue.cpp b/pglab/PgDatabaseCatalogue.cpp index 5f00aa7..ca53c0c 100644 --- a/pglab/PgDatabaseCatalogue.cpp +++ b/pglab/PgDatabaseCatalogue.cpp @@ -2,7 +2,7 @@ #include "PgTypeContainer.h" #include "PgDatabaseContainer.h" #include "PgAuthIdContainer.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid) diff --git a/pglab/PgDatabaseContainer.cpp b/pglab/PgDatabaseContainer.cpp index e0a5977..ba5b729 100644 --- a/pglab/PgDatabaseContainer.cpp +++ b/pglab/PgDatabaseContainer.cpp @@ -1,5 +1,5 @@ #include "PgDatabaseContainer.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" PgDatabaseContainer::PgDatabaseContainer(PgDatabaseCatalogue *cat) : PgContainer(cat) diff --git a/pglab/PgType.cpp b/pglab/PgType.cpp index 7b19a7a..ba81860 100644 --- a/pglab/PgType.cpp +++ b/pglab/PgType.cpp @@ -1,5 +1,5 @@ #include "PgType.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" PgType::PgType() = default; diff --git a/pglab/PgTypeContainer.cpp b/pglab/PgTypeContainer.cpp index fc10f7a..311e112 100644 --- a/pglab/PgTypeContainer.cpp +++ b/pglab/PgTypeContainer.cpp @@ -1,5 +1,5 @@ #include "PgTypeContainer.h" -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include PgTypeContainer::PgTypeContainer(PgDatabaseCatalogue *cat) diff --git a/pglab/PgsqlConn.cpp b/pglab/PgsqlConn.cpp deleted file mode 100644 index 78b37d5..0000000 --- a/pglab/PgsqlConn.cpp +++ /dev/null @@ -1,206 +0,0 @@ -#include "PgsqlConn.h" -#include "Pgsql_declare.h" -#include "Pgsql_Params.h" -#include - - -using namespace Pgsql; - - - - -Canceller::Canceller(PGcancel *c) - : m_cancel(c) -{} - -Canceller::Canceller(Canceller&& rhs) - : m_cancel(rhs.m_cancel) -{ - rhs.m_cancel = nullptr; -} - -Canceller& Canceller::operator=(Canceller&& rhs) -{ - if (m_cancel) { - PQfreeCancel(m_cancel); - } - m_cancel = rhs.m_cancel; - rhs.m_cancel = nullptr; - return *this; -} - -Canceller::~Canceller() -{ - if (m_cancel) { - PQfreeCancel(m_cancel); - } -} - -bool Canceller::cancel(std::string *error) -{ - const int errbuf_size = 256; - char errbuf[errbuf_size]; - bool res = PQcancel(m_cancel, errbuf, errbuf_size); - if (!res && error) { - *error = errbuf; - } - return res; -} - - - -Connection::Connection() = default; - -Connection::~Connection() -{ - close(); -} - -Connection::Connection(Connection &&rhs) - : conn(rhs.conn) -{ - rhs.conn = nullptr; -} - -Connection& Connection::operator=(Connection &&rhs) -{ - close(); - conn = rhs.conn; - rhs.conn = nullptr; - return *this; -} - -void Connection::close() -{ - if (conn) { - PQfinish(conn); - conn = nullptr; - } -} - -Canceller Connection::getCancel() -{ - Canceller c(PQgetCancel(conn)); - return c; -} - -bool Connection::connect(const char *params) -{ - bool result = false; - conn = PQconnectdb(params); - if (conn) { - ConnStatusType status = PQstatus(conn); - result = (status == CONNECTION_OK); - } - return result; -} - -bool Connection::connect(const char *const * keywords, const char* const * values, int expand_dbname) -{ - bool result = false; - conn = PQconnectdbParams(keywords, values, expand_dbname); - if (conn) { - ConnStatusType status = PQstatus(conn); - result = (status == CONNECTION_OK); - } - return result; -} - -bool Connection::connectStart(const char* params) -{ - conn = PQconnectStart(params); - return conn != nullptr; -} - -bool Connection::connectStart(const char * const *keywords, - const char * const *values) -{ - conn = PQconnectStartParams(keywords, values, 0); - return conn != nullptr; -} - -PostgresPollingStatusType Connection::connectPoll() -{ - return PQconnectPoll(conn); -} - -ConnStatusType Connection::status() -{ - return PQstatus(conn); -} - -int Connection::socket() -{ - return PQsocket(conn); -} - -std::string Connection::getErrorMessage() const -{ - std::string result; - if (conn) { - result = PQerrorMessage(conn); - } - else { - result = "no connection"; - } - return result; -} - -Result Connection::query(const char * command) -{ - PGresult *result = PQexec(conn, command); - return Result(result); -} - - -bool Connection::sendQuery(const char *query) -{ - int res = PQsendQuery(conn, query); - return res == 1; -} - -bool Connection::sendQueryParams(const char * command, const Params ¶ms) -{ - int res = PQsendQueryParams(conn, command, params.size(), params.types(), - params.values(), params.lengths(), params.formats(), - 0); // text format - - return res == 1; -} - -std::shared_ptr Connection::getResult() -{ - PGresult *r = PQgetResult(conn); - if (r) { - return std::make_shared(r); - } - else { - return nullptr; - } -} - -bool Connection::consumeInput() -{ - int res = PQconsumeInput(conn); - return res == 1; -} - -bool Connection::isBusy() -{ - int res = PQisBusy(conn); - return res == 1; -} - -void Connection::setNoticeReceiver(std::function callback) -{ - notifyReceiver = callback; - PQsetNoticeReceiver(conn, - Connection::notifyReceiveFunc - , reinterpret_cast(this)); -} - -void Connection::notifyReceiveFunc(void *arg, const PGresult *result) -{ - Connection *c = reinterpret_cast(arg); - c->notifyReceiver(result); -} diff --git a/pglab/PgsqlConn.h b/pglab/PgsqlConn.h deleted file mode 100644 index 74dbf1c..0000000 --- a/pglab/PgsqlConn.h +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "Pgsql_Result.h" - -namespace Pgsql { - - class Connection; - /* - This library has multiple layers. - - Layer 1 delivers lowlevel C++ wrappers for the basic libpq functionality. Adding - automatic resource management. - - */ - -// class ConnectionParams { -// public: -// std::string host; -// std::string hostaddr; -// unsigned short port = 5432; -// std::string dbname; -// std::string user; -// std::string password; -// int connect_timeout = -1; ///< -1 omit (ie uses default) -// std::string application_name; - -// }; - - - - class Result; - class Params; - - - - - - /** \brief Wrapper for a cancel object from libpq. - */ - class Canceller { - public: - Canceller() = default; - Canceller(PGcancel *c); - Canceller(const Canceller&) = delete; - Canceller& operator=(const Canceller&) = delete; - Canceller(Canceller&& rhs); - Canceller& operator=(Canceller&& rhs); - ~Canceller(); - - bool cancel(std::string *error); - private: - PGcancel *m_cancel = nullptr; - }; - - /** \brief Class for connecting to the database. - * - * The class isolates the programmer from the worst C style parts - * of the libpq API but is mostly a very thin wrapper. - */ - class Connection { - public: - Connection(); - ~Connection(); - - Connection(const Connection &rhs) = delete; - Connection& operator=(const Connection &rhs) = delete; - - Connection(Connection &&rhs); - Connection& operator=(Connection &&rhs); - -// void connect(const ConnectionParams ¶ms); - bool connect(const char *params); - bool connect(const QString ¶ms) - { - return connect(params.toUtf8().data()); - } - bool connect(const char *const * keywords, const char* const * values, int expand_dbname); - - bool connectStart(const char *params); - - bool connectStart(const std::string ¶ms) - { - return connectStart(params.c_str()); - } - - bool connectStart(const QString ¶ms) - { - return connectStart(params.toUtf8().data()); - } - bool connectStart(const char * const *keywords, - const char * const *values); - - PostgresPollingStatusType connectPoll(); - ConnStatusType status(); - int socket(); - - void close(); - Canceller getCancel(); - - std::string getErrorMessage() const; - - Result query(const char * command); - Result query(const QString &command) - { - return query(command.toUtf8().data()); - } - - bool sendQuery(const char * query); - bool sendQuery(const std::string &command) - { - return sendQuery(command.c_str()); - } - bool sendQuery(const QString &command) - { - return sendQuery(command.toUtf8().data()); - } - - bool sendQueryParams(const char * command, const Params ¶ms); - - std::shared_ptr getResult(); - - bool consumeInput(); - bool isBusy(); - - void setNoticeReceiver(std::function callback); - private: - PGconn *conn = nullptr; - std::function notifyReceiver; - - static void notifyReceiveFunc(void *arg, const PGresult *result); - }; - - - - -// class Field { -// public: - -// std::string getName() const; - -// private: -// //Tuples tuples; -// int field; -// // - -// }; - -// class Tuples { -// public: -// int getRowCount() const; -// int getColCount() const; - -// Field getField(const std::string &fname); -// Field getField(const int idx); - -// class const_iterator { -// public: -// const_iterator& operator++(); -// }; - -// void rewind(); - - -// }; - -// class OkResult: public Result { -// public: -// /** If the result is a data result then returns an interface for processing this data. - -// The returned interface remains valid as long as this OkResult exists. -// */ -// Tuples* hasTuples(); -// }; - -// class ErrorResult: public Result { -// -// }; - -// class ITransaction { -// public: -// -// Canceller Query(std::string query, -// std::function on_success, -// std::function on_cancelled, -// std::function on_error); -// -// Canceller Query(std::string query, -// std::function on_success, -// std::function on_cancelled, -// std::function on_error); -// -// -// void Rollback( -// std::function on_success, -// std::function on_error); -// void Commit( -// std::function on_success, -// std::function on_cancelled, -// std::function on_error); -// -// }; -} - - - diff --git a/pglab/Pgsql_Connection.cpp b/pglab/Pgsql_Connection.cpp index 78b37d5..9555434 100644 --- a/pglab/Pgsql_Connection.cpp +++ b/pglab/Pgsql_Connection.cpp @@ -1,4 +1,4 @@ -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" #include "Pgsql_declare.h" #include "Pgsql_Params.h" #include diff --git a/pglab/QueryResultModel.h b/pglab/QueryResultModel.h index f137293..ed8f21a 100644 --- a/pglab/QueryResultModel.h +++ b/pglab/QueryResultModel.h @@ -2,7 +2,7 @@ #define QUERYRESULTMODEL_H #include -#include "PgsqlConn.h" +#include "Pgsql_Connection.h" class QueryResultModel : public QAbstractTableModel { From f7cf93bb9abc589e6104f841d170d331f7339828 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 14:50:36 +0200 Subject: [PATCH 13/34] Moved lowlevel postgresql wrappers to seperate folder and static lib. --- CMakeLists.txt | 14 +++++++++----- {pglab => pgsql}/Pgsql_Connection.cpp | 0 {pglab => pgsql}/Pgsql_Connection.h | 0 {pglab => pgsql}/Pgsql_Params.cpp | 0 {pglab => pgsql}/Pgsql_Params.h | 0 {pglab => pgsql}/Pgsql_Result.cpp | 0 {pglab => pgsql}/Pgsql_Result.h | 0 {pglab => pgsql}/Pgsql_Row.cpp | 0 {pglab => pgsql}/Pgsql_Row.h | 0 {pglab => pgsql}/Pgsql_Value.cpp | 0 {pglab => pgsql}/Pgsql_Value.h | 0 {pglab => pgsql}/Pgsql_declare.h | 0 12 files changed, 9 insertions(+), 5 deletions(-) rename {pglab => pgsql}/Pgsql_Connection.cpp (100%) rename {pglab => pgsql}/Pgsql_Connection.h (100%) rename {pglab => pgsql}/Pgsql_Params.cpp (100%) rename {pglab => pgsql}/Pgsql_Params.h (100%) rename {pglab => pgsql}/Pgsql_Result.cpp (100%) rename {pglab => pgsql}/Pgsql_Result.h (100%) rename {pglab => pgsql}/Pgsql_Row.cpp (100%) rename {pglab => pgsql}/Pgsql_Row.h (100%) rename {pglab => pgsql}/Pgsql_Value.cpp (100%) rename {pglab => pgsql}/Pgsql_Value.h (100%) rename {pglab => pgsql}/Pgsql_declare.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 044da69..ec76119 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,13 @@ add_library(core STATIC core/PasswordManager.cpp core/SqlLexer.cpp) +add_library(pgsql STATIC + pgsql/Pgsql_Connection.cpp + pgsql/Pgsql_Params.cpp + pgsql/Pgsql_Result.cpp + pgsql/Pgsql_Row.cpp + pgsql/Pgsql_Value.cpp) + add_executable(pglab pglab/ASyncDBConnection.cpp pglab/ASyncWindow.cpp @@ -94,11 +101,6 @@ add_executable(pglab pglab/PgDatabaseContainer.cpp pglab/PgDatabase.cpp pglab/PgNamespace.cpp - pglab/Pgsql_Connection.cpp - pglab/Pgsql_Params.cpp - pglab/Pgsql_Result.cpp - pglab/Pgsql_Row.cpp - pglab/Pgsql_Value.cpp pglab/PgTypeContainer.cpp pglab/PgType.cpp pglab/ProcessStdioWidget.cpp @@ -120,10 +122,12 @@ add_executable(pglab target_include_directories(pglab PUBLIC ./core + ./pgsql ) target_link_libraries( pglab core + pgsql ${Boost_LIBRARIES} Qt5::Widgets ${Pq_LIBRARIES} diff --git a/pglab/Pgsql_Connection.cpp b/pgsql/Pgsql_Connection.cpp similarity index 100% rename from pglab/Pgsql_Connection.cpp rename to pgsql/Pgsql_Connection.cpp diff --git a/pglab/Pgsql_Connection.h b/pgsql/Pgsql_Connection.h similarity index 100% rename from pglab/Pgsql_Connection.h rename to pgsql/Pgsql_Connection.h diff --git a/pglab/Pgsql_Params.cpp b/pgsql/Pgsql_Params.cpp similarity index 100% rename from pglab/Pgsql_Params.cpp rename to pgsql/Pgsql_Params.cpp diff --git a/pglab/Pgsql_Params.h b/pgsql/Pgsql_Params.h similarity index 100% rename from pglab/Pgsql_Params.h rename to pgsql/Pgsql_Params.h diff --git a/pglab/Pgsql_Result.cpp b/pgsql/Pgsql_Result.cpp similarity index 100% rename from pglab/Pgsql_Result.cpp rename to pgsql/Pgsql_Result.cpp diff --git a/pglab/Pgsql_Result.h b/pgsql/Pgsql_Result.h similarity index 100% rename from pglab/Pgsql_Result.h rename to pgsql/Pgsql_Result.h diff --git a/pglab/Pgsql_Row.cpp b/pgsql/Pgsql_Row.cpp similarity index 100% rename from pglab/Pgsql_Row.cpp rename to pgsql/Pgsql_Row.cpp diff --git a/pglab/Pgsql_Row.h b/pgsql/Pgsql_Row.h similarity index 100% rename from pglab/Pgsql_Row.h rename to pgsql/Pgsql_Row.h diff --git a/pglab/Pgsql_Value.cpp b/pgsql/Pgsql_Value.cpp similarity index 100% rename from pglab/Pgsql_Value.cpp rename to pgsql/Pgsql_Value.cpp diff --git a/pglab/Pgsql_Value.h b/pgsql/Pgsql_Value.h similarity index 100% rename from pglab/Pgsql_Value.h rename to pgsql/Pgsql_Value.h diff --git a/pglab/Pgsql_declare.h b/pgsql/Pgsql_declare.h similarity index 100% rename from pglab/Pgsql_declare.h rename to pgsql/Pgsql_declare.h From cb0ef0b130b97ce52289ed0e022baa4dae062381 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 14:55:30 +0200 Subject: [PATCH 14/34] Removed obsolete SqlHighlighter the newer SqlSyntaxHighlighter is much better and faster. Also removed the never completed sqlparser. --- CMakeLists.txt | 2 - pglab/SqlHighlighter.cpp | 92 ---------------------------------------- pglab/SqlHighlighter.h | 42 ------------------ pglab/sqlparser.cpp | 30 ------------- pglab/sqlparser.h | 11 ----- 5 files changed, 177 deletions(-) delete mode 100644 pglab/SqlHighlighter.cpp delete mode 100644 pglab/SqlHighlighter.h delete mode 100644 pglab/sqlparser.cpp delete mode 100644 pglab/sqlparser.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ec76119..8de5134 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,8 +109,6 @@ add_executable(pglab pglab/QueryTab.cpp pglab/RolesTableModel.cpp pglab/ServerWindow.cpp - pglab/SqlHighlighter.cpp - pglab/sqlparser.cpp pglab/SqlSyntaxHighlighter.cpp pglab/stopwatch.cpp pglab/tsqueue.cpp diff --git a/pglab/SqlHighlighter.cpp b/pglab/SqlHighlighter.cpp deleted file mode 100644 index 36885b4..0000000 --- a/pglab/SqlHighlighter.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "SqlHighlighter.h" - -// static const wchar_t *keywords[] = { -// L"as", L"alter", L"all", L"and", L"any", L"by", L"char", L"column", L"create", L"database", L"date", L"from", L"full", L"group", L"having", -// L"in", L"inner", L"int", L"join", L"left", L"not", L"numeric", L"or", L"order", L"outer", L"right", L"select", L"smallint", L"table", L"time", -// L"timestamp", L"timestamptz", L"varchar", L"where" -// }; -// -// static const wchar_t *operators[] = { -// L"+", L"-", L"*", L"/", L"<", L">", L"<=", L">=", L"<>", L"!=", L"~" -// }; - - -/* - - + - * / < > = ~ ! @ # % ^ & | ` ? - -There are a few restrictions on your choice of name: - - -- and C-comment start cannot appear anywhere in an operator name, since they will be taken as the start of a comment. - - A multicharacter operator name cannot end in + or -, unless the name also contains at least one of these characters: - - ~ ! @ # % ^ & | ` ? - For example, @- is an allowed operator name, but *- is not. This restriction allows PostgreSQL to parse SQL-compliant commands without requiring spaces between tokens. - - The use of => as an operator name is deprecated. It may be disallowed altogether in a future release. - -The operator != is mapped to <> on input, so these two names are always equivalent. - -+ - * / < > = - -*/ - -//static auto types = R"-(bigint|boolean|char|character varying|date|int[248]|integer|numeric|smallint|time|timestamp(?:tz)?|timestamp(?:\s+with\s+timezone)?|varchar)-"; -//static auto err = R"-(left|right|inner|outer)-"; - -// static_assert(sizeof(keywords)/4 == 25, -// "sizeof keywords"); - - -SqlHighlighter::SqlHighlighter(QTextDocument *parent) - : QSyntaxHighlighter(parent) -{ -// { - static auto keywords = - R"-(\balter\b|\ball\b|\band\b|\bany\b|\bas\b|\bby\b|\bcascade\b|\bcheck\b|\bcolumn\b|\bcopy\b|\bcreate\b|\bdatabase\b|\bdefault\b|\bdelete\b)-" - R"-(|\foreign\b|\bfrom\b|\bgroup\b|\bhaving\b|\bin\b|\bindex\b|\bis\b|\bkey\b|\blimit\b|\bnatural\b|\bnot\b|\bnull\b|\boffset\b|\bon\b)-" - R"-(|\bor\b|\border\b|\bover\b|\bparition\b|\bprimary\b|\breferences\b|\brestrict\b|\bselect\b|\btable\b|\btruncate\b|\bunique\b|\bupdate\b|\busing\b)-" - R"-(|\bwhere\b|\bwith\b|(?:(?:inner|(?:left|right|full)(\s+outer)?)\s+)?join)-"; - - // into temp DISTINCT true false - - static auto types = - R"-(\bbigint\b|\bboolean\b|\bchar\b|\bcharacter varying\b|\bdate\b|\bint[248]\b|\binteger\b|\bnumeric\b|\bsmallint\b)-" - R"-(|\btime\b|\btimestamp(?:tz)?\b|\btimestamp(?:\s+with\s+time\s+zone)?\b|\bvarchar\b)-"; -// static auto err = R"-(left|right|inner|outer)-"; - -// QTextCharFormat errFormat; -// errFormat.setForeground(QColor(255, 128, 128)); -// errFormat.setFontWeight(QFont::Bold); -// highlightingRules.emplace_back(QRegExp(err, Qt::CaseInsensitive), errFormat); - - QTextCharFormat keywordFormat; - keywordFormat.setForeground(QColor(64, 64, 192)); - keywordFormat.setFontWeight(QFont::Bold); - highlightingRules.emplace_back(QRegExp(keywords, Qt::CaseInsensitive), keywordFormat); - - QTextCharFormat typesFormat; - typesFormat.setForeground(QColor(64, 192, 64)); - typesFormat.setFontWeight(QFont::Bold); - highlightingRules.emplace_back(QRegExp(types, Qt::CaseInsensitive), typesFormat); - -// } -} - -void SqlHighlighter::highlightBlock(const QString &text) -{ - foreach (const HighlightingRule &rule, highlightingRules) { - QRegExp expression(rule.pattern); - int index = expression.indexIn(text); - while (index >= 0) { - int length = expression.matchedLength(); - setFormat(index, length, rule.format); - index = expression.indexIn(text, index + length); - } - } - setCurrentBlockState(0); -} - - - diff --git a/pglab/SqlHighlighter.h b/pglab/SqlHighlighter.h deleted file mode 100644 index ee3ab91..0000000 --- a/pglab/SqlHighlighter.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include - -#include - -class SqlHighlighter : public QSyntaxHighlighter -{ - Q_OBJECT - -public: - SqlHighlighter(QTextDocument *parent = 0); - -protected: - void highlightBlock(const QString &text) override; - -private: - struct HighlightingRule - { - QRegExp pattern; - QTextCharFormat format; - - HighlightingRule(const QRegExp ®ex, const QTextCharFormat &f) - : pattern(regex), format(f) - {} - }; - //QVector highlightingRules; - std::vector highlightingRules; - -// QRegExp commentStartExpression; - // QRegExp commentEndExpression; - - QTextCharFormat keywordFormat; -// QTextCharFormat classFormat; -// QTextCharFormat singleLineCommentFormat; -// QTextCharFormat multiLineCommentFormat; -// QTextCharFormat quotationFormat; -// QTextCharFormat functionFormat; - -}; - diff --git a/pglab/sqlparser.cpp b/pglab/sqlparser.cpp deleted file mode 100644 index 3d960b0..0000000 --- a/pglab/sqlparser.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "sqlparser.h" - -/** Responsible for splitting the query into logical elements. - * - * It first uses common seperators to split the input, then it tries - * to determine if the fields it gets have a special meaning. - * - * However because SQL is very forgiving about the use of keywords - * as names. - * - * The lexical analyzer does however distinguish between - * - symbols/keywords (symbols might be schema, table, columns, functions etc) - * - numbers - * - strings - * - quoted symbol (a symbol between "" must be the name of something) - * - * seperators - * whitespace - * special chars ;,. - * operators - */ -class LexicalAnalyser { -public: - -}; - -SqlParser::SqlParser() -{ - -} diff --git a/pglab/sqlparser.h b/pglab/sqlparser.h deleted file mode 100644 index 4dc8b4d..0000000 --- a/pglab/sqlparser.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef SQLPARSER_H -#define SQLPARSER_H - - -class SqlParser -{ -public: - SqlParser(); -}; - -#endif // SQLPARSER_H \ No newline at end of file From 4c658d7811f077ffe22f3e621aa96f66bfca3a4a Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 15:53:15 +0200 Subject: [PATCH 15/34] Added the test to CMakeLists.txt, all tests OK. --- CMakeLists.txt | 27 +++++++++++++++- tests/auto/auto.pro | 3 -- tests/auto/gtest_dependency.pri | 29 ----------------- tests/auto/mycase/main.cpp | 13 -------- tests/auto/mycase/mycase.pro | 31 ------------------- tests/main.cpp | 8 +++++ tests/tests.pro | 3 -- .../tst_CsvWriter.h => tst_CsvWriter.cpp} | 0 ...swordManager.h => tst_PasswordManager.cpp} | 0 .../tst_SqlLexer.h => tst_SqlLexer.cpp} | 0 .../tst_expected.h => tst_expected.cpp} | 0 .../tst_scopeguard.h => tst_scopeguard.cpp} | 0 12 files changed, 34 insertions(+), 80 deletions(-) delete mode 100644 tests/auto/auto.pro delete mode 100644 tests/auto/gtest_dependency.pri delete mode 100644 tests/auto/mycase/main.cpp delete mode 100644 tests/auto/mycase/mycase.pro create mode 100644 tests/main.cpp delete mode 100644 tests/tests.pro rename tests/{auto/mycase/tst_CsvWriter.h => tst_CsvWriter.cpp} (100%) rename tests/{auto/mycase/tst_PasswordManager.h => tst_PasswordManager.cpp} (100%) rename tests/{auto/mycase/tst_SqlLexer.h => tst_SqlLexer.cpp} (100%) rename tests/{auto/mycase/tst_expected.h => tst_expected.cpp} (100%) rename tests/{auto/mycase/tst_scopeguard.h => tst_scopeguard.cpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8de5134..88a3cec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,9 @@ include_directories( ${fmt_INCLUDE_DIRS} ) find_package(Boost 1.63 COMPONENTS system REQUIRED ) include_directories( ${Boost_INCLUDE_DIRS} ) +find_package(GTest REQUIRED) + + add_library(core STATIC core/BackupFormatModel.cpp core/CsvWriter.cpp @@ -118,7 +121,7 @@ add_executable(pglab pglab/resources.qrc ) -target_include_directories(pglab PUBLIC +target_include_directories(pglab PRIVATE ./core ./pgsql ) @@ -132,3 +135,25 @@ target_link_libraries( pglab ${Botan_LIBRARIES} pthread ) + +add_executable(runtests + tests/main.cpp + tests/tst_CsvWriter.cpp + tests/tst_expected.cpp + tests/tst_PasswordManager.cpp + tests/tst_scopeguard.cpp + tests/tst_SqlLexer.cpp + ) + +target_include_directories(runtests PRIVATE ./core ${GTEST_INCLUDE_DIRS}) +target_link_libraries(runtests + core + ${GTEST_LIBRARIES} + ${Botan_LIBRARIES} + Qt5::Widgets + pthread + ) + + +enable_testing() +add_test(tests runtests) diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro deleted file mode 100644 index 576a9ff..0000000 --- a/tests/auto/auto.pro +++ /dev/null @@ -1,3 +0,0 @@ -TEMPLATE = subdirs - -SUBDIRS += mycase diff --git a/tests/auto/gtest_dependency.pri b/tests/auto/gtest_dependency.pri deleted file mode 100644 index d01d7f0..0000000 --- a/tests/auto/gtest_dependency.pri +++ /dev/null @@ -1,29 +0,0 @@ -isEmpty(GOOGLETEST_DIR):GOOGLETEST_DIR=$$(GOOGLETEST_DIR) - -isEmpty(GOOGLETEST_DIR) { - warning("Using googletest src dir specified at Qt Creator wizard") - message("set GOOGLETEST_DIR as environment variable or qmake variable to get rid of this message") - GOOGLETEST_DIR = C:/Prog/googletest -} - -!isEmpty(GOOGLETEST_DIR): { - GTEST_SRCDIR = $$GOOGLETEST_DIR/googletest - GMOCK_SRCDIR = $$GOOGLETEST_DIR/googlemock -} - -requires(exists($$GTEST_SRCDIR):exists($$GMOCK_SRCDIR)) - -!exists($$GOOGLETEST_DIR):message("No googletest src dir found - set GOOGLETEST_DIR to enable.") - -DEFINES += \ - GTEST_LANG_CXX11 - -INCLUDEPATH *= \ - $$GTEST_SRCDIR \ - $$GTEST_SRCDIR/include \ - $$GMOCK_SRCDIR \ - $$GMOCK_SRCDIR/include - -SOURCES += \ - $$GTEST_SRCDIR/src/gtest-all.cc \ - $$GMOCK_SRCDIR/src/gmock-all.cc diff --git a/tests/auto/mycase/main.cpp b/tests/auto/mycase/main.cpp deleted file mode 100644 index 046652f..0000000 --- a/tests/auto/mycase/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "tst_CsvWriter.h" -#include "tst_expected.h" -#include "tst_PasswordManager.h" -#include "tst_scopeguard.h" -#include "tst_SqlLexer.h" - -#include - -int main(int argc, char *argv[]) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/auto/mycase/mycase.pro b/tests/auto/mycase/mycase.pro deleted file mode 100644 index 8572e21..0000000 --- a/tests/auto/mycase/mycase.pro +++ /dev/null @@ -1,31 +0,0 @@ -include(../gtest_dependency.pri) - -TEMPLATE = app -CONFIG += console c++11 -CONFIG -= app_bundle -CONFIG += thread -CONFIG += qt - -QT += core - -HEADERS += \ - tst_expected.h \ - tst_SqlLexer.h \ - tst_scopeguard.h \ - tst_CsvWriter.h \ - tst_PasswordManager.h - -SOURCES += main.cpp - -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 - -INCLUDEPATH += C:\prog\include C:\VSproj\boost_1_63_0 -INCLUDEPATH += $$PWD/../../../core -DEPENDPATH += $$PWD/../../../core -LIBS += c:\prog\lib\botand_imp.lib - -win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../../core/release/libcore.a -else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../../core/debug/libcore.a -else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../../core/release/core.lib -else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../../core/debug/core.lib diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000..65b7839 --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,8 @@ +#include + +int main(int argc, char *argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/tests/tests.pro b/tests/tests.pro deleted file mode 100644 index f927700..0000000 --- a/tests/tests.pro +++ /dev/null @@ -1,3 +0,0 @@ -TEMPLATE = subdirs - -SUBDIRS += auto diff --git a/tests/auto/mycase/tst_CsvWriter.h b/tests/tst_CsvWriter.cpp similarity index 100% rename from tests/auto/mycase/tst_CsvWriter.h rename to tests/tst_CsvWriter.cpp diff --git a/tests/auto/mycase/tst_PasswordManager.h b/tests/tst_PasswordManager.cpp similarity index 100% rename from tests/auto/mycase/tst_PasswordManager.h rename to tests/tst_PasswordManager.cpp diff --git a/tests/auto/mycase/tst_SqlLexer.h b/tests/tst_SqlLexer.cpp similarity index 100% rename from tests/auto/mycase/tst_SqlLexer.h rename to tests/tst_SqlLexer.cpp diff --git a/tests/auto/mycase/tst_expected.h b/tests/tst_expected.cpp similarity index 100% rename from tests/auto/mycase/tst_expected.h rename to tests/tst_expected.cpp diff --git a/tests/auto/mycase/tst_scopeguard.h b/tests/tst_scopeguard.cpp similarity index 100% rename from tests/auto/mycase/tst_scopeguard.h rename to tests/tst_scopeguard.cpp From 78a4c6d730cca2f1a9ed4c098d47ca032c082bba Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 26 Aug 2017 19:07:01 +0200 Subject: [PATCH 16/34] Remove use of ASSERT_THAT --- tests/tst_CsvWriter.cpp | 14 +++++++------- tests/tst_PasswordManager.cpp | 25 ++++++++++++------------- tests/tst_SqlLexer.cpp | 28 ++++++++++++++-------------- tests/tst_expected.cpp | 30 +++++++++++++++--------------- tests/tst_scopeguard.cpp | 10 +++++----- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/tests/tst_CsvWriter.cpp b/tests/tst_CsvWriter.cpp index ac48b9d..faac727 100644 --- a/tests/tst_CsvWriter.cpp +++ b/tests/tst_CsvWriter.cpp @@ -19,7 +19,7 @@ TEST(CsvWriter, one_row_two_numbers) writer.nextRow(); QString expected = QString::fromUtf8("1,2\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, one_row_one_number_one_unquoted_string) @@ -34,7 +34,7 @@ TEST(CsvWriter, one_row_one_number_one_unquoted_string) writer.nextRow(); QString expected = QString::fromUtf8("1,hello\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, one_row_one_number_one_quoted_string) @@ -49,7 +49,7 @@ TEST(CsvWriter, one_row_one_number_one_quoted_string) writer.nextRow(); QString expected = QString::fromUtf8("1,\"hel,lo\"\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, newline_in_field) @@ -64,7 +64,7 @@ TEST(CsvWriter, newline_in_field) writer.nextRow(); QString expected = QString::fromUtf8("1,\"hel\nlo\"\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, escape_quote) @@ -79,7 +79,7 @@ TEST(CsvWriter, escape_quote) writer.nextRow(); QString expected = QString::fromUtf8("1,\"hel\"\"lo\"\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, non_default_seperator) @@ -94,7 +94,7 @@ TEST(CsvWriter, non_default_seperator) writer.nextRow(); QString expected = QString::fromUtf8("1\thel,lo\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } TEST(CsvWriter, non_default_quote) @@ -109,5 +109,5 @@ TEST(CsvWriter, non_default_quote) writer.nextRow(); QString expected = QString::fromUtf8("1\t*hel\tlo*\n"); - ASSERT_THAT(result, Eq(expected)); + ASSERT_EQ(result, expected); } diff --git a/tests/tst_PasswordManager.cpp b/tests/tst_PasswordManager.cpp index a3da28b..bbcf591 100644 --- a/tests/tst_PasswordManager.cpp +++ b/tests/tst_PasswordManager.cpp @@ -11,7 +11,7 @@ TEST(PasswordManager, initial_changeMasterPassword_returns_true) auto res = pwm.changeMasterPassword("", "my test passphrase"); ASSERT_NO_THROW( res.get() ); - ASSERT_THAT( res.get(), Eq(true) ); + ASSERT_TRUE(res.get()); } TEST(PasswordManager, unlock_succeeds) @@ -22,11 +22,11 @@ TEST(PasswordManager, unlock_succeeds) auto res = pwm.changeMasterPassword("", passphrase); ASSERT_NO_THROW( res.get() ); - ASSERT_THAT( res.get(), Eq(true) ); + ASSERT_TRUE(res.get()); auto res2 = pwm.unlock(passphrase); ASSERT_NO_THROW( res2.get() ); - ASSERT_THAT( res2.get(), Eq(true) ); + ASSERT_TRUE(res2.get()); } TEST(PasswordManager, unlock_fails) @@ -36,12 +36,12 @@ TEST(PasswordManager, unlock_fails) std::string passphrase = "my test passphrase"; auto res = pwm.changeMasterPassword("", passphrase); - ASSERT_NO_THROW( res.get() ); - ASSERT_THAT( res.get(), Eq(true) ); + ASSERT_NO_THROW(res.get()); + ASSERT_TRUE(res.get()); auto res2 = pwm.unlock(passphrase + "2"); - ASSERT_NO_THROW( res2.get() ); - ASSERT_THAT( res2.get(), Eq(false) ); + ASSERT_NO_THROW(res2.get()); + ASSERT_FALSE(res2.get()); } TEST(PasswordManager, test_save_get) @@ -52,7 +52,7 @@ TEST(PasswordManager, test_save_get) auto res = pwm.changeMasterPassword("", passphrase); ASSERT_NO_THROW( res.get() ); - ASSERT_THAT( res.get(), Eq(true) ); + ASSERT_TRUE(res.get()); // auto res2 = pwm.unlock(passphrase + "2"); // ASSERT_NO_THROW( res2.get() ); @@ -62,12 +62,11 @@ TEST(PasswordManager, test_save_get) const std::string key = "abc"; auto res2 = pwm.savePassword(key, password); - ASSERT_THAT( res2.valid(), Eq(true) ); + ASSERT_TRUE(res2.valid()); std::string result; auto res3 = pwm.getPassword(key, result); - ASSERT_THAT( res3.valid(), Eq(true) ); - ASSERT_THAT( res3.get(), Eq(true) ); - ASSERT_THAT( result, Eq(password) ); - + ASSERT_TRUE(res3.valid()); + ASSERT_TRUE(res3.get()); + ASSERT_EQ(result, password); } diff --git a/tests/tst_SqlLexer.cpp b/tests/tst_SqlLexer.cpp index 25d6535..a8232b6 100644 --- a/tests/tst_SqlLexer.cpp +++ b/tests/tst_SqlLexer.cpp @@ -15,24 +15,24 @@ TEST(SqlLexer, lexer) QString out; lexer.nextBasicToken(startpos, length, tokentype, out); - ASSERT_THAT(startpos, Eq(1)); - ASSERT_THAT(length, Eq(6)); - ASSERT_THAT(tokentype, Eq(BasicTokenType::Symbol)); - ASSERT_THAT( out, Eq(QString("SELECT")) ); + ASSERT_EQ(startpos, 1); + ASSERT_EQ(length, 6); + ASSERT_EQ(tokentype, BasicTokenType::Symbol); + ASSERT_EQ( out, QString("SELECT") ); } TEST(SqlLexer, lexer_quote_in_string) { - QString input = " 'abc''def' "; - SqlLexer lexer(input, LexerState::Null); + QString input = " 'abc''def' "; + SqlLexer lexer(input, LexerState::Null); - int startpos, length; - BasicTokenType tokentype; - QString out; - lexer.nextBasicToken(startpos, length, tokentype, out); - - ASSERT_THAT(startpos, Eq(1)); - ASSERT_THAT(length, Eq(10)); - ASSERT_THAT(tokentype, Eq(BasicTokenType::QuotedString)); + int startpos, length; + BasicTokenType tokentype; + QString out; + lexer.nextBasicToken(startpos, length, tokentype, out); + + ASSERT_EQ(startpos, 1); + ASSERT_EQ(length, 10); + ASSERT_EQ(tokentype, BasicTokenType::QuotedString); } diff --git a/tests/tst_expected.cpp b/tests/tst_expected.cpp index 8632ff8..5848c13 100644 --- a/tests/tst_expected.cpp +++ b/tests/tst_expected.cpp @@ -9,25 +9,25 @@ Expected getAnswerToEverything() { return 42; } TEST(expected, valid_when_valid_returns_true) { Expected v = getAnswerToEverything(); - ASSERT_THAT(v.valid(), Eq(true)); + ASSERT_TRUE(v.valid()); } TEST(expected, get_when_valid_returns_value) { Expected v = getAnswerToEverything(); - ASSERT_THAT(v.get(), Eq(42)); + ASSERT_EQ(v.get(), 42); } TEST(expected, hasException_when_valid_returns_false) { Expected v = getAnswerToEverything(); - ASSERT_THAT(v.hasException(), Eq(false)); + ASSERT_FALSE(v.hasException()); } TEST(expected, T_fromException_is_not_valid) { auto e = Expected::fromException(std::runtime_error("hello")); - ASSERT_THAT(e.valid(), Eq(false)); + ASSERT_FALSE(e.valid()); } TEST(expected, T_fromException_get_thows) @@ -39,38 +39,38 @@ TEST(expected, T_fromException_get_thows) TEST(expected, T_fromException_has_exception_true) { auto e = Expected::fromException(std::runtime_error("hello")); - ASSERT_THAT(e.hasException(), Eq(true)); + ASSERT_TRUE(e.hasException()); } TEST(expected, T_fromException_has_exception_false) { auto e = Expected::fromException(std::runtime_error("hello")); - ASSERT_THAT(e.hasException(), Eq(false)); + ASSERT_FALSE(e.hasException()); } TEST(expected, T_fromException_has_derived_exception) { auto e = Expected::fromException(std::runtime_error("hello")); - ASSERT_THAT(e.hasException(), Eq(true)); + ASSERT_TRUE(e.hasException()); } TEST(expected, T_fromCode_is_valid) { auto e = Expected::fromCode([]() -> int { return 42; }); - ASSERT_THAT(e.valid(), Eq(true)); + ASSERT_TRUE(e.valid()); } TEST(expected, T_fromCode_get) { auto e = Expected::fromCode([]() -> int { return 42; }); - ASSERT_THAT(e.get(), Eq(42)); + ASSERT_EQ(e.get(), 42); } TEST(expected, T_fromCode_E_is_not_valid) { auto e = Expected::fromCode([]() -> int { throw std::runtime_error("hello"); }); - ASSERT_THAT(e.valid(), Eq(false)); + ASSERT_FALSE(e.valid()); } TEST(expected, T_fromCode_E_get_thows) @@ -82,19 +82,19 @@ TEST(expected, T_fromCode_E_get_thows) TEST(expected, T_fromCode_E_has_exception_true) { auto e = Expected::fromCode([]() -> int { throw std::runtime_error("hello"); }); - ASSERT_THAT(e.hasException(), Eq(true)); + ASSERT_TRUE(e.hasException()); } TEST(expected, T_fromCode_E_has_exception_false) { auto e = Expected::fromCode([]() -> int { throw std::runtime_error("hello"); }); - ASSERT_THAT(e.hasException(), Eq(false)); + ASSERT_FALSE(e.hasException()); } TEST(expected, T_fromCode_E_has_derived_exception) { auto e = Expected::fromCode([]() -> int { throw std::runtime_error("hello"); }); - ASSERT_THAT(e.hasException(), Eq(true)); + ASSERT_TRUE(e.hasException()); } //Expected getIntWithStdRuntimeError() { return Expected(); } @@ -105,7 +105,7 @@ Expected getNothing() { return Expected(); } TEST(expected_void, valid_when_valid_returns_true) { Expected v = getNothing(); - ASSERT_THAT(v.valid(), Eq(true)); + ASSERT_TRUE(v.valid()); } TEST(expected_void, get_when_valid_returns_value) @@ -117,7 +117,7 @@ TEST(expected_void, get_when_valid_returns_value) TEST(expected_void, hasException_when_valid_returns_false) { Expected v = getNothing(); - ASSERT_THAT(v.hasException(), Eq(false)); + ASSERT_FALSE(v.hasException()); } diff --git a/tests/tst_scopeguard.cpp b/tests/tst_scopeguard.cpp index 431e484..fb72c92 100644 --- a/tests/tst_scopeguard.cpp +++ b/tests/tst_scopeguard.cpp @@ -9,7 +9,7 @@ TEST(ScopeGuard, normal_run_fun_on_destruction_1) { bool result = false; auto sg = scopeGuard([&result]() { result = true; }); - ASSERT_THAT(result, Eq(false)); + ASSERT_FALSE(result); } TEST(ScopeGuard, normal_run_fun_on_destruction_2) @@ -19,7 +19,7 @@ TEST(ScopeGuard, normal_run_fun_on_destruction_2) auto sg = scopeGuard([&result]() { result = true; }); } - ASSERT_THAT(result, Eq(true)); + ASSERT_TRUE(result); } TEST(ScopeGuard, dismiss) @@ -30,7 +30,7 @@ TEST(ScopeGuard, dismiss) sg.dismiss(); } - ASSERT_THAT(result, Eq(false)); + ASSERT_FALSE(result); } TEST(ScopeGuard, SCOPE_EXIT_macro_1) @@ -38,7 +38,7 @@ TEST(ScopeGuard, SCOPE_EXIT_macro_1) bool result = false; { SCOPE_EXIT { result = true; }; - ASSERT_THAT(result, Eq(false)); // prove previous statement hasn't run yet + ASSERT_FALSE(result); // prove previous statement hasn't run yet } } @@ -50,7 +50,7 @@ TEST(ScopeGuard, SCOPE_EXIT_macro_2) SCOPE_EXIT { result = true; }; } - ASSERT_THAT(result, Eq(true)); + ASSERT_TRUE(result); } From 7c4e8e95e8252d0227008a5870db3712d2c0e5aa Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 27 Aug 2017 07:34:42 +0200 Subject: [PATCH 17/34] Restructured locations of source. --- .gitignore | 1 + CMakeLists.txt => src/CMakeLists.txt | 0 {core => src/core}/BackupFormatModel.cpp | 0 {core => src/core}/BackupFormatModel.h | 0 {core => src/core}/CsvWriter.cpp | 0 {core => src/core}/CsvWriter.h | 0 {core => src/core}/Expected.h | 0 {core => src/core}/PasswordManager.cpp | 0 {core => src/core}/PasswordManager.h | 0 {core => src/core}/ScopeGuard.h | 0 {core => src/core}/SqlLexer.cpp | 0 {core => src/core}/SqlLexer.h | 0 {core => src/core}/my_boost_assert_handler.cpp | 0 {pglab => src/pglab}/.gitignore | 0 {pglab => src/pglab}/ASyncDBConnection.cpp | 0 {pglab => src/pglab}/ASyncDBConnection.h | 0 {pglab => src/pglab}/ASyncWindow.cpp | 0 {pglab => src/pglab}/ASyncWindow.h | 0 {pglab => src/pglab}/BackupDialog.cpp | 0 {pglab => src/pglab}/BackupDialog.h | 0 {pglab => src/pglab}/BackupDialog.ui | 0 {pglab => src/pglab}/BackupRestore.cpp | 0 {pglab => src/pglab}/ConnectionConfig.cpp | 0 {pglab => src/pglab}/ConnectionConfig.h | 0 {pglab => src/pglab}/ConnectionList.cpp | 0 {pglab => src/pglab}/ConnectionList.h | 0 {pglab => src/pglab}/ConnectionListModel.cpp | 0 {pglab => src/pglab}/ConnectionListModel.h | 0 {pglab => src/pglab}/ConnectionManagerWindow.cpp | 0 {pglab => src/pglab}/ConnectionManagerWindow.h | 0 {pglab => src/pglab}/ConnectionManagerWindow.ui | 0 {pglab => src/pglab}/DatabaseInspectorWidget.cpp | 0 {pglab => src/pglab}/DatabaseInspectorWidget.h | 0 {pglab => src/pglab}/DatabaseInspectorWidget.ui | 0 {pglab => src/pglab}/DatabaseWindow.cpp | 0 {pglab => src/pglab}/DatabaseWindow.h | 0 {pglab => src/pglab}/DatabaseWindow.ui | 0 {pglab => src/pglab}/DatabasesTableModel.cpp | 0 {pglab => src/pglab}/DatabasesTableModel.h | 0 {pglab => src/pglab}/Doxyfile | 0 {pglab => src/pglab}/ExplainTreeModelItem.cpp | 0 {pglab => src/pglab}/ExplainTreeModelItem.h | 0 {pglab => src/pglab}/GlobalIoService.cpp | 0 {pglab => src/pglab}/GlobalIoService.h | 0 {pglab => src/pglab}/MainWindow.cpp | 0 {pglab => src/pglab}/MainWindow.h | 0 {pglab => src/pglab}/MainWindow.ui | 0 {pglab => src/pglab}/MasterController.cpp | 0 {pglab => src/pglab}/MasterController.h | 0 {pglab => src/pglab}/OpenDatabase.cpp | 0 {pglab => src/pglab}/OpenDatabase.h | 0 {pglab => src/pglab}/ParamListModel.cpp | 0 {pglab => src/pglab}/ParamListModel.h | 0 {pglab => src/pglab}/ParamTypeDelegate.cpp | 0 {pglab => src/pglab}/ParamTypeDelegate.h | 0 {pglab => src/pglab}/PgAuthId.cpp | 0 {pglab => src/pglab}/PgAuthId.h | 0 {pglab => src/pglab}/PgAuthIdContainer.cpp | 0 {pglab => src/pglab}/PgAuthIdContainer.h | 0 {pglab => src/pglab}/PgClass.cpp | 0 {pglab => src/pglab}/PgClass.h | 0 {pglab => src/pglab}/PgContainer.h | 0 {pglab => src/pglab}/PgDatabase.cpp | 0 {pglab => src/pglab}/PgDatabase.h | 0 {pglab => src/pglab}/PgDatabaseCatalogue.cpp | 0 {pglab => src/pglab}/PgDatabaseCatalogue.h | 0 {pglab => src/pglab}/PgDatabaseContainer.cpp | 0 {pglab => src/pglab}/PgDatabaseContainer.h | 0 {pglab => src/pglab}/PgNamespace.cpp | 0 {pglab => src/pglab}/PgNamespace.h | 0 {pglab => src/pglab}/PgType.cpp | 0 {pglab => src/pglab}/PgType.h | 0 {pglab => src/pglab}/PgTypeContainer.cpp | 0 {pglab => src/pglab}/PgTypeContainer.h | 0 {pglab => src/pglab}/ProcessStdioWidget.cpp | 0 {pglab => src/pglab}/ProcessStdioWidget.h | 0 {pglab => src/pglab}/ProcessStdioWidget.ui | 0 {pglab => src/pglab}/QueryExplainModel.cpp | 0 {pglab => src/pglab}/QueryExplainModel.h | 0 {pglab => src/pglab}/QueryResultModel.cpp | 0 {pglab => src/pglab}/QueryResultModel.h | 0 {pglab => src/pglab}/QueryTab.cpp | 0 {pglab => src/pglab}/QueryTab.h | 0 {pglab => src/pglab}/QueryTab.ui | 0 {pglab => src/pglab}/RolesTableModel.cpp | 0 {pglab => src/pglab}/RolesTableModel.h | 0 {pglab => src/pglab}/ServerWindow.cpp | 0 {pglab => src/pglab}/ServerWindow.h | 0 {pglab => src/pglab}/ServerWindow.ui | 0 {pglab => src/pglab}/SqlSyntaxHighlighter.cpp | 0 {pglab => src/pglab}/SqlSyntaxHighlighter.h | 0 {pglab => src/pglab}/TypeSelectionItemModel.cpp | 0 {pglab => src/pglab}/TypeSelectionItemModel.h | 0 {pglab => src/pglab}/icons/16x16/document_green.png | Bin {pglab => src/pglab}/icons/16x16/document_red.png | Bin .../pglab}/icons/16x16/document_yellow.png | Bin {pglab => src/pglab}/icons/about.png | Bin {pglab => src/pglab}/icons/add_connection.png | Bin {pglab => src/pglab}/icons/backup_database.png | Bin {pglab => src/pglab}/icons/delete_connection.png | Bin {pglab => src/pglab}/icons/desktop.ini | 0 {pglab => src/pglab}/icons/folder.png | Bin {pglab => src/pglab}/icons/lightbulb.png | Bin {pglab => src/pglab}/icons/lightbulb_off.png | Bin {pglab => src/pglab}/icons/manage_server.png | Bin {pglab => src/pglab}/icons/new_query_tab.png | Bin {pglab => src/pglab}/icons/open_query_window.png | Bin {pglab => src/pglab}/icons/page_white_add.png | Bin {pglab => src/pglab}/icons/page_white_copy.png | Bin {pglab => src/pglab}/icons/page_white_delete.png | Bin {pglab => src/pglab}/icons/script_delete.png | Bin {pglab => src/pglab}/icons/script_go.png | Bin {pglab => src/pglab}/icons/script_save.png | Bin {pglab => src/pglab}/icons/server_delete.png | Bin {pglab => src/pglab}/icons/server_edit.png | Bin {pglab => src/pglab}/icons/server_go.png | Bin {pglab => src/pglab}/icons/table_save.png | Bin .../pglab}/icons/token_shortland_character.png | Bin {pglab => src/pglab}/json/json-forwards.h | 0 {pglab => src/pglab}/json/json.h | 0 {pglab => src/pglab}/jsoncpp.cpp | 0 {pglab => src/pglab}/main.cpp | 0 {pglab => src/pglab}/pglab.ico | Bin {pglab => src/pglab}/resources.qrc | 0 {pglab => src/pglab}/src.pro | 0 {pglab => src/pglab}/stopwatch.cpp | 0 {pglab => src/pglab}/stopwatch.h | 0 {pglab => src/pglab}/tsqueue.cpp | 0 {pglab => src/pglab}/tsqueue.h | 0 {pglab => src/pglab}/tuplesresultwidget.cpp | 0 {pglab => src/pglab}/tuplesresultwidget.h | 0 {pglab => src/pglab}/tuplesresultwidget.ui | 0 {pglab => src/pglab}/util.cpp | 0 {pglab => src/pglab}/util.h | 0 {pgsql => src/pgsql}/Pgsql_Connection.cpp | 0 {pgsql => src/pgsql}/Pgsql_Connection.h | 0 {pgsql => src/pgsql}/Pgsql_Params.cpp | 0 {pgsql => src/pgsql}/Pgsql_Params.h | 0 {pgsql => src/pgsql}/Pgsql_Result.cpp | 0 {pgsql => src/pgsql}/Pgsql_Result.h | 0 {pgsql => src/pgsql}/Pgsql_Row.cpp | 0 {pgsql => src/pgsql}/Pgsql_Row.h | 0 {pgsql => src/pgsql}/Pgsql_Value.cpp | 0 {pgsql => src/pgsql}/Pgsql_Value.h | 0 {pgsql => src/pgsql}/Pgsql_declare.h | 0 {tests => src/tests}/main.cpp | 0 {tests => src/tests}/tst_CsvWriter.cpp | 0 {tests => src/tests}/tst_PasswordManager.cpp | 0 {tests => src/tests}/tst_SqlLexer.cpp | 0 {tests => src/tests}/tst_expected.cpp | 0 {tests => src/tests}/tst_scopeguard.cpp | 0 151 files changed, 1 insertion(+) rename CMakeLists.txt => src/CMakeLists.txt (100%) rename {core => src/core}/BackupFormatModel.cpp (100%) rename {core => src/core}/BackupFormatModel.h (100%) rename {core => src/core}/CsvWriter.cpp (100%) rename {core => src/core}/CsvWriter.h (100%) rename {core => src/core}/Expected.h (100%) rename {core => src/core}/PasswordManager.cpp (100%) rename {core => src/core}/PasswordManager.h (100%) rename {core => src/core}/ScopeGuard.h (100%) rename {core => src/core}/SqlLexer.cpp (100%) rename {core => src/core}/SqlLexer.h (100%) rename {core => src/core}/my_boost_assert_handler.cpp (100%) rename {pglab => src/pglab}/.gitignore (100%) rename {pglab => src/pglab}/ASyncDBConnection.cpp (100%) rename {pglab => src/pglab}/ASyncDBConnection.h (100%) rename {pglab => src/pglab}/ASyncWindow.cpp (100%) rename {pglab => src/pglab}/ASyncWindow.h (100%) rename {pglab => src/pglab}/BackupDialog.cpp (100%) rename {pglab => src/pglab}/BackupDialog.h (100%) rename {pglab => src/pglab}/BackupDialog.ui (100%) rename {pglab => src/pglab}/BackupRestore.cpp (100%) rename {pglab => src/pglab}/ConnectionConfig.cpp (100%) rename {pglab => src/pglab}/ConnectionConfig.h (100%) rename {pglab => src/pglab}/ConnectionList.cpp (100%) rename {pglab => src/pglab}/ConnectionList.h (100%) rename {pglab => src/pglab}/ConnectionListModel.cpp (100%) rename {pglab => src/pglab}/ConnectionListModel.h (100%) rename {pglab => src/pglab}/ConnectionManagerWindow.cpp (100%) rename {pglab => src/pglab}/ConnectionManagerWindow.h (100%) rename {pglab => src/pglab}/ConnectionManagerWindow.ui (100%) rename {pglab => src/pglab}/DatabaseInspectorWidget.cpp (100%) rename {pglab => src/pglab}/DatabaseInspectorWidget.h (100%) rename {pglab => src/pglab}/DatabaseInspectorWidget.ui (100%) rename {pglab => src/pglab}/DatabaseWindow.cpp (100%) rename {pglab => src/pglab}/DatabaseWindow.h (100%) rename {pglab => src/pglab}/DatabaseWindow.ui (100%) rename {pglab => src/pglab}/DatabasesTableModel.cpp (100%) rename {pglab => src/pglab}/DatabasesTableModel.h (100%) rename {pglab => src/pglab}/Doxyfile (100%) rename {pglab => src/pglab}/ExplainTreeModelItem.cpp (100%) rename {pglab => src/pglab}/ExplainTreeModelItem.h (100%) rename {pglab => src/pglab}/GlobalIoService.cpp (100%) rename {pglab => src/pglab}/GlobalIoService.h (100%) rename {pglab => src/pglab}/MainWindow.cpp (100%) rename {pglab => src/pglab}/MainWindow.h (100%) rename {pglab => src/pglab}/MainWindow.ui (100%) rename {pglab => src/pglab}/MasterController.cpp (100%) rename {pglab => src/pglab}/MasterController.h (100%) rename {pglab => src/pglab}/OpenDatabase.cpp (100%) rename {pglab => src/pglab}/OpenDatabase.h (100%) rename {pglab => src/pglab}/ParamListModel.cpp (100%) rename {pglab => src/pglab}/ParamListModel.h (100%) rename {pglab => src/pglab}/ParamTypeDelegate.cpp (100%) rename {pglab => src/pglab}/ParamTypeDelegate.h (100%) rename {pglab => src/pglab}/PgAuthId.cpp (100%) rename {pglab => src/pglab}/PgAuthId.h (100%) rename {pglab => src/pglab}/PgAuthIdContainer.cpp (100%) rename {pglab => src/pglab}/PgAuthIdContainer.h (100%) rename {pglab => src/pglab}/PgClass.cpp (100%) rename {pglab => src/pglab}/PgClass.h (100%) rename {pglab => src/pglab}/PgContainer.h (100%) rename {pglab => src/pglab}/PgDatabase.cpp (100%) rename {pglab => src/pglab}/PgDatabase.h (100%) rename {pglab => src/pglab}/PgDatabaseCatalogue.cpp (100%) rename {pglab => src/pglab}/PgDatabaseCatalogue.h (100%) rename {pglab => src/pglab}/PgDatabaseContainer.cpp (100%) rename {pglab => src/pglab}/PgDatabaseContainer.h (100%) rename {pglab => src/pglab}/PgNamespace.cpp (100%) rename {pglab => src/pglab}/PgNamespace.h (100%) rename {pglab => src/pglab}/PgType.cpp (100%) rename {pglab => src/pglab}/PgType.h (100%) rename {pglab => src/pglab}/PgTypeContainer.cpp (100%) rename {pglab => src/pglab}/PgTypeContainer.h (100%) rename {pglab => src/pglab}/ProcessStdioWidget.cpp (100%) rename {pglab => src/pglab}/ProcessStdioWidget.h (100%) rename {pglab => src/pglab}/ProcessStdioWidget.ui (100%) rename {pglab => src/pglab}/QueryExplainModel.cpp (100%) rename {pglab => src/pglab}/QueryExplainModel.h (100%) rename {pglab => src/pglab}/QueryResultModel.cpp (100%) rename {pglab => src/pglab}/QueryResultModel.h (100%) rename {pglab => src/pglab}/QueryTab.cpp (100%) rename {pglab => src/pglab}/QueryTab.h (100%) rename {pglab => src/pglab}/QueryTab.ui (100%) rename {pglab => src/pglab}/RolesTableModel.cpp (100%) rename {pglab => src/pglab}/RolesTableModel.h (100%) rename {pglab => src/pglab}/ServerWindow.cpp (100%) rename {pglab => src/pglab}/ServerWindow.h (100%) rename {pglab => src/pglab}/ServerWindow.ui (100%) rename {pglab => src/pglab}/SqlSyntaxHighlighter.cpp (100%) rename {pglab => src/pglab}/SqlSyntaxHighlighter.h (100%) rename {pglab => src/pglab}/TypeSelectionItemModel.cpp (100%) rename {pglab => src/pglab}/TypeSelectionItemModel.h (100%) rename {pglab => src/pglab}/icons/16x16/document_green.png (100%) rename {pglab => src/pglab}/icons/16x16/document_red.png (100%) rename {pglab => src/pglab}/icons/16x16/document_yellow.png (100%) rename {pglab => src/pglab}/icons/about.png (100%) rename {pglab => src/pglab}/icons/add_connection.png (100%) rename {pglab => src/pglab}/icons/backup_database.png (100%) rename {pglab => src/pglab}/icons/delete_connection.png (100%) rename {pglab => src/pglab}/icons/desktop.ini (100%) rename {pglab => src/pglab}/icons/folder.png (100%) rename {pglab => src/pglab}/icons/lightbulb.png (100%) rename {pglab => src/pglab}/icons/lightbulb_off.png (100%) rename {pglab => src/pglab}/icons/manage_server.png (100%) rename {pglab => src/pglab}/icons/new_query_tab.png (100%) rename {pglab => src/pglab}/icons/open_query_window.png (100%) rename {pglab => src/pglab}/icons/page_white_add.png (100%) rename {pglab => src/pglab}/icons/page_white_copy.png (100%) rename {pglab => src/pglab}/icons/page_white_delete.png (100%) rename {pglab => src/pglab}/icons/script_delete.png (100%) rename {pglab => src/pglab}/icons/script_go.png (100%) rename {pglab => src/pglab}/icons/script_save.png (100%) rename {pglab => src/pglab}/icons/server_delete.png (100%) rename {pglab => src/pglab}/icons/server_edit.png (100%) rename {pglab => src/pglab}/icons/server_go.png (100%) rename {pglab => src/pglab}/icons/table_save.png (100%) rename {pglab => src/pglab}/icons/token_shortland_character.png (100%) rename {pglab => src/pglab}/json/json-forwards.h (100%) rename {pglab => src/pglab}/json/json.h (100%) rename {pglab => src/pglab}/jsoncpp.cpp (100%) rename {pglab => src/pglab}/main.cpp (100%) rename {pglab => src/pglab}/pglab.ico (100%) rename {pglab => src/pglab}/resources.qrc (100%) rename {pglab => src/pglab}/src.pro (100%) rename {pglab => src/pglab}/stopwatch.cpp (100%) rename {pglab => src/pglab}/stopwatch.h (100%) rename {pglab => src/pglab}/tsqueue.cpp (100%) rename {pglab => src/pglab}/tsqueue.h (100%) rename {pglab => src/pglab}/tuplesresultwidget.cpp (100%) rename {pglab => src/pglab}/tuplesresultwidget.h (100%) rename {pglab => src/pglab}/tuplesresultwidget.ui (100%) rename {pglab => src/pglab}/util.cpp (100%) rename {pglab => src/pglab}/util.h (100%) rename {pgsql => src/pgsql}/Pgsql_Connection.cpp (100%) rename {pgsql => src/pgsql}/Pgsql_Connection.h (100%) rename {pgsql => src/pgsql}/Pgsql_Params.cpp (100%) rename {pgsql => src/pgsql}/Pgsql_Params.h (100%) rename {pgsql => src/pgsql}/Pgsql_Result.cpp (100%) rename {pgsql => src/pgsql}/Pgsql_Result.h (100%) rename {pgsql => src/pgsql}/Pgsql_Row.cpp (100%) rename {pgsql => src/pgsql}/Pgsql_Row.h (100%) rename {pgsql => src/pgsql}/Pgsql_Value.cpp (100%) rename {pgsql => src/pgsql}/Pgsql_Value.h (100%) rename {pgsql => src/pgsql}/Pgsql_declare.h (100%) rename {tests => src/tests}/main.cpp (100%) rename {tests => src/tests}/tst_CsvWriter.cpp (100%) rename {tests => src/tests}/tst_PasswordManager.cpp (100%) rename {tests => src/tests}/tst_SqlLexer.cpp (100%) rename {tests => src/tests}/tst_expected.cpp (100%) rename {tests => src/tests}/tst_scopeguard.cpp (100%) diff --git a/.gitignore b/.gitignore index 1377554..85f404f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.swp +build/* diff --git a/CMakeLists.txt b/src/CMakeLists.txt similarity index 100% rename from CMakeLists.txt rename to src/CMakeLists.txt diff --git a/core/BackupFormatModel.cpp b/src/core/BackupFormatModel.cpp similarity index 100% rename from core/BackupFormatModel.cpp rename to src/core/BackupFormatModel.cpp diff --git a/core/BackupFormatModel.h b/src/core/BackupFormatModel.h similarity index 100% rename from core/BackupFormatModel.h rename to src/core/BackupFormatModel.h diff --git a/core/CsvWriter.cpp b/src/core/CsvWriter.cpp similarity index 100% rename from core/CsvWriter.cpp rename to src/core/CsvWriter.cpp diff --git a/core/CsvWriter.h b/src/core/CsvWriter.h similarity index 100% rename from core/CsvWriter.h rename to src/core/CsvWriter.h diff --git a/core/Expected.h b/src/core/Expected.h similarity index 100% rename from core/Expected.h rename to src/core/Expected.h diff --git a/core/PasswordManager.cpp b/src/core/PasswordManager.cpp similarity index 100% rename from core/PasswordManager.cpp rename to src/core/PasswordManager.cpp diff --git a/core/PasswordManager.h b/src/core/PasswordManager.h similarity index 100% rename from core/PasswordManager.h rename to src/core/PasswordManager.h diff --git a/core/ScopeGuard.h b/src/core/ScopeGuard.h similarity index 100% rename from core/ScopeGuard.h rename to src/core/ScopeGuard.h diff --git a/core/SqlLexer.cpp b/src/core/SqlLexer.cpp similarity index 100% rename from core/SqlLexer.cpp rename to src/core/SqlLexer.cpp diff --git a/core/SqlLexer.h b/src/core/SqlLexer.h similarity index 100% rename from core/SqlLexer.h rename to src/core/SqlLexer.h diff --git a/core/my_boost_assert_handler.cpp b/src/core/my_boost_assert_handler.cpp similarity index 100% rename from core/my_boost_assert_handler.cpp rename to src/core/my_boost_assert_handler.cpp diff --git a/pglab/.gitignore b/src/pglab/.gitignore similarity index 100% rename from pglab/.gitignore rename to src/pglab/.gitignore diff --git a/pglab/ASyncDBConnection.cpp b/src/pglab/ASyncDBConnection.cpp similarity index 100% rename from pglab/ASyncDBConnection.cpp rename to src/pglab/ASyncDBConnection.cpp diff --git a/pglab/ASyncDBConnection.h b/src/pglab/ASyncDBConnection.h similarity index 100% rename from pglab/ASyncDBConnection.h rename to src/pglab/ASyncDBConnection.h diff --git a/pglab/ASyncWindow.cpp b/src/pglab/ASyncWindow.cpp similarity index 100% rename from pglab/ASyncWindow.cpp rename to src/pglab/ASyncWindow.cpp diff --git a/pglab/ASyncWindow.h b/src/pglab/ASyncWindow.h similarity index 100% rename from pglab/ASyncWindow.h rename to src/pglab/ASyncWindow.h diff --git a/pglab/BackupDialog.cpp b/src/pglab/BackupDialog.cpp similarity index 100% rename from pglab/BackupDialog.cpp rename to src/pglab/BackupDialog.cpp diff --git a/pglab/BackupDialog.h b/src/pglab/BackupDialog.h similarity index 100% rename from pglab/BackupDialog.h rename to src/pglab/BackupDialog.h diff --git a/pglab/BackupDialog.ui b/src/pglab/BackupDialog.ui similarity index 100% rename from pglab/BackupDialog.ui rename to src/pglab/BackupDialog.ui diff --git a/pglab/BackupRestore.cpp b/src/pglab/BackupRestore.cpp similarity index 100% rename from pglab/BackupRestore.cpp rename to src/pglab/BackupRestore.cpp diff --git a/pglab/ConnectionConfig.cpp b/src/pglab/ConnectionConfig.cpp similarity index 100% rename from pglab/ConnectionConfig.cpp rename to src/pglab/ConnectionConfig.cpp diff --git a/pglab/ConnectionConfig.h b/src/pglab/ConnectionConfig.h similarity index 100% rename from pglab/ConnectionConfig.h rename to src/pglab/ConnectionConfig.h diff --git a/pglab/ConnectionList.cpp b/src/pglab/ConnectionList.cpp similarity index 100% rename from pglab/ConnectionList.cpp rename to src/pglab/ConnectionList.cpp diff --git a/pglab/ConnectionList.h b/src/pglab/ConnectionList.h similarity index 100% rename from pglab/ConnectionList.h rename to src/pglab/ConnectionList.h diff --git a/pglab/ConnectionListModel.cpp b/src/pglab/ConnectionListModel.cpp similarity index 100% rename from pglab/ConnectionListModel.cpp rename to src/pglab/ConnectionListModel.cpp diff --git a/pglab/ConnectionListModel.h b/src/pglab/ConnectionListModel.h similarity index 100% rename from pglab/ConnectionListModel.h rename to src/pglab/ConnectionListModel.h diff --git a/pglab/ConnectionManagerWindow.cpp b/src/pglab/ConnectionManagerWindow.cpp similarity index 100% rename from pglab/ConnectionManagerWindow.cpp rename to src/pglab/ConnectionManagerWindow.cpp diff --git a/pglab/ConnectionManagerWindow.h b/src/pglab/ConnectionManagerWindow.h similarity index 100% rename from pglab/ConnectionManagerWindow.h rename to src/pglab/ConnectionManagerWindow.h diff --git a/pglab/ConnectionManagerWindow.ui b/src/pglab/ConnectionManagerWindow.ui similarity index 100% rename from pglab/ConnectionManagerWindow.ui rename to src/pglab/ConnectionManagerWindow.ui diff --git a/pglab/DatabaseInspectorWidget.cpp b/src/pglab/DatabaseInspectorWidget.cpp similarity index 100% rename from pglab/DatabaseInspectorWidget.cpp rename to src/pglab/DatabaseInspectorWidget.cpp diff --git a/pglab/DatabaseInspectorWidget.h b/src/pglab/DatabaseInspectorWidget.h similarity index 100% rename from pglab/DatabaseInspectorWidget.h rename to src/pglab/DatabaseInspectorWidget.h diff --git a/pglab/DatabaseInspectorWidget.ui b/src/pglab/DatabaseInspectorWidget.ui similarity index 100% rename from pglab/DatabaseInspectorWidget.ui rename to src/pglab/DatabaseInspectorWidget.ui diff --git a/pglab/DatabaseWindow.cpp b/src/pglab/DatabaseWindow.cpp similarity index 100% rename from pglab/DatabaseWindow.cpp rename to src/pglab/DatabaseWindow.cpp diff --git a/pglab/DatabaseWindow.h b/src/pglab/DatabaseWindow.h similarity index 100% rename from pglab/DatabaseWindow.h rename to src/pglab/DatabaseWindow.h diff --git a/pglab/DatabaseWindow.ui b/src/pglab/DatabaseWindow.ui similarity index 100% rename from pglab/DatabaseWindow.ui rename to src/pglab/DatabaseWindow.ui diff --git a/pglab/DatabasesTableModel.cpp b/src/pglab/DatabasesTableModel.cpp similarity index 100% rename from pglab/DatabasesTableModel.cpp rename to src/pglab/DatabasesTableModel.cpp diff --git a/pglab/DatabasesTableModel.h b/src/pglab/DatabasesTableModel.h similarity index 100% rename from pglab/DatabasesTableModel.h rename to src/pglab/DatabasesTableModel.h diff --git a/pglab/Doxyfile b/src/pglab/Doxyfile similarity index 100% rename from pglab/Doxyfile rename to src/pglab/Doxyfile diff --git a/pglab/ExplainTreeModelItem.cpp b/src/pglab/ExplainTreeModelItem.cpp similarity index 100% rename from pglab/ExplainTreeModelItem.cpp rename to src/pglab/ExplainTreeModelItem.cpp diff --git a/pglab/ExplainTreeModelItem.h b/src/pglab/ExplainTreeModelItem.h similarity index 100% rename from pglab/ExplainTreeModelItem.h rename to src/pglab/ExplainTreeModelItem.h diff --git a/pglab/GlobalIoService.cpp b/src/pglab/GlobalIoService.cpp similarity index 100% rename from pglab/GlobalIoService.cpp rename to src/pglab/GlobalIoService.cpp diff --git a/pglab/GlobalIoService.h b/src/pglab/GlobalIoService.h similarity index 100% rename from pglab/GlobalIoService.h rename to src/pglab/GlobalIoService.h diff --git a/pglab/MainWindow.cpp b/src/pglab/MainWindow.cpp similarity index 100% rename from pglab/MainWindow.cpp rename to src/pglab/MainWindow.cpp diff --git a/pglab/MainWindow.h b/src/pglab/MainWindow.h similarity index 100% rename from pglab/MainWindow.h rename to src/pglab/MainWindow.h diff --git a/pglab/MainWindow.ui b/src/pglab/MainWindow.ui similarity index 100% rename from pglab/MainWindow.ui rename to src/pglab/MainWindow.ui diff --git a/pglab/MasterController.cpp b/src/pglab/MasterController.cpp similarity index 100% rename from pglab/MasterController.cpp rename to src/pglab/MasterController.cpp diff --git a/pglab/MasterController.h b/src/pglab/MasterController.h similarity index 100% rename from pglab/MasterController.h rename to src/pglab/MasterController.h diff --git a/pglab/OpenDatabase.cpp b/src/pglab/OpenDatabase.cpp similarity index 100% rename from pglab/OpenDatabase.cpp rename to src/pglab/OpenDatabase.cpp diff --git a/pglab/OpenDatabase.h b/src/pglab/OpenDatabase.h similarity index 100% rename from pglab/OpenDatabase.h rename to src/pglab/OpenDatabase.h diff --git a/pglab/ParamListModel.cpp b/src/pglab/ParamListModel.cpp similarity index 100% rename from pglab/ParamListModel.cpp rename to src/pglab/ParamListModel.cpp diff --git a/pglab/ParamListModel.h b/src/pglab/ParamListModel.h similarity index 100% rename from pglab/ParamListModel.h rename to src/pglab/ParamListModel.h diff --git a/pglab/ParamTypeDelegate.cpp b/src/pglab/ParamTypeDelegate.cpp similarity index 100% rename from pglab/ParamTypeDelegate.cpp rename to src/pglab/ParamTypeDelegate.cpp diff --git a/pglab/ParamTypeDelegate.h b/src/pglab/ParamTypeDelegate.h similarity index 100% rename from pglab/ParamTypeDelegate.h rename to src/pglab/ParamTypeDelegate.h diff --git a/pglab/PgAuthId.cpp b/src/pglab/PgAuthId.cpp similarity index 100% rename from pglab/PgAuthId.cpp rename to src/pglab/PgAuthId.cpp diff --git a/pglab/PgAuthId.h b/src/pglab/PgAuthId.h similarity index 100% rename from pglab/PgAuthId.h rename to src/pglab/PgAuthId.h diff --git a/pglab/PgAuthIdContainer.cpp b/src/pglab/PgAuthIdContainer.cpp similarity index 100% rename from pglab/PgAuthIdContainer.cpp rename to src/pglab/PgAuthIdContainer.cpp diff --git a/pglab/PgAuthIdContainer.h b/src/pglab/PgAuthIdContainer.h similarity index 100% rename from pglab/PgAuthIdContainer.h rename to src/pglab/PgAuthIdContainer.h diff --git a/pglab/PgClass.cpp b/src/pglab/PgClass.cpp similarity index 100% rename from pglab/PgClass.cpp rename to src/pglab/PgClass.cpp diff --git a/pglab/PgClass.h b/src/pglab/PgClass.h similarity index 100% rename from pglab/PgClass.h rename to src/pglab/PgClass.h diff --git a/pglab/PgContainer.h b/src/pglab/PgContainer.h similarity index 100% rename from pglab/PgContainer.h rename to src/pglab/PgContainer.h diff --git a/pglab/PgDatabase.cpp b/src/pglab/PgDatabase.cpp similarity index 100% rename from pglab/PgDatabase.cpp rename to src/pglab/PgDatabase.cpp diff --git a/pglab/PgDatabase.h b/src/pglab/PgDatabase.h similarity index 100% rename from pglab/PgDatabase.h rename to src/pglab/PgDatabase.h diff --git a/pglab/PgDatabaseCatalogue.cpp b/src/pglab/PgDatabaseCatalogue.cpp similarity index 100% rename from pglab/PgDatabaseCatalogue.cpp rename to src/pglab/PgDatabaseCatalogue.cpp diff --git a/pglab/PgDatabaseCatalogue.h b/src/pglab/PgDatabaseCatalogue.h similarity index 100% rename from pglab/PgDatabaseCatalogue.h rename to src/pglab/PgDatabaseCatalogue.h diff --git a/pglab/PgDatabaseContainer.cpp b/src/pglab/PgDatabaseContainer.cpp similarity index 100% rename from pglab/PgDatabaseContainer.cpp rename to src/pglab/PgDatabaseContainer.cpp diff --git a/pglab/PgDatabaseContainer.h b/src/pglab/PgDatabaseContainer.h similarity index 100% rename from pglab/PgDatabaseContainer.h rename to src/pglab/PgDatabaseContainer.h diff --git a/pglab/PgNamespace.cpp b/src/pglab/PgNamespace.cpp similarity index 100% rename from pglab/PgNamespace.cpp rename to src/pglab/PgNamespace.cpp diff --git a/pglab/PgNamespace.h b/src/pglab/PgNamespace.h similarity index 100% rename from pglab/PgNamespace.h rename to src/pglab/PgNamespace.h diff --git a/pglab/PgType.cpp b/src/pglab/PgType.cpp similarity index 100% rename from pglab/PgType.cpp rename to src/pglab/PgType.cpp diff --git a/pglab/PgType.h b/src/pglab/PgType.h similarity index 100% rename from pglab/PgType.h rename to src/pglab/PgType.h diff --git a/pglab/PgTypeContainer.cpp b/src/pglab/PgTypeContainer.cpp similarity index 100% rename from pglab/PgTypeContainer.cpp rename to src/pglab/PgTypeContainer.cpp diff --git a/pglab/PgTypeContainer.h b/src/pglab/PgTypeContainer.h similarity index 100% rename from pglab/PgTypeContainer.h rename to src/pglab/PgTypeContainer.h diff --git a/pglab/ProcessStdioWidget.cpp b/src/pglab/ProcessStdioWidget.cpp similarity index 100% rename from pglab/ProcessStdioWidget.cpp rename to src/pglab/ProcessStdioWidget.cpp diff --git a/pglab/ProcessStdioWidget.h b/src/pglab/ProcessStdioWidget.h similarity index 100% rename from pglab/ProcessStdioWidget.h rename to src/pglab/ProcessStdioWidget.h diff --git a/pglab/ProcessStdioWidget.ui b/src/pglab/ProcessStdioWidget.ui similarity index 100% rename from pglab/ProcessStdioWidget.ui rename to src/pglab/ProcessStdioWidget.ui diff --git a/pglab/QueryExplainModel.cpp b/src/pglab/QueryExplainModel.cpp similarity index 100% rename from pglab/QueryExplainModel.cpp rename to src/pglab/QueryExplainModel.cpp diff --git a/pglab/QueryExplainModel.h b/src/pglab/QueryExplainModel.h similarity index 100% rename from pglab/QueryExplainModel.h rename to src/pglab/QueryExplainModel.h diff --git a/pglab/QueryResultModel.cpp b/src/pglab/QueryResultModel.cpp similarity index 100% rename from pglab/QueryResultModel.cpp rename to src/pglab/QueryResultModel.cpp diff --git a/pglab/QueryResultModel.h b/src/pglab/QueryResultModel.h similarity index 100% rename from pglab/QueryResultModel.h rename to src/pglab/QueryResultModel.h diff --git a/pglab/QueryTab.cpp b/src/pglab/QueryTab.cpp similarity index 100% rename from pglab/QueryTab.cpp rename to src/pglab/QueryTab.cpp diff --git a/pglab/QueryTab.h b/src/pglab/QueryTab.h similarity index 100% rename from pglab/QueryTab.h rename to src/pglab/QueryTab.h diff --git a/pglab/QueryTab.ui b/src/pglab/QueryTab.ui similarity index 100% rename from pglab/QueryTab.ui rename to src/pglab/QueryTab.ui diff --git a/pglab/RolesTableModel.cpp b/src/pglab/RolesTableModel.cpp similarity index 100% rename from pglab/RolesTableModel.cpp rename to src/pglab/RolesTableModel.cpp diff --git a/pglab/RolesTableModel.h b/src/pglab/RolesTableModel.h similarity index 100% rename from pglab/RolesTableModel.h rename to src/pglab/RolesTableModel.h diff --git a/pglab/ServerWindow.cpp b/src/pglab/ServerWindow.cpp similarity index 100% rename from pglab/ServerWindow.cpp rename to src/pglab/ServerWindow.cpp diff --git a/pglab/ServerWindow.h b/src/pglab/ServerWindow.h similarity index 100% rename from pglab/ServerWindow.h rename to src/pglab/ServerWindow.h diff --git a/pglab/ServerWindow.ui b/src/pglab/ServerWindow.ui similarity index 100% rename from pglab/ServerWindow.ui rename to src/pglab/ServerWindow.ui diff --git a/pglab/SqlSyntaxHighlighter.cpp b/src/pglab/SqlSyntaxHighlighter.cpp similarity index 100% rename from pglab/SqlSyntaxHighlighter.cpp rename to src/pglab/SqlSyntaxHighlighter.cpp diff --git a/pglab/SqlSyntaxHighlighter.h b/src/pglab/SqlSyntaxHighlighter.h similarity index 100% rename from pglab/SqlSyntaxHighlighter.h rename to src/pglab/SqlSyntaxHighlighter.h diff --git a/pglab/TypeSelectionItemModel.cpp b/src/pglab/TypeSelectionItemModel.cpp similarity index 100% rename from pglab/TypeSelectionItemModel.cpp rename to src/pglab/TypeSelectionItemModel.cpp diff --git a/pglab/TypeSelectionItemModel.h b/src/pglab/TypeSelectionItemModel.h similarity index 100% rename from pglab/TypeSelectionItemModel.h rename to src/pglab/TypeSelectionItemModel.h diff --git a/pglab/icons/16x16/document_green.png b/src/pglab/icons/16x16/document_green.png similarity index 100% rename from pglab/icons/16x16/document_green.png rename to src/pglab/icons/16x16/document_green.png diff --git a/pglab/icons/16x16/document_red.png b/src/pglab/icons/16x16/document_red.png similarity index 100% rename from pglab/icons/16x16/document_red.png rename to src/pglab/icons/16x16/document_red.png diff --git a/pglab/icons/16x16/document_yellow.png b/src/pglab/icons/16x16/document_yellow.png similarity index 100% rename from pglab/icons/16x16/document_yellow.png rename to src/pglab/icons/16x16/document_yellow.png diff --git a/pglab/icons/about.png b/src/pglab/icons/about.png similarity index 100% rename from pglab/icons/about.png rename to src/pglab/icons/about.png diff --git a/pglab/icons/add_connection.png b/src/pglab/icons/add_connection.png similarity index 100% rename from pglab/icons/add_connection.png rename to src/pglab/icons/add_connection.png diff --git a/pglab/icons/backup_database.png b/src/pglab/icons/backup_database.png similarity index 100% rename from pglab/icons/backup_database.png rename to src/pglab/icons/backup_database.png diff --git a/pglab/icons/delete_connection.png b/src/pglab/icons/delete_connection.png similarity index 100% rename from pglab/icons/delete_connection.png rename to src/pglab/icons/delete_connection.png diff --git a/pglab/icons/desktop.ini b/src/pglab/icons/desktop.ini similarity index 100% rename from pglab/icons/desktop.ini rename to src/pglab/icons/desktop.ini diff --git a/pglab/icons/folder.png b/src/pglab/icons/folder.png similarity index 100% rename from pglab/icons/folder.png rename to src/pglab/icons/folder.png diff --git a/pglab/icons/lightbulb.png b/src/pglab/icons/lightbulb.png similarity index 100% rename from pglab/icons/lightbulb.png rename to src/pglab/icons/lightbulb.png diff --git a/pglab/icons/lightbulb_off.png b/src/pglab/icons/lightbulb_off.png similarity index 100% rename from pglab/icons/lightbulb_off.png rename to src/pglab/icons/lightbulb_off.png diff --git a/pglab/icons/manage_server.png b/src/pglab/icons/manage_server.png similarity index 100% rename from pglab/icons/manage_server.png rename to src/pglab/icons/manage_server.png diff --git a/pglab/icons/new_query_tab.png b/src/pglab/icons/new_query_tab.png similarity index 100% rename from pglab/icons/new_query_tab.png rename to src/pglab/icons/new_query_tab.png diff --git a/pglab/icons/open_query_window.png b/src/pglab/icons/open_query_window.png similarity index 100% rename from pglab/icons/open_query_window.png rename to src/pglab/icons/open_query_window.png diff --git a/pglab/icons/page_white_add.png b/src/pglab/icons/page_white_add.png similarity index 100% rename from pglab/icons/page_white_add.png rename to src/pglab/icons/page_white_add.png diff --git a/pglab/icons/page_white_copy.png b/src/pglab/icons/page_white_copy.png similarity index 100% rename from pglab/icons/page_white_copy.png rename to src/pglab/icons/page_white_copy.png diff --git a/pglab/icons/page_white_delete.png b/src/pglab/icons/page_white_delete.png similarity index 100% rename from pglab/icons/page_white_delete.png rename to src/pglab/icons/page_white_delete.png diff --git a/pglab/icons/script_delete.png b/src/pglab/icons/script_delete.png similarity index 100% rename from pglab/icons/script_delete.png rename to src/pglab/icons/script_delete.png diff --git a/pglab/icons/script_go.png b/src/pglab/icons/script_go.png similarity index 100% rename from pglab/icons/script_go.png rename to src/pglab/icons/script_go.png diff --git a/pglab/icons/script_save.png b/src/pglab/icons/script_save.png similarity index 100% rename from pglab/icons/script_save.png rename to src/pglab/icons/script_save.png diff --git a/pglab/icons/server_delete.png b/src/pglab/icons/server_delete.png similarity index 100% rename from pglab/icons/server_delete.png rename to src/pglab/icons/server_delete.png diff --git a/pglab/icons/server_edit.png b/src/pglab/icons/server_edit.png similarity index 100% rename from pglab/icons/server_edit.png rename to src/pglab/icons/server_edit.png diff --git a/pglab/icons/server_go.png b/src/pglab/icons/server_go.png similarity index 100% rename from pglab/icons/server_go.png rename to src/pglab/icons/server_go.png diff --git a/pglab/icons/table_save.png b/src/pglab/icons/table_save.png similarity index 100% rename from pglab/icons/table_save.png rename to src/pglab/icons/table_save.png diff --git a/pglab/icons/token_shortland_character.png b/src/pglab/icons/token_shortland_character.png similarity index 100% rename from pglab/icons/token_shortland_character.png rename to src/pglab/icons/token_shortland_character.png diff --git a/pglab/json/json-forwards.h b/src/pglab/json/json-forwards.h similarity index 100% rename from pglab/json/json-forwards.h rename to src/pglab/json/json-forwards.h diff --git a/pglab/json/json.h b/src/pglab/json/json.h similarity index 100% rename from pglab/json/json.h rename to src/pglab/json/json.h diff --git a/pglab/jsoncpp.cpp b/src/pglab/jsoncpp.cpp similarity index 100% rename from pglab/jsoncpp.cpp rename to src/pglab/jsoncpp.cpp diff --git a/pglab/main.cpp b/src/pglab/main.cpp similarity index 100% rename from pglab/main.cpp rename to src/pglab/main.cpp diff --git a/pglab/pglab.ico b/src/pglab/pglab.ico similarity index 100% rename from pglab/pglab.ico rename to src/pglab/pglab.ico diff --git a/pglab/resources.qrc b/src/pglab/resources.qrc similarity index 100% rename from pglab/resources.qrc rename to src/pglab/resources.qrc diff --git a/pglab/src.pro b/src/pglab/src.pro similarity index 100% rename from pglab/src.pro rename to src/pglab/src.pro diff --git a/pglab/stopwatch.cpp b/src/pglab/stopwatch.cpp similarity index 100% rename from pglab/stopwatch.cpp rename to src/pglab/stopwatch.cpp diff --git a/pglab/stopwatch.h b/src/pglab/stopwatch.h similarity index 100% rename from pglab/stopwatch.h rename to src/pglab/stopwatch.h diff --git a/pglab/tsqueue.cpp b/src/pglab/tsqueue.cpp similarity index 100% rename from pglab/tsqueue.cpp rename to src/pglab/tsqueue.cpp diff --git a/pglab/tsqueue.h b/src/pglab/tsqueue.h similarity index 100% rename from pglab/tsqueue.h rename to src/pglab/tsqueue.h diff --git a/pglab/tuplesresultwidget.cpp b/src/pglab/tuplesresultwidget.cpp similarity index 100% rename from pglab/tuplesresultwidget.cpp rename to src/pglab/tuplesresultwidget.cpp diff --git a/pglab/tuplesresultwidget.h b/src/pglab/tuplesresultwidget.h similarity index 100% rename from pglab/tuplesresultwidget.h rename to src/pglab/tuplesresultwidget.h diff --git a/pglab/tuplesresultwidget.ui b/src/pglab/tuplesresultwidget.ui similarity index 100% rename from pglab/tuplesresultwidget.ui rename to src/pglab/tuplesresultwidget.ui diff --git a/pglab/util.cpp b/src/pglab/util.cpp similarity index 100% rename from pglab/util.cpp rename to src/pglab/util.cpp diff --git a/pglab/util.h b/src/pglab/util.h similarity index 100% rename from pglab/util.h rename to src/pglab/util.h diff --git a/pgsql/Pgsql_Connection.cpp b/src/pgsql/Pgsql_Connection.cpp similarity index 100% rename from pgsql/Pgsql_Connection.cpp rename to src/pgsql/Pgsql_Connection.cpp diff --git a/pgsql/Pgsql_Connection.h b/src/pgsql/Pgsql_Connection.h similarity index 100% rename from pgsql/Pgsql_Connection.h rename to src/pgsql/Pgsql_Connection.h diff --git a/pgsql/Pgsql_Params.cpp b/src/pgsql/Pgsql_Params.cpp similarity index 100% rename from pgsql/Pgsql_Params.cpp rename to src/pgsql/Pgsql_Params.cpp diff --git a/pgsql/Pgsql_Params.h b/src/pgsql/Pgsql_Params.h similarity index 100% rename from pgsql/Pgsql_Params.h rename to src/pgsql/Pgsql_Params.h diff --git a/pgsql/Pgsql_Result.cpp b/src/pgsql/Pgsql_Result.cpp similarity index 100% rename from pgsql/Pgsql_Result.cpp rename to src/pgsql/Pgsql_Result.cpp diff --git a/pgsql/Pgsql_Result.h b/src/pgsql/Pgsql_Result.h similarity index 100% rename from pgsql/Pgsql_Result.h rename to src/pgsql/Pgsql_Result.h diff --git a/pgsql/Pgsql_Row.cpp b/src/pgsql/Pgsql_Row.cpp similarity index 100% rename from pgsql/Pgsql_Row.cpp rename to src/pgsql/Pgsql_Row.cpp diff --git a/pgsql/Pgsql_Row.h b/src/pgsql/Pgsql_Row.h similarity index 100% rename from pgsql/Pgsql_Row.h rename to src/pgsql/Pgsql_Row.h diff --git a/pgsql/Pgsql_Value.cpp b/src/pgsql/Pgsql_Value.cpp similarity index 100% rename from pgsql/Pgsql_Value.cpp rename to src/pgsql/Pgsql_Value.cpp diff --git a/pgsql/Pgsql_Value.h b/src/pgsql/Pgsql_Value.h similarity index 100% rename from pgsql/Pgsql_Value.h rename to src/pgsql/Pgsql_Value.h diff --git a/pgsql/Pgsql_declare.h b/src/pgsql/Pgsql_declare.h similarity index 100% rename from pgsql/Pgsql_declare.h rename to src/pgsql/Pgsql_declare.h diff --git a/tests/main.cpp b/src/tests/main.cpp similarity index 100% rename from tests/main.cpp rename to src/tests/main.cpp diff --git a/tests/tst_CsvWriter.cpp b/src/tests/tst_CsvWriter.cpp similarity index 100% rename from tests/tst_CsvWriter.cpp rename to src/tests/tst_CsvWriter.cpp diff --git a/tests/tst_PasswordManager.cpp b/src/tests/tst_PasswordManager.cpp similarity index 100% rename from tests/tst_PasswordManager.cpp rename to src/tests/tst_PasswordManager.cpp diff --git a/tests/tst_SqlLexer.cpp b/src/tests/tst_SqlLexer.cpp similarity index 100% rename from tests/tst_SqlLexer.cpp rename to src/tests/tst_SqlLexer.cpp diff --git a/tests/tst_expected.cpp b/src/tests/tst_expected.cpp similarity index 100% rename from tests/tst_expected.cpp rename to src/tests/tst_expected.cpp diff --git a/tests/tst_scopeguard.cpp b/src/tests/tst_scopeguard.cpp similarity index 100% rename from tests/tst_scopeguard.cpp rename to src/tests/tst_scopeguard.cpp From f32b7370dc15e6fd63ac2fd5fb58fae1523aae8e Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 27 Aug 2017 13:25:16 +0200 Subject: [PATCH 18/34] Switched to CMakeLists.txt per directory but most detecting is still done in global one. Includes and libraries are properly propagated using PUBLIC/INTERFACE so we do not have to repeat dependencies. --- src/CMakeLists.txt | 179 +++++++----------------------- src/cmake/Modules/FindBotan.cmake | 46 ++++++++ src/core/CMakeLists.txt | 23 ++++ src/pglab/CMakeLists.txt | 68 ++++++++++++ src/pgsql/CMakeLists.txt | 22 ++++ src/tests/CMakeLists.txt | 16 +++ 6 files changed, 216 insertions(+), 138 deletions(-) create mode 100644 src/cmake/Modules/FindBotan.cmake create mode 100644 src/core/CMakeLists.txt create mode 100644 src/pglab/CMakeLists.txt create mode 100644 src/pgsql/CMakeLists.txt create mode 100644 src/tests/CMakeLists.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 88a3cec..2e34c4d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,159 +1,62 @@ -cmake_minimum_required(VERSION 3.1.0) -project(pglaball) +cmake_minimum_required(VERSION 3.2 FATAL_ERROR) +project(pglaball VERSION 0.1 LANGUAGES CXX) set (CMAKE_PREFIX_PATH /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -find_package(PkgConfig REQUIRED) - -# include(CheckCXXCompilerFlag) -# -# # Check for standard to use -# check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) -# if(HAVE_FLAG_STD_CXX17) -# # Have -std=c++17, use it -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") -# else() -# check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) -# if(HAVE_FLAG_STD_CXX1Z) -# # Have -std=c++1z, use it -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") -# else() -# check_cxx_compiler_flag(-std=c++14 HAVE_FLAG_STD_CXX14) -# if(HAVE_FLAG_STD_CXX14) -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") -# endif() -# -# # And so on and on... -# endif() -# endif() +# Must use GNUInstallDirs to install libraries into correct +# locations on all platforms. +include(GNUInstallDirs) set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -add_compile_options( -Wall -fpic -march=native ) -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") +# set(CMAKE_CXX_STANDARD 14) +# set(CMAKE_CXX_STANDARD_REQUIRED ON) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) -set(CMAKE_AUTORCC ON) -pkg_check_modules(Botan REQUIRED botan-2) -include_directories( ${Botan_INCLUDE_DIRS} ) -pkg_check_modules(Pq REQUIRED libpq) -include_directories( ${Pq_INCLUDE_DIRS} ) +find_package(Botan REQUIRED) +add_library(botan UNKNOWN IMPORTED) +set_property(TARGET botan PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${BOTAN_INCLUDE_DIRS}) +set_property(TARGET botan PROPERTY IMPORTED_LOCATION ${BOTAN_LIBRARIES}) + +find_package(PostgreSQL REQUIRED) +add_library(postgresql UNKNOWN IMPORTED) +set_property(TARGET postgresql PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PostgreSQL_INCLUDE_DIRS}) +set_property(TARGET postgresql PROPERTY IMPORTED_LOCATION ${PostgreSQL_LIBRARIES}) find_package(Qt5Widgets 5.7 REQUIRED) -include_directories( ${Qt5Widgets_INCLUDE_DIRS} ) +add_library(Qt5Widgets INTERFACE IMPORTED) +set_property(TARGET Qt5Widgets PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${Qt5Widgets_INCLUDE_DIRS}) -find_package(fmt 4.0 REQUIRED) -include_directories( ${fmt_INCLUDE_DIRS} ) - -#find_package(Libevent 2.0 REQUIRED) -#include_directories( ${Libevent_INCLUDE_DIRS} ) +find_package(Fmt 4.0 REQUIRED) +add_library(fmt INTERFACE IMPORTED) +set_property(TARGET fmt PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${fmt_INCLUDE_DIRS}) find_package(Boost 1.63 COMPONENTS system REQUIRED ) -include_directories( ${Boost_INCLUDE_DIRS} ) +add_library(boost INTERFACE IMPORTED) +set_property(TARGET boost PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR}) + +add_library(boost-system SHARED IMPORTED) +set_property(TARGET boost-system PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIRS}) +set_property(TARGET boost-system PROPERTY IMPORTED_LOCATION ${Boost_SYSTEM_LIBRARY}) find_package(GTest REQUIRED) +add_library(gtest UNKNOWN IMPORTED) +set_property(TARGET gtest PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIRS}) +set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${GTEST_LIBRARIES}) - -add_library(core STATIC - core/BackupFormatModel.cpp - core/CsvWriter.cpp - core/my_boost_assert_handler.cpp - core/PasswordManager.cpp - core/SqlLexer.cpp) - -add_library(pgsql STATIC - pgsql/Pgsql_Connection.cpp - pgsql/Pgsql_Params.cpp - pgsql/Pgsql_Result.cpp - pgsql/Pgsql_Row.cpp - pgsql/Pgsql_Value.cpp) - -add_executable(pglab - pglab/ASyncDBConnection.cpp - pglab/ASyncWindow.cpp - pglab/BackupDialog.cpp - pglab/BackupRestore.cpp - pglab/ConnectionConfig.cpp - pglab/ConnectionList.cpp - pglab/ConnectionListModel.cpp - pglab/ConnectionManagerWindow.cpp - pglab/DatabaseInspectorWidget.cpp - pglab/DatabasesTableModel.cpp - pglab/DatabaseWindow.cpp - pglab/ExplainTreeModelItem.cpp - pglab/GlobalIoService.cpp - pglab/jsoncpp.cpp - pglab/main.cpp - pglab/MainWindow.cpp - pglab/MasterController.cpp - pglab/OpenDatabase.cpp - pglab/ParamListModel.cpp - pglab/ParamTypeDelegate.cpp - pglab/PgAuthIdContainer.cpp - pglab/PgAuthId.cpp - pglab/PgClass.cpp - pglab/PgDatabaseCatalogue.cpp - pglab/PgDatabaseContainer.cpp - pglab/PgDatabase.cpp - pglab/PgNamespace.cpp - pglab/PgTypeContainer.cpp - pglab/PgType.cpp - pglab/ProcessStdioWidget.cpp - pglab/QueryExplainModel.cpp - pglab/QueryResultModel.cpp - pglab/QueryTab.cpp - pglab/RolesTableModel.cpp - pglab/ServerWindow.cpp - pglab/SqlSyntaxHighlighter.cpp - pglab/stopwatch.cpp - pglab/tsqueue.cpp - pglab/tuplesresultwidget.cpp - pglab/TypeSelectionItemModel.cpp - pglab/util.cpp - pglab/resources.qrc - ) - -target_include_directories(pglab PRIVATE - ./core - ./pgsql - ) - -target_link_libraries( pglab - core - pgsql - ${Boost_LIBRARIES} - Qt5::Widgets - ${Pq_LIBRARIES} - ${Botan_LIBRARIES} - pthread - ) - -add_executable(runtests - tests/main.cpp - tests/tst_CsvWriter.cpp - tests/tst_expected.cpp - tests/tst_PasswordManager.cpp - tests/tst_scopeguard.cpp - tests/tst_SqlLexer.cpp - ) - -target_include_directories(runtests PRIVATE ./core ${GTEST_INCLUDE_DIRS}) -target_link_libraries(runtests - core - ${GTEST_LIBRARIES} - ${Botan_LIBRARIES} - Qt5::Widgets - pthread - ) - +find_package(Threads) enable_testing() -add_test(tests runtests) + +add_subdirectory(core) +add_subdirectory(pgsql) +add_subdirectory(pglab) +add_subdirectory(tests) + + diff --git a/src/cmake/Modules/FindBotan.cmake b/src/cmake/Modules/FindBotan.cmake new file mode 100644 index 0000000..f07526c --- /dev/null +++ b/src/cmake/Modules/FindBotan.cmake @@ -0,0 +1,46 @@ +# - Try to find the Botan library +# +# Once done this will define +# +# BOTAN_FOUND - System has Botan +# BOTAN_INCLUDE_DIR - The Botan include directory +# BOTAN_LIBRARIES - The libraries needed to use Botan +# BOTAN_DEFINITIONS - Compiler switches required for using Botan + +IF (BOTAN_INCLUDE_DIR AND BOTAN_LIBRARY) + # in cache already + SET(Botan_FIND_QUIETLY TRUE) +ENDIF (BOTAN_INCLUDE_DIR AND BOTAN_LIBRARY) + +IF (NOT WIN32) + # try using pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + # also fills in BOTAN_DEFINITIONS, although that isn't normally useful + FIND_PACKAGE(PkgConfig) + PKG_SEARCH_MODULE(PC_BOTAN botan-2) + SET(BOTAN_DEFINITIONS ${PC_BOTAN_CFLAGS}) +ENDIF (NOT WIN32) + +FIND_PATH(BOTAN_INCLUDE_DIR botan/botan.h + HINTS + ${PC_BOTAN_INCLUDEDIR} + ${PC_BOTAN_INCLUDE_DIRS} + ) + +FIND_LIBRARY(BOTAN_LIBRARY NAMES ${PC_BOTAN_LIBRARIES} + HINTS + ${PC_BOTAN_LIBDIR} + ${PC_BOTAN_LIBRARY_DIRS} + ) + +MARK_AS_ADVANCED(BOTAN_INCLUDE_DIR BOTAN_LIBRARY) + +# handle the QUIETLY and REQUIRED arguments and set BOTAN_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Botan DEFAULT_MSG BOTAN_LIBRARY BOTAN_INCLUDE_DIR) + +IF(BOTAN_FOUND) + SET(BOTAN_LIBRARIES ${BOTAN_LIBRARY}) + SET(BOTAN_INCLUDE_DIRS ${BOTAN_INCLUDE_DIR}) +ENDIF() diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt new file mode 100644 index 0000000..5770d67 --- /dev/null +++ b/src/core/CMakeLists.txt @@ -0,0 +1,23 @@ +set(CMAKE_AUTOMOC ON) + +add_library(core STATIC + BackupFormatModel.cpp + CsvWriter.cpp + my_boost_assert_handler.cpp + PasswordManager.cpp + SqlLexer.cpp) + +target_link_libraries(core PUBLIC + botan + Qt5::Core + ) + +target_include_directories(core INTERFACE + $ +) + +set_target_properties(core PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE True + ) diff --git a/src/pglab/CMakeLists.txt b/src/pglab/CMakeLists.txt new file mode 100644 index 0000000..ae14441 --- /dev/null +++ b/src/pglab/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 3.2) +project(pglab) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +add_executable(pglab + ASyncDBConnection.cpp + ASyncWindow.cpp + BackupDialog.cpp + BackupRestore.cpp + ConnectionConfig.cpp + ConnectionList.cpp + ConnectionListModel.cpp + ConnectionManagerWindow.cpp + DatabaseInspectorWidget.cpp + DatabasesTableModel.cpp + DatabaseWindow.cpp + ExplainTreeModelItem.cpp + GlobalIoService.cpp + jsoncpp.cpp + main.cpp + MainWindow.cpp + MasterController.cpp + OpenDatabase.cpp + ParamListModel.cpp + ParamTypeDelegate.cpp + PgAuthIdContainer.cpp + PgAuthId.cpp + PgClass.cpp + PgDatabaseCatalogue.cpp + PgDatabaseContainer.cpp + PgDatabase.cpp + PgNamespace.cpp + PgTypeContainer.cpp + PgType.cpp + ProcessStdioWidget.cpp + QueryExplainModel.cpp + QueryResultModel.cpp + QueryTab.cpp + RolesTableModel.cpp + ServerWindow.cpp + SqlSyntaxHighlighter.cpp + stopwatch.cpp + tsqueue.cpp + tuplesresultwidget.cpp + TypeSelectionItemModel.cpp + util.cpp + resources.qrc + ) + +set_target_properties(pglab PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON) + +if(CMAKE_COMPILER_IS_GNUCXX) + # target_compile_options(pglab PRIVATE -Wall -fpic -march=native ) + # set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") +endif() + +target_link_libraries( pglab + core + pgsql + boost-system + Qt5::Widgets + pthread + ) diff --git a/src/pgsql/CMakeLists.txt b/src/pgsql/CMakeLists.txt new file mode 100644 index 0000000..bc6c34f --- /dev/null +++ b/src/pgsql/CMakeLists.txt @@ -0,0 +1,22 @@ + +add_library(pgsql STATIC + Pgsql_Connection.cpp + Pgsql_Params.cpp + Pgsql_Result.cpp + Pgsql_Row.cpp + Pgsql_Value.cpp) + +target_link_libraries(pgsql PUBLIC + postgresql + Qt5::Core + ) + +target_include_directories(pgsql INTERFACE + $ +) + +set_target_properties(pgsql PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE True + ) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt new file mode 100644 index 0000000..e900f74 --- /dev/null +++ b/src/tests/CMakeLists.txt @@ -0,0 +1,16 @@ +add_executable(runtests + main.cpp + tst_CsvWriter.cpp + tst_expected.cpp + tst_PasswordManager.cpp + tst_scopeguard.cpp + tst_SqlLexer.cpp + ) + +target_link_libraries(runtests + core + gtest + Threads::Threads + ) + +add_test(tests runtests) From 6d8342b3f332232e5faca38f08606c2c26826988 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 27 Aug 2017 17:38:52 +0200 Subject: [PATCH 19/34] move tests to core as it contains tests on core --- src/core/CMakeLists.txt | 17 +++++++++++++++++ src/{ => core}/tests/main.cpp | 0 src/{ => core}/tests/tst_CsvWriter.cpp | 0 src/{ => core}/tests/tst_PasswordManager.cpp | 0 src/{ => core}/tests/tst_SqlLexer.cpp | 0 src/{ => core}/tests/tst_expected.cpp | 0 src/{ => core}/tests/tst_scopeguard.cpp | 0 src/tests/CMakeLists.txt | 16 ---------------- 8 files changed, 17 insertions(+), 16 deletions(-) rename src/{ => core}/tests/main.cpp (100%) rename src/{ => core}/tests/tst_CsvWriter.cpp (100%) rename src/{ => core}/tests/tst_PasswordManager.cpp (100%) rename src/{ => core}/tests/tst_SqlLexer.cpp (100%) rename src/{ => core}/tests/tst_expected.cpp (100%) rename src/{ => core}/tests/tst_scopeguard.cpp (100%) delete mode 100644 src/tests/CMakeLists.txt diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5770d67..33250ca 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -21,3 +21,20 @@ set_target_properties(core PROPERTIES CXX_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE True ) + +add_executable(runtests + test/main.cpp + test/tst_CsvWriter.cpp + test/tst_expected.cpp + test/tst_PasswordManager.cpp + test/tst_scopeguard.cpp + test/tst_SqlLexer.cpp + ) + +target_link_libraries(runtests + core + gtest + Threads::Threads + ) + +add_test(tests runtests) diff --git a/src/tests/main.cpp b/src/core/tests/main.cpp similarity index 100% rename from src/tests/main.cpp rename to src/core/tests/main.cpp diff --git a/src/tests/tst_CsvWriter.cpp b/src/core/tests/tst_CsvWriter.cpp similarity index 100% rename from src/tests/tst_CsvWriter.cpp rename to src/core/tests/tst_CsvWriter.cpp diff --git a/src/tests/tst_PasswordManager.cpp b/src/core/tests/tst_PasswordManager.cpp similarity index 100% rename from src/tests/tst_PasswordManager.cpp rename to src/core/tests/tst_PasswordManager.cpp diff --git a/src/tests/tst_SqlLexer.cpp b/src/core/tests/tst_SqlLexer.cpp similarity index 100% rename from src/tests/tst_SqlLexer.cpp rename to src/core/tests/tst_SqlLexer.cpp diff --git a/src/tests/tst_expected.cpp b/src/core/tests/tst_expected.cpp similarity index 100% rename from src/tests/tst_expected.cpp rename to src/core/tests/tst_expected.cpp diff --git a/src/tests/tst_scopeguard.cpp b/src/core/tests/tst_scopeguard.cpp similarity index 100% rename from src/tests/tst_scopeguard.cpp rename to src/core/tests/tst_scopeguard.cpp diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt deleted file mode 100644 index e900f74..0000000 --- a/src/tests/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -add_executable(runtests - main.cpp - tst_CsvWriter.cpp - tst_expected.cpp - tst_PasswordManager.cpp - tst_scopeguard.cpp - tst_SqlLexer.cpp - ) - -target_link_libraries(runtests - core - gtest - Threads::Threads - ) - -add_test(tests runtests) From f6728e61913e5f70cd31378b894a45af31c23677 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 27 Aug 2017 17:39:35 +0200 Subject: [PATCH 20/34] test -> test --- src/core/{tests => test}/main.cpp | 0 src/core/{tests => test}/tst_CsvWriter.cpp | 0 src/core/{tests => test}/tst_PasswordManager.cpp | 0 src/core/{tests => test}/tst_SqlLexer.cpp | 0 src/core/{tests => test}/tst_expected.cpp | 0 src/core/{tests => test}/tst_scopeguard.cpp | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/core/{tests => test}/main.cpp (100%) rename src/core/{tests => test}/tst_CsvWriter.cpp (100%) rename src/core/{tests => test}/tst_PasswordManager.cpp (100%) rename src/core/{tests => test}/tst_SqlLexer.cpp (100%) rename src/core/{tests => test}/tst_expected.cpp (100%) rename src/core/{tests => test}/tst_scopeguard.cpp (100%) diff --git a/src/core/tests/main.cpp b/src/core/test/main.cpp similarity index 100% rename from src/core/tests/main.cpp rename to src/core/test/main.cpp diff --git a/src/core/tests/tst_CsvWriter.cpp b/src/core/test/tst_CsvWriter.cpp similarity index 100% rename from src/core/tests/tst_CsvWriter.cpp rename to src/core/test/tst_CsvWriter.cpp diff --git a/src/core/tests/tst_PasswordManager.cpp b/src/core/test/tst_PasswordManager.cpp similarity index 100% rename from src/core/tests/tst_PasswordManager.cpp rename to src/core/test/tst_PasswordManager.cpp diff --git a/src/core/tests/tst_SqlLexer.cpp b/src/core/test/tst_SqlLexer.cpp similarity index 100% rename from src/core/tests/tst_SqlLexer.cpp rename to src/core/test/tst_SqlLexer.cpp diff --git a/src/core/tests/tst_expected.cpp b/src/core/test/tst_expected.cpp similarity index 100% rename from src/core/tests/tst_expected.cpp rename to src/core/test/tst_expected.cpp diff --git a/src/core/tests/tst_scopeguard.cpp b/src/core/test/tst_scopeguard.cpp similarity index 100% rename from src/core/tests/tst_scopeguard.cpp rename to src/core/test/tst_scopeguard.cpp From fbead4d782b017c2aa191c51a4c500038aede470 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 1 Sep 2017 09:33:46 +0200 Subject: [PATCH 21/34] fix --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2e34c4d..a886032 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -57,6 +57,6 @@ enable_testing() add_subdirectory(core) add_subdirectory(pgsql) add_subdirectory(pglab) -add_subdirectory(tests) + From 067fd7d7a243cb38b0bc4ef5fd62e953a2a9f9e6 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 1 Sep 2017 09:50:08 +0200 Subject: [PATCH 22/34] Find botan also looks in /usr/local now. Works for manual build under FreeBSD 11 --- src/cmake/Modules/FindBotan.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmake/Modules/FindBotan.cmake b/src/cmake/Modules/FindBotan.cmake index f07526c..1feb01b 100644 --- a/src/cmake/Modules/FindBotan.cmake +++ b/src/cmake/Modules/FindBotan.cmake @@ -25,12 +25,15 @@ FIND_PATH(BOTAN_INCLUDE_DIR botan/botan.h HINTS ${PC_BOTAN_INCLUDEDIR} ${PC_BOTAN_INCLUDE_DIRS} + /usr/local/include/botan-2 ) -FIND_LIBRARY(BOTAN_LIBRARY NAMES ${PC_BOTAN_LIBRARIES} +FIND_LIBRARY(BOTAN_LIBRARY botan-2 + NAMES ${PC_BOTAN_LIBRARIES} HINTS ${PC_BOTAN_LIBDIR} ${PC_BOTAN_LIBRARY_DIRS} + /usr/local/lib ) MARK_AS_ADVANCED(BOTAN_INCLUDE_DIR BOTAN_LIBRARY) From 8dc8c3a86d3bf07fbfcf3789b8ce90186fb942ca Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 1 Sep 2017 10:21:29 +0200 Subject: [PATCH 23/34] Added missing dependency on boost to core so it can find the boost headers. --- src/core/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 33250ca..95b09fc 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(core STATIC SqlLexer.cpp) target_link_libraries(core PUBLIC + boost botan Qt5::Core ) From e66326472eee21d9a95b9fc3543fc38562d593b3 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 1 Sep 2017 10:22:13 +0200 Subject: [PATCH 24/34] Removed invalid default value for the type. Caused a compiler error on FreeBSD. Either because of different Qt verion (5.7) or because of clang not sure which but that default was a nonsense left over of an older implementation anyway. --- src/pglab/ParamListModel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pglab/ParamListModel.h b/src/pglab/ParamListModel.h index 11acfc3..7363bde 100644 --- a/src/pglab/ParamListModel.h +++ b/src/pglab/ParamListModel.h @@ -1,4 +1,4 @@ -#ifndef PARAMLISTMODEL_H +#ifndef PARAMLISTMODEL_H #define PARAMLISTMODEL_H #include @@ -11,7 +11,7 @@ public: class Param { public: QString value; ///< the value of the parameter (currently this is passed directly) - QString type = InvalidOid; ///< the type of the parameter + QString type; ///< the type of the parameter Param() = default; Param(const QString &v, const QString t) From aa50d3097ebdd9df0a741b956c4847ede6353280 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Fri, 1 Sep 2017 21:07:37 +0200 Subject: [PATCH 25/34] Fixed some cases where nullptr were not correctly handled. --- src/pglab/MainWindow.h | 2 +- src/pglab/OpenDatabase.cpp | 7 +++++-- src/pglab/QueryTab.cpp | 19 ++++++++++++------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/pglab/MainWindow.h b/src/pglab/MainWindow.h index 438b66f..4359dad 100644 --- a/src/pglab/MainWindow.h +++ b/src/pglab/MainWindow.h @@ -41,7 +41,7 @@ private: Ui::MainWindow *ui; ConnectionConfig m_config; - OpenDatabase *m_database; + OpenDatabase *m_database = nullptr; MasterController *m_masterController; diff --git a/src/pglab/OpenDatabase.cpp b/src/pglab/OpenDatabase.cpp index f00cf5d..cc04b33 100644 --- a/src/pglab/OpenDatabase.cpp +++ b/src/pglab/OpenDatabase.cpp @@ -8,10 +8,12 @@ Expected OpenDatabase::createOpenDatabase(const ConnectionConfig OpenDatabase *odb = new OpenDatabase(cfg, nullptr); if (odb->Init()) { + return odb; } - return odb; //return Expected::fromException(std::out_of_range("Invalid row")); + return Expected::fromException( + std::runtime_error("Failed to get database information")); } OpenDatabase::OpenDatabase(const ConnectionConfig& cfg, QObject *parent) @@ -33,8 +35,9 @@ bool OpenDatabase::Init() auto vals = m_config.getValues(); if (conn.connect(kw, vals, 0)) { m_catalogue->loadAll(conn); + return true; } - return true; + return false; } PgDatabaseCatalogue* OpenDatabase::catalogue() diff --git a/src/pglab/QueryTab.cpp b/src/pglab/QueryTab.cpp index 432616f..fd2e01e 100644 --- a/src/pglab/QueryTab.cpp +++ b/src/pglab/QueryTab.cpp @@ -27,7 +27,9 @@ QueryParamListController::QueryParamListController(QTableView *tv, , paramTableView(tv) , m_openDatabase(opendb) { - m_typeDelegate.setTypeSelectionModel(opendb->typeSelectionModel()); + if (opendb) { + m_typeDelegate.setTypeSelectionModel(opendb->typeSelectionModel()); + } paramTableView->setModel(&m_paramList); paramTableView->setItemDelegateForColumn(1, &m_typeDelegate); @@ -82,17 +84,20 @@ QueryTab::QueryTab(MainWindow *win, QWidget *parent) : font.setPointSize(10); ui->queryEdit->setFont(font); - OpenDatabase* open_database = m_win->getDatabase(); - auto cat = open_database->catalogue(); - highlighter = new SqlSyntaxHighlighter(ui->queryEdit->document()); - highlighter->setTypes(cat->types()); + OpenDatabase* open_database = m_win->getDatabase(); + if (open_database) { + auto cat = open_database->catalogue(); + highlighter->setTypes(cat->types()); + } connect(ui->queryEdit, &QPlainTextEdit::textChanged, this, &QueryTab::queryTextChanged); m_queryParamListController = new QueryParamListController(ui->paramTableView, open_database, this); - connect(ui->addButton, &QPushButton::clicked, m_queryParamListController, &QueryParamListController::on_addParam); - connect(ui->removeButton, &QPushButton::clicked, m_queryParamListController, &QueryParamListController::on_removeParam); + connect(ui->addButton, &QPushButton::clicked, m_queryParamListController, + &QueryParamListController::on_addParam); + connect(ui->removeButton, &QPushButton::clicked, m_queryParamListController, + &QueryParamListController::on_removeParam); } QueryTab::~QueryTab() From 90d0a14b63bf1c823f56c3edabc3590c4a298d74 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sat, 2 Sep 2017 11:55:47 +0200 Subject: [PATCH 26/34] Fixed crash from trying to close a socket that isn't open in the first place. --- src/pglab/ASyncDBConnection.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/pglab/ASyncDBConnection.cpp b/src/pglab/ASyncDBConnection.cpp index c1ee412..1cd900c 100644 --- a/src/pglab/ASyncDBConnection.cpp +++ b/src/pglab/ASyncDBConnection.cpp @@ -1,4 +1,4 @@ -#include "ASyncDBConnection.h" +#include "ASyncDBConnection.h" #include "ScopeGuard.h" #include @@ -23,7 +23,7 @@ void ASyncDBConnection::setupConnection(const ConnectionConfig &config) bool ok = m_connection.connectStart(keywords, values); // auto start = std::chrono::steady_clock::now(); - if (ok && m_connection.status() != CONNECTION_BAD) { + if (ok && m_connection.status() != CONNECTION_BAD) { auto sock_handle = m_connection.socket(); m_asioSock.assign(ip::tcp::v4(), sock_handle); m_asioSock.non_blocking(true); @@ -66,15 +66,15 @@ void ASyncDBConnection::async_connect_handler(boost::system::error_code ec, std: void ASyncDBConnection::doStateCallback(State state) { - m_state = state; + m_state = state; if (state == State::Connected) { m_canceller = m_connection.getCancel(); m_connection.setNoticeReceiver( [this](const PGresult *result) { processNotice(result); }); } - std::lock_guard lg(m_stateCallback.m_mutex); - if (m_stateCallback.m_func) { + std::lock_guard lg(m_stateCallback.m_mutex); + if (m_stateCallback.m_func) { m_stateCallback.m_func(state); } @@ -87,8 +87,10 @@ void ASyncDBConnection::closeConnection() if (m_state == State::QuerySend) { m_canceller.cancel(nullptr); } - m_asioSock.close(); - m_connection.close(); + if (m_state != State::NotConnected) { + m_asioSock.close(); + m_connection.close(); + } doStateCallback(State::NotConnected); } From 3befef2464aad342f437a6341994230bd057b2df Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 3 Sep 2017 10:06:32 +0200 Subject: [PATCH 27/34] ASyncDBConnection uses Qt signals now for reporting state changes and notices --- src/pglab/ASyncDBConnection.cpp | 28 +++++----------------------- src/pglab/ASyncDBConnection.h | 32 +++++++++++++------------------- src/pglab/DatabaseWindow.cpp | 12 ++---------- src/pglab/QueryTab.cpp | 17 ++++------------- src/pglab/QueryTab.h | 8 -------- src/pglab/main.cpp | 5 +++++ src/pgsql/Pgsql_Result.h | 1 + 7 files changed, 30 insertions(+), 73 deletions(-) diff --git a/src/pglab/ASyncDBConnection.cpp b/src/pglab/ASyncDBConnection.cpp index 1cd900c..e9b3a2a 100644 --- a/src/pglab/ASyncDBConnection.cpp +++ b/src/pglab/ASyncDBConnection.cpp @@ -72,13 +72,10 @@ void ASyncDBConnection::doStateCallback(State state) m_connection.setNoticeReceiver( [this](const PGresult *result) { processNotice(result); }); } - - std::lock_guard lg(m_stateCallback.m_mutex); - if (m_stateCallback.m_func) { - m_stateCallback.m_func(state); - } + emit onStateChanged(state); +} -} + void ASyncDBConnection::closeConnection() @@ -155,23 +152,8 @@ bool ASyncDBConnection::cancel() return m_canceller.cancel(nullptr); } -void ASyncDBConnection::setStateCallback(on_state_callback state_callback) -{ - std::lock_guard lg(m_stateCallback.m_mutex); - m_stateCallback.m_func = state_callback; -} - -void ASyncDBConnection::setNoticeCallback(on_notice_callback notice_callback) -{ - std::lock_guard lg(m_noticeCallback.m_mutex); - m_noticeCallback.m_func = notice_callback; -} - void ASyncDBConnection::processNotice(const PGresult *result) { - std::lock_guard lg(m_noticeCallback.m_mutex); - if (m_noticeCallback.m_func) { - Pgsql::ErrorDetails details = Pgsql::ErrorDetails::createErrorDetailsFromPGresult(result); - m_noticeCallback.m_func(details); - } + Pgsql::ErrorDetails details = Pgsql::ErrorDetails::createErrorDetailsFromPGresult(result); + emit onNotice(details); } diff --git a/src/pglab/ASyncDBConnection.h b/src/pglab/ASyncDBConnection.h index 6ddb358..af66760 100644 --- a/src/pglab/ASyncDBConnection.h +++ b/src/pglab/ASyncDBConnection.h @@ -1,16 +1,14 @@ #ifndef ASYNCDBCONNECTION_H #define ASYNCDBCONNECTION_H +#include + #include "Pgsql_Connection.h" #include "Pgsql_Params.h" +#include "Pgsql_Result.h" #include "ConnectionConfig.h" #include -// #include -// #include #include -// #include -// #include -// #include #include #include @@ -19,7 +17,8 @@ * Queries are passed to this class with a routine to call on completion * when the result is on that routine is called. */ -class ASyncDBConnection { +class ASyncDBConnection: public QObject { + Q_OBJECT public: enum class State { NotConnected, @@ -31,8 +30,6 @@ public: }; using on_result_callback = std::function, qint64)>; - using on_state_callback = std::function; - using on_notice_callback = std::function; explicit ASyncDBConnection(boost::asio::io_service &ios); ~ASyncDBConnection(); @@ -41,9 +38,6 @@ public: void setupConnection(const ConnectionConfig &config); void closeConnection(); - void setStateCallback(on_state_callback state_callback); - void setNoticeCallback(on_notice_callback notice_callback); - /** Sends command to the server. When the result is in on_result will be called directly within the thread. @@ -54,6 +48,10 @@ public: bool send(const std::string &command, Pgsql::Params params, on_result_callback on_result); bool cancel(); + +signals: + void onStateChanged(ASyncDBConnection::State state); + void onNotice(Pgsql::ErrorDetails notice); private: Pgsql::Connection m_connection; @@ -61,15 +59,7 @@ private: ConnectionConfig m_config; State m_state = State::NotConnected; Pgsql::Canceller m_canceller; - struct { - std::mutex m_mutex; - on_state_callback m_func; - } m_stateCallback; - struct { - std::mutex m_mutex; - on_notice_callback m_func; - } m_noticeCallback; QElapsedTimer m_timer; void async_connect_handler(boost::system::error_code ec, std::size_t s); @@ -78,4 +68,8 @@ private: void processNotice(const PGresult *result); }; +Q_DECLARE_METATYPE(ASyncDBConnection::State); +Q_DECLARE_METATYPE(Pgsql::ErrorDetails); + + #endif // ASYNCDBCONNECTION_H diff --git a/src/pglab/DatabaseWindow.cpp b/src/pglab/DatabaseWindow.cpp index da890b3..4aab48e 100644 --- a/src/pglab/DatabaseWindow.cpp +++ b/src/pglab/DatabaseWindow.cpp @@ -11,21 +11,13 @@ DatabaseWindow::DatabaseWindow(QWidget *parent) : { ui->setupUi(this); - m_dbConnection.setStateCallback([this](ASyncDBConnection::State st) - { - QueueTask([this, st]() { connectionStateChanged(st); }); - }); - - m_dbConnection.setNoticeCallback([this](Pgsql::ErrorDetails details) - { - QueueTask([this, details]() { receiveNotice(details); }); - }); + connect(&m_dbConnection, &ASyncDBConnection::onStateChanged, this, &DatabaseWindow::connectionStateChanged); + connect(&m_dbConnection, &ASyncDBConnection::onNotice, this, &DatabaseWindow::receiveNotice); } DatabaseWindow::~DatabaseWindow() { m_dbConnection.closeConnection(); - m_dbConnection.setStateCallback(nullptr); delete ui; } diff --git a/src/pglab/QueryTab.cpp b/src/pglab/QueryTab.cpp index fd2e01e..a392f3f 100644 --- a/src/pglab/QueryTab.cpp +++ b/src/pglab/QueryTab.cpp @@ -1,10 +1,9 @@ #include "QueryTab.h" #include "ui_QueryTab.h" - #include "SqlSyntaxHighlighter.h" - #include #include + #include #include #include @@ -68,16 +67,9 @@ QueryTab::QueryTab(MainWindow *win, QWidget *parent) : { ui->setupUi(this); - m_dbConnection.setStateCallback([this](ASyncDBConnection::State st) - { - m_win->QueueTask([this, st]() { connectionStateChanged(st); }); - }); - - m_dbConnection.setNoticeCallback([this](Pgsql::ErrorDetails details) - { - m_win->QueueTask([this, details]() { receiveNotice(details); }); - }); - + connect(&m_dbConnection, &ASyncDBConnection::onStateChanged, this, &QueryTab::connectionStateChanged); + connect(&m_dbConnection, &ASyncDBConnection::onNotice, this, &QueryTab::receiveNotice); + QFont font; font.setFamily("Source Code Pro"); font.setFixedPitch(true); @@ -103,7 +95,6 @@ QueryTab::QueryTab(MainWindow *win, QWidget *parent) : QueryTab::~QueryTab() { m_dbConnection.closeConnection(); - m_dbConnection.setStateCallback(nullptr); delete ui; } diff --git a/src/pglab/QueryTab.h b/src/pglab/QueryTab.h index 8214b62..4b82b5b 100644 --- a/src/pglab/QueryTab.h +++ b/src/pglab/QueryTab.h @@ -73,14 +73,6 @@ public: bool isNew() const { return m_new; } private: -// struct ResultTab { -// public: -// std::shared_ptr resultModel; -// std::shared_ptr tuplesResult; -//// ResultTab(std::shared_ptr rm, Ui::TuplesResult *tr) -//// : resultModel(rm), tuplesResult(tr) -//// {} -// }; using ResultTabContainer = std::vector; Ui::QueryTab *ui; diff --git a/src/pglab/main.cpp b/src/pglab/main.cpp index 505265d..cf43959 100644 --- a/src/pglab/main.cpp +++ b/src/pglab/main.cpp @@ -5,6 +5,8 @@ #endif #include #include "GlobalIoService.h" +#include "ASyncDBConnection.h" +#include "Pgsql_Result.h" int main(int argc, char *argv[]) { @@ -22,6 +24,9 @@ int main(int argc, char *argv[]) } #endif + qRegisterMetaType(); + qRegisterMetaType(); + QApplication a(argc, argv); QCoreApplication::setOrganizationName("pglab"); diff --git a/src/pgsql/Pgsql_Result.h b/src/pgsql/Pgsql_Result.h index fdcd54a..471ad38 100644 --- a/src/pgsql/Pgsql_Result.h +++ b/src/pgsql/Pgsql_Result.h @@ -132,4 +132,5 @@ namespace Pgsql { } // end namespace Pgsql + #endif // PGSQL_RESULT_H From acd6c14566f031b5cd1df3c34f8e12f8d8fa8034 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 3 Sep 2017 10:17:03 +0200 Subject: [PATCH 28/34] Remove kdev4 files --- .kdev4/pglab.kdev4 | 21 --------------------- pglab.kdev4 | 4 ---- 2 files changed, 25 deletions(-) delete mode 100644 .kdev4/pglab.kdev4 delete mode 100644 pglab.kdev4 diff --git a/.kdev4/pglab.kdev4 b/.kdev4/pglab.kdev4 deleted file mode 100644 index fae07a0..0000000 --- a/.kdev4/pglab.kdev4 +++ /dev/null @@ -1,21 +0,0 @@ -[Buildset] -BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\n\x00p\x00g\x00l\x00a\x00b) - -[CMake] -Build Directory Count=1 -Current Build Directory Index=0 - -[CMake][CMake Build Directory 0] -Build Directory Path=/home/eelke/prog/builds/pglab/debug -Build Type=Debug -CMake Binary=/usr/bin/cmake -Environment Profile= -Extra Arguments= -Install Directory=/usr/local - -[MakeBuilder] -Number Of Jobs=5 -Override Number Of Jobs=true - -[Project] -VersionControlSupport=kdevgit diff --git a/pglab.kdev4 b/pglab.kdev4 deleted file mode 100644 index 2796a40..0000000 --- a/pglab.kdev4 +++ /dev/null @@ -1,4 +0,0 @@ -[Project] -CreatedFrom=pglab -Manager=KDevCMakeManager -Name=pglab From fe0681f19c1f0f66b134b55924e285cf640efeff Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 3 Sep 2017 10:18:55 +0200 Subject: [PATCH 29/34] Ignore kdevelop4 IDE files. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 85f404f..e293239 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.swp build/* +*.kdev4 +.kdev4/* + From b9bc00a38915a55fa2dad23006015c919c5898a0 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 3 Sep 2017 14:37:12 +0200 Subject: [PATCH 30/34] Using a global variable to register meta types instead of the main() function. Prevents needing to have extra includes in the main. --- src/pglab/ASyncDBConnection.cpp | 14 ++++++++++++++ src/pglab/QueryTab.cpp | 27 +++++++++++++++++++++------ src/pglab/QueryTab.h | 1 + src/pglab/main.cpp | 4 ---- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/pglab/ASyncDBConnection.cpp b/src/pglab/ASyncDBConnection.cpp index e9b3a2a..adb20ea 100644 --- a/src/pglab/ASyncDBConnection.cpp +++ b/src/pglab/ASyncDBConnection.cpp @@ -4,6 +4,20 @@ using namespace boost::asio; +namespace { + + class registerMetaTypes { + public: + registerMetaTypes() + { + qRegisterMetaType(); + qRegisterMetaType(); + } + } registerMetaTypes_instance; + + +} + ASyncDBConnection::ASyncDBConnection(boost::asio::io_service &ios) : m_asioSock(ios) {} diff --git a/src/pglab/QueryTab.cpp b/src/pglab/QueryTab.cpp index a392f3f..035f2e6 100644 --- a/src/pglab/QueryTab.cpp +++ b/src/pglab/QueryTab.cpp @@ -45,6 +45,13 @@ Pgsql::Params QueryParamListController::params() const return params; } +bool QueryParamListController::empty() const +{ + + return m_paramList.rowCount() == 0; +} + + void QueryParamListController::on_addParam() { m_paramList.insertRows(m_paramList.rowCount(), 1); @@ -195,12 +202,20 @@ void QueryTab::execute() std::string cmd = getCommand(); m_stopwatch.start(); - m_dbConnection.send(cmd, - m_queryParamListController->params(), - [this](std::shared_ptr res, qint64 elapsedms) - { - m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); }); - }); + + if (m_queryParamListController->empty()) + m_dbConnection.send(cmd, + [this](std::shared_ptr res, qint64 elapsedms) + { + m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); }); + }); + else + m_dbConnection.send(cmd, + m_queryParamListController->params(), + [this](std::shared_ptr res, qint64 elapsedms) + { + m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); }); + }); } } diff --git a/src/pglab/QueryTab.h b/src/pglab/QueryTab.h index 4b82b5b..11b8b8e 100644 --- a/src/pglab/QueryTab.h +++ b/src/pglab/QueryTab.h @@ -33,6 +33,7 @@ public: QueryParamListController(QTableView *tv, OpenDatabase *opendb, QWidget *parent); Pgsql::Params params() const; + bool empty() const; public slots: void on_addParam(); void on_removeParam(); diff --git a/src/pglab/main.cpp b/src/pglab/main.cpp index cf43959..38482a6 100644 --- a/src/pglab/main.cpp +++ b/src/pglab/main.cpp @@ -5,8 +5,6 @@ #endif #include #include "GlobalIoService.h" -#include "ASyncDBConnection.h" -#include "Pgsql_Result.h" int main(int argc, char *argv[]) { @@ -24,8 +22,6 @@ int main(int argc, char *argv[]) } #endif - qRegisterMetaType(); - qRegisterMetaType(); QApplication a(argc, argv); From fd41613b5c89312f95edb4b776a658c95f4cbf52 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 10 Sep 2017 10:09:28 +0200 Subject: [PATCH 31/34] Expected copycon didn't compile, added unit tests for copycon. --- src/core/Expected.h | 2 +- src/core/test/tst_expected.cpp | 33 ++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/core/Expected.h b/src/core/Expected.h index 8813272..8d78941 100644 --- a/src/core/Expected.h +++ b/src/core/Expected.h @@ -27,7 +27,7 @@ public: Expected(const Expected& rhs) - : m_valid(rhs.valid) + : m_valid(rhs.m_valid) { if (m_valid) { new (&m_value) T(rhs.m_value); diff --git a/src/core/test/tst_expected.cpp b/src/core/test/tst_expected.cpp index 5848c13..babda3b 100644 --- a/src/core/test/tst_expected.cpp +++ b/src/core/test/tst_expected.cpp @@ -18,6 +18,14 @@ TEST(expected, get_when_valid_returns_value) ASSERT_EQ(v.get(), 42); } +TEST(expected, get_when_valid_returns_value_copycon) +{ + Expected t = getAnswerToEverything(); + Expected v(t); + ASSERT_TRUE(v.valid()); + ASSERT_EQ(v.get(), 42); +} + TEST(expected, hasException_when_valid_returns_false) { Expected v = getAnswerToEverything(); @@ -36,6 +44,13 @@ TEST(expected, T_fromException_get_thows) ASSERT_THROW (e.get(), std::runtime_error); } +TEST(expected, T_fromException_get_thows_copycon) +{ + auto f = Expected::fromException(std::runtime_error("hello")); + auto e(f); + ASSERT_THROW (e.get(), std::runtime_error); +} + TEST(expected, T_fromException_has_exception_true) { auto e = Expected::fromException(std::runtime_error("hello")); @@ -97,6 +112,9 @@ TEST(expected, T_fromCode_E_has_derived_exception) ASSERT_TRUE(e.hasException()); } + + + //Expected getIntWithStdRuntimeError() { return Expected(); } Expected getNothing() { return Expected(); } @@ -114,17 +132,20 @@ TEST(expected_void, get_when_valid_returns_value) ASSERT_NO_THROW(v.get()); } +TEST(expected_void, get_when_valid_returns_value_copycon) +{ + Expected t = getNothing(); + auto v(t); + ASSERT_TRUE(v.valid()); + ASSERT_NO_THROW(v.get()); +} + TEST(expected_void, hasException_when_valid_returns_false) { Expected v = getNothing(); ASSERT_FALSE(v.hasException()); } - - - - - TEST(expected_void, void_fromException_is_not_valid) { auto e = Expected::fromException(std::runtime_error("hello")); @@ -201,3 +222,5 @@ TEST(expected_void, void_fromCode_E_has_derived_exception) auto e = Expected::fromCode(expected_void_throws_func); ASSERT_THAT(e.hasException(), Eq(true)); } + + From b372fb6c6be15c25c53e653a46066b05aaba54a9 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 10 Sep 2017 10:10:42 +0200 Subject: [PATCH 32/34] Setting -Wall on compilers that support it. --- src/CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a886032..7bff55f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,6 +8,22 @@ set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/" # locations on all platforms. include(GNUInstallDirs) +include(CheckCXXCompilerFlag) + +function(enable_cxx_compiler_flag_if_supported flag) + string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${flag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() + + +enable_cxx_compiler_flag_if_supported("-Wall") + set(CMAKE_CXX_EXTENSIONS OFF) # set(CMAKE_CXX_STANDARD 14) # set(CMAKE_CXX_STANDARD_REQUIRED ON) From 56bd304756172cdec06d22dc3468cbf99824c5f8 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 10 Sep 2017 10:11:58 +0200 Subject: [PATCH 33/34] Improved error reporting. --- src/pglab/ASyncDBConnection.cpp | 3 +- src/pglab/ASyncDBConnection.h | 3 +- src/pglab/QueryTab.cpp | 152 +++++++++++++++++--------------- src/pglab/QueryTab.h | 2 +- 4 files changed, 84 insertions(+), 76 deletions(-) diff --git a/src/pglab/ASyncDBConnection.cpp b/src/pglab/ASyncDBConnection.cpp index adb20ea..4892327 100644 --- a/src/pglab/ASyncDBConnection.cpp +++ b/src/pglab/ASyncDBConnection.cpp @@ -148,7 +148,8 @@ void ASyncDBConnection::async_query_handler(boost::system::error_code ec, std::s } else { // error during consume - + auto error_msg = m_connection.getErrorMessage(); + } //return finished; if (!finished) { diff --git a/src/pglab/ASyncDBConnection.h b/src/pglab/ASyncDBConnection.h index af66760..60543e9 100644 --- a/src/pglab/ASyncDBConnection.h +++ b/src/pglab/ASyncDBConnection.h @@ -6,6 +6,7 @@ #include "Pgsql_Connection.h" #include "Pgsql_Params.h" #include "Pgsql_Result.h" +#include "Expected.h" #include "ConnectionConfig.h" #include #include @@ -29,7 +30,7 @@ public: Terminating ///< shutting down }; - using on_result_callback = std::function, qint64)>; + using on_result_callback = std::function>, qint64)>; explicit ASyncDBConnection(boost::asio::io_service &ios); ~ASyncDBConnection(); diff --git a/src/pglab/QueryTab.cpp b/src/pglab/QueryTab.cpp index 035f2e6..6d4d10f 100644 --- a/src/pglab/QueryTab.cpp +++ b/src/pglab/QueryTab.cpp @@ -205,14 +205,14 @@ void QueryTab::execute() if (m_queryParamListController->empty()) m_dbConnection.send(cmd, - [this](std::shared_ptr res, qint64 elapsedms) + [this](Expected> res, qint64 elapsedms) { m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); }); }); else m_dbConnection.send(cmd, m_queryParamListController->params(), - [this](std::shared_ptr res, qint64 elapsedms) + [this](Expected> res, qint64 elapsedms) { m_win->QueueTask([this, res, elapsedms]() { query_ready(res, elapsedms); }); }); @@ -234,10 +234,11 @@ void QueryTab::explain(bool analyze) m_stopwatch.start(); std::string cmd = "EXPLAIN (" + analyze_str + "VERBOSE, BUFFERS, FORMAT JSON) " + getCommand(); m_dbConnection.send(cmd, - [this](std::shared_ptr res, qint64 ) + [this](Expected> exp_res, qint64 ) { - if (res) { + if (exp_res.valid()) { // Process explain data seperately + auto res = exp_res.get(); std::thread([this,res]() { std::shared_ptr explain; @@ -299,15 +300,14 @@ bool QueryTab::saveSqlTo(const QString &filename) QString text = ui->queryEdit->toPlainText(); stream << text; /* - - QTextDocument *doc = ui->queryEdit->document(); QTextBlock block = doc->firstBlock(); while (stream.status() == QTextStream::Ok && block.isValid()) { QString plain = block.text(); stream << plain << "\n"; block = block.next(); - }*/ + } +*/ stream.flush(); if (stream.status() == QTextStream::Ok) { @@ -483,77 +483,83 @@ void QueryTab::setTabCaption(const QString &caption, const QString &tooltip) } -void QueryTab::query_ready(std::shared_ptr dbres, qint64 elapsedms) +void QueryTab::query_ready(Expected> exp_res, qint64 elapsedms) { - if (dbres) { - addLog("query_ready with result"); - auto st = dbres->resultStatus(); - if (st == PGRES_TUPLES_OK) { - //int n_rows = dbres->getRows(); - //QString rowcount_str = QString("rows: %1").arg(dbres->getRows()); + if (exp_res.valid()) { + auto dbres = exp_res.get(); + if (dbres) { + addLog("query_ready with result"); + auto st = dbres->resultStatus(); + if (st == PGRES_TUPLES_OK) { + //int n_rows = dbres->getRows(); + //QString rowcount_str = QString("rows: %1").arg(dbres->getRows()); - auto result_model = std::make_shared(nullptr , dbres); - TuplesResultWidget *trw = new TuplesResultWidget; - trw->setResult(result_model, elapsedms); - resultList.push_back(trw); - ui->tabWidget->addTab(trw, "Data"); - if (resultList.size() == 1) - ui->tabWidget->setCurrentWidget(trw); + auto result_model = std::make_shared(nullptr , dbres); + TuplesResultWidget *trw = new TuplesResultWidget; + trw->setResult(result_model, elapsedms); + resultList.push_back(trw); + ui->tabWidget->addTab(trw, "Data"); + if (resultList.size() == 1) + ui->tabWidget->setCurrentWidget(trw); - } - else { - if (st == PGRES_COMMAND_OK) { - int tuples_affected = dbres->tuplesAffected(); - QString msg; - if (tuples_affected >= 0) - msg = tr("Query returned succesfully: %1 rows affected, execution time %2") - .arg(QString::number(tuples_affected)) - .arg(msfloatToHumanReadableString(elapsedms)); - else - msg = tr("Query returned succesfully, execution time %1") - .arg(msfloatToHumanReadableString(elapsedms)); + } + else { + if (st == PGRES_COMMAND_OK) { + int tuples_affected = dbres->tuplesAffected(); + QString msg; + if (tuples_affected >= 0) + msg = tr("Query returned succesfully: %1 rows affected, execution time %2") + .arg(QString::number(tuples_affected)) + .arg(msfloatToHumanReadableString(elapsedms)); + else + msg = tr("Query returned succesfully, execution time %1") + .arg(msfloatToHumanReadableString(elapsedms)); - ui->messagesEdit->append(msg); + ui->messagesEdit->append(msg); - ui->tabWidget->setCurrentWidget(ui->messageTab); - } - else { -// if (st == PGRES_EMPTY_QUERY) { -// statusBar()->showMessage(tr("Empty query.")); -// } -// else if (st == PGRES_COPY_OUT) { -// statusBar()->showMessage(tr("COPY OUT.")); -// } -// else if (st == PGRES_COPY_IN) { -// statusBar()->showMessage(tr("COPY IN.")); -// } -// else if (st == PGRES_BAD_RESPONSE) { -// statusBar()->showMessage(tr("BAD RESPONSE.")); -// } -// else if (st == PGRES_NONFATAL_ERROR) { -// statusBar()->showMessage(tr("NON FATAL ERROR.")); -// } -// else if (st == PGRES_FATAL_ERROR) { -// statusBar()->showMessage(tr("FATAL ERROR.")); -// } -// else if (st == PGRES_COPY_BOTH) { -// statusBar()->showMessage(tr("COPY BOTH shouldn't happen is for replication.")); -// } -// else if (st == PGRES_SINGLE_TUPLE) { -// statusBar()->showMessage(tr("SINGLE TUPLE result.")); -// } -// else { -// statusBar()->showMessage(tr("No tuples returned, possibly an error...")); -// } - ui->tabWidget->setCurrentWidget(ui->messageTab); - receiveNotice(dbres->diagDetails()); - } - } - } - else { - m_stopwatch.stop(); - addLog("query_ready with NO result"); - } + ui->tabWidget->setCurrentWidget(ui->messageTab); + } + else { + // if (st == PGRES_EMPTY_QUERY) { + // statusBar()->showMessage(tr("Empty query.")); + // } + // else if (st == PGRES_COPY_OUT) { + // statusBar()->showMessage(tr("COPY OUT.")); + // } + // else if (st == PGRES_COPY_IN) { + // statusBar()->showMessage(tr("COPY IN.")); + // } + // else if (st == PGRES_BAD_RESPONSE) { + // statusBar()->showMessage(tr("BAD RESPONSE.")); + // } + // else if (st == PGRES_NONFATAL_ERROR) { + // statusBar()->showMessage(tr("NON FATAL ERROR.")); + // } + // else if (st == PGRES_FATAL_ERROR) { + // statusBar()->showMessage(tr("FATAL ERROR.")); + // } + // else if (st == PGRES_COPY_BOTH) { + // statusBar()->showMessage(tr("COPY BOTH shouldn't happen is for replication.")); + // } + // else if (st == PGRES_SINGLE_TUPLE) { + // statusBar()->showMessage(tr("SINGLE TUPLE result.")); + // } + // else { + // statusBar()->showMessage(tr("No tuples returned, possibly an error...")); + // } + ui->tabWidget->setCurrentWidget(ui->messageTab); + receiveNotice(dbres->diagDetails()); + } + } + } + else { + m_stopwatch.stop(); + addLog("query_ready with NO result"); + } + } + else { + // we have an error + } } void QueryTab::clearResult() diff --git a/src/pglab/QueryTab.h b/src/pglab/QueryTab.h index 11b8b8e..d8b973e 100644 --- a/src/pglab/QueryTab.h +++ b/src/pglab/QueryTab.h @@ -105,7 +105,7 @@ private: std::string getCommand() const; void explain_ready(ExplainRoot::SPtr explain); - void query_ready(std::shared_ptr dbres, qint64 elapsedms); + void query_ready(Expected> dbres, qint64 elapsedms); QTabWidget *getTabWidget(); void setTabCaption(const QString &caption, const QString &tooltip); From 45515f936be181c28e56c710e546668e64d063f7 Mon Sep 17 00:00:00 2001 From: Eelke Klein Date: Sun, 10 Sep 2017 10:13:58 +0200 Subject: [PATCH 34/34] First step at detecting dollar quoted strings. Dollar quotes are now recognized by the lexical analyzer. Plan is to let the parser decide how to handle the content. --- src/core/SqlLexer.cpp | 43 +++++++++++++++++++++++++++++- src/core/SqlLexer.h | 5 ++-- src/pglab/SqlSyntaxHighlighter.cpp | 8 +++++- src/pglab/SqlSyntaxHighlighter.h | 1 + 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/core/SqlLexer.cpp b/src/core/SqlLexer.cpp index bbc8deb..f28eedb 100644 --- a/src/core/SqlLexer.cpp +++ b/src/core/SqlLexer.cpp @@ -29,7 +29,8 @@ QChar SqlLexer::peekChar() * @param ofs * @param start * @param length - * @return false when input seems invalid, it will return what it did recognize but something wasn't right, parser should try to recover + * @return false when input seems invalid, it will return what it did recognize but something + * wasn't right, parser should try to recover */ bool SqlLexer::nextBasicToken(int &startpos, int &length, BasicTokenType &tokentype, QString &out) { @@ -117,6 +118,46 @@ bool SqlLexer::nextBasicToken(int &startpos, int &length, BasicTokenType &tokent else if (c == QChar::Null) { break; } + else if (c == '$') { + c = nextChar(); + if (c.isDigit()) { + for (;;) { + c = peekChar(); + if (c.isDigit()) + nextChar(); + else + break; + } + tokentype = BasicTokenType::Parameter; + length = m_pos - startpos; + QStringRef sr(&m_block, startpos, length); + out = sr.toString(); + return true; + } + else if (c.isLetter()) { + // is this a dollar quote? + while (true) { + c = nextChar(); + if (c == '$') { + // Found valid dollar quote + tokentype = BasicTokenType::DollarQuote; + length = m_pos - startpos; + QStringRef sr(&m_block, startpos, length); + out = sr.toString(); + return true; + } + else if (!c.isLetter()) { + // ERROR, unallowed character + tokentype = BasicTokenType::None; + length = m_pos - startpos; + QStringRef sr(&m_block, startpos, length); + out = sr.toString(); + return false; + } + } + } + + } else { // Undetermined symbol for (;;) { diff --git a/src/core/SqlLexer.h b/src/core/SqlLexer.h index c3e51f8..2ad3405 100644 --- a/src/core/SqlLexer.h +++ b/src/core/SqlLexer.h @@ -11,8 +11,9 @@ enum class BasicTokenType { BlockComment, OpenBlockComment, // Busy with a block comment end not detected before end of current input QuotedString, - DollarQuotedString, - QuotedIdentifier + DollarQuote, // Return the dollar quote tag, do not consume the entire string (potentially long) + QuotedIdentifier, + Parameter }; enum class LexerState { diff --git a/src/pglab/SqlSyntaxHighlighter.cpp b/src/pglab/SqlSyntaxHighlighter.cpp index 8367a80..451ce45 100644 --- a/src/pglab/SqlSyntaxHighlighter.cpp +++ b/src/pglab/SqlSyntaxHighlighter.cpp @@ -117,6 +117,9 @@ SqlSyntaxHighlighter::SqlSyntaxHighlighter(QTextDocument *parent) m_typeFormat.setForeground(QColor(32, 192, 32)); m_typeFormat.setFontWeight(QFont::Bold); + + m_parameterFormat.setForeground(QColor(192, 32, 32)); + m_parameterFormat.setFontWeight(QFont::Bold); } SqlSyntaxHighlighter::~SqlSyntaxHighlighter() @@ -144,7 +147,7 @@ void SqlSyntaxHighlighter::highlightBlock(const QString &text) switch (tokentype) { case BasicTokenType::None: case BasicTokenType::End: // End of input - case BasicTokenType::DollarQuotedString: + case BasicTokenType::DollarQuote: break; case BasicTokenType::Symbol: // can be many things, keyword, object name, operator, .. if (g_Keywords.count(s.toLower()) > 0) { @@ -166,6 +169,9 @@ void SqlSyntaxHighlighter::highlightBlock(const QString &text) case BasicTokenType::QuotedIdentifier: setFormat(startpos, length, m_quotedIdentifierFormat); break; + case BasicTokenType::Parameter: + setFormat(startpos, length, m_parameterFormat); + break; } } } diff --git a/src/pglab/SqlSyntaxHighlighter.h b/src/pglab/SqlSyntaxHighlighter.h index 877a8b8..e75fd2a 100644 --- a/src/pglab/SqlSyntaxHighlighter.h +++ b/src/pglab/SqlSyntaxHighlighter.h @@ -28,6 +28,7 @@ private: QTextCharFormat m_quotedStringFormat; QTextCharFormat m_typeFormat; QTextCharFormat m_quotedIdentifierFormat; + QTextCharFormat m_parameterFormat; t_SymbolSet m_typeNames; };