From ba879a882e031d7b8503f78fe41d1210000c96ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Fri, 16 Mar 2018 00:53:47 +0100 Subject: Use std::optional instead of OptionalBool --- src/database/select_query.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index 5a17f38..cd9943c 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -29,16 +29,15 @@ extract_row_value(Statement& statement, const int i) } template -typename std::enable_if::value, T>::type +typename std::enable_if, T>::value, T>::type extract_row_value(Statement& statement, const int i) { const auto integer = statement.get_column_int(i); - OptionalBool result; if (integer > 0) - result.set_value(true); + return true; else if (integer < 0) - result.set_value(false); - return result; + return false; + return std::nullopt; } template -- cgit v1.2.3 From d62ca9f87906be6f046fe9d07afb8bfb69c166e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Fri, 16 Mar 2018 01:11:47 +0100 Subject: Use if constexpr to make things a lot more readable --- src/database/select_query.hpp | 77 ++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 45 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index cd9943c..f7496a4 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -15,48 +15,37 @@ using namespace std::string_literals; template -typename std::enable_if::value, std::int64_t>::type -extract_row_value(Statement& statement, const int i) +auto extract_row_value(Statement& statement, const int i) { - return statement.get_column_int64(i); -} - -template -typename std::enable_if::value, T>::type -extract_row_value(Statement& statement, const int i) -{ - return statement.get_column_text(i); -} - -template -typename std::enable_if, T>::value, T>::type -extract_row_value(Statement& statement, const int i) -{ - const auto integer = statement.get_column_int(i); - if (integer > 0) - return true; - else if (integer < 0) - return false; - return std::nullopt; + if constexpr(std::is_integral::value) + return statement.get_column_int64(i); + else if constexpr (std::is_same::value) + return statement.get_column_text(i); + else if (std::is_same, T>::value) + { + const auto integer = statement.get_column_int(i); + if (integer > 0) + return std::optional{true}; + else if (integer < 0) + return std::optional{false}; + return std::optional{}; + } } template -typename std::enable_if::type -extract_row_values(Row& row, Statement& statement) +void extract_row_values(Row& row, Statement& statement) { - using ColumnType = typename std::remove_reference(row.columns))>::type; + if constexpr(N < sizeof...(T)) + { + using ColumnType = typename std::remove_reference(row.columns))>::type; - auto&& column = std::get(row.columns); - column.value = static_cast(extract_row_value(statement, N)); + auto&& column = std::get(row.columns); + column.value = static_cast(extract_row_value(statement, N)); - extract_row_values(row, statement); + extract_row_values(row, statement); + } } -template -typename std::enable_if::type -extract_row_values(Row&, Statement&) -{} - template struct SelectQuery: public Query { @@ -69,23 +58,21 @@ struct SelectQuery: public Query } template - typename std::enable_if::type - insert_col_name() + void insert_col_name() { - using ColumnsType = std::tuple; - using ColumnType = typename std::remove_reference(std::declval()))>::type; + if constexpr(N < sizeof...(T)) + { + using ColumnsType = std::tuple; + using ColumnType = typename std::remove_reference(std::declval()))>::type; - this->body += " " + std::string{ColumnType::name}; + this->body += " " + std::string{ColumnType::name}; - if (N < (sizeof...(T) - 1)) - this->body += ", "; + if (N < (sizeof...(T) - 1)) + this->body += ", "; - this->insert_col_name(); + this->insert_col_name(); + } } - template - typename std::enable_if::type - insert_col_name() - {} SelectQuery& where() { -- cgit v1.2.3 From d0e3c71b91f1a1c1780158789fd42b8ac7209495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Sat, 17 Mar 2018 17:28:41 +0100 Subject: Revert "Use if constexpr to make things a lot more readable" This reverts commit d62ca9f87906be6f046fe9d07afb8bfb69c166e3. --- src/database/select_query.hpp | 77 +++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 32 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index f7496a4..cd9943c 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -15,37 +15,48 @@ using namespace std::string_literals; template -auto extract_row_value(Statement& statement, const int i) +typename std::enable_if::value, std::int64_t>::type +extract_row_value(Statement& statement, const int i) { - if constexpr(std::is_integral::value) - return statement.get_column_int64(i); - else if constexpr (std::is_same::value) - return statement.get_column_text(i); - else if (std::is_same, T>::value) - { - const auto integer = statement.get_column_int(i); - if (integer > 0) - return std::optional{true}; - else if (integer < 0) - return std::optional{false}; - return std::optional{}; - } + return statement.get_column_int64(i); +} + +template +typename std::enable_if::value, T>::type +extract_row_value(Statement& statement, const int i) +{ + return statement.get_column_text(i); +} + +template +typename std::enable_if, T>::value, T>::type +extract_row_value(Statement& statement, const int i) +{ + const auto integer = statement.get_column_int(i); + if (integer > 0) + return true; + else if (integer < 0) + return false; + return std::nullopt; } template -void extract_row_values(Row& row, Statement& statement) +typename std::enable_if::type +extract_row_values(Row& row, Statement& statement) { - if constexpr(N < sizeof...(T)) - { - using ColumnType = typename std::remove_reference(row.columns))>::type; + using ColumnType = typename std::remove_reference(row.columns))>::type; - auto&& column = std::get(row.columns); - column.value = static_cast(extract_row_value(statement, N)); + auto&& column = std::get(row.columns); + column.value = static_cast(extract_row_value(statement, N)); - extract_row_values(row, statement); - } + extract_row_values(row, statement); } +template +typename std::enable_if::type +extract_row_values(Row&, Statement&) +{} + template struct SelectQuery: public Query { @@ -58,21 +69,23 @@ struct SelectQuery: public Query } template - void insert_col_name() + typename std::enable_if::type + insert_col_name() { - if constexpr(N < sizeof...(T)) - { - using ColumnsType = std::tuple; - using ColumnType = typename std::remove_reference(std::declval()))>::type; + using ColumnsType = std::tuple; + using ColumnType = typename std::remove_reference(std::declval()))>::type; - this->body += " " + std::string{ColumnType::name}; + this->body += " " + std::string{ColumnType::name}; - if (N < (sizeof...(T) - 1)) - this->body += ", "; + if (N < (sizeof...(T) - 1)) + this->body += ", "; - this->insert_col_name(); - } + this->insert_col_name(); } + template + typename std::enable_if::type + insert_col_name() + {} SelectQuery& where() { -- cgit v1.2.3 From 03714c6cebf90dc7db8e3997a18cdd19e039c667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Sat, 17 Mar 2018 17:28:47 +0100 Subject: Revert "Use std::optional instead of OptionalBool" This reverts commit ba879a882e031d7b8503f78fe41d1210000c96ca. --- src/database/select_query.hpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index cd9943c..5a17f38 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -29,15 +29,16 @@ extract_row_value(Statement& statement, const int i) } template -typename std::enable_if, T>::value, T>::type +typename std::enable_if::value, T>::type extract_row_value(Statement& statement, const int i) { const auto integer = statement.get_column_int(i); + OptionalBool result; if (integer > 0) - return true; + result.set_value(true); else if (integer < 0) - return false; - return std::nullopt; + result.set_value(false); + return result; } template -- cgit v1.2.3 From cdace80758e2ee41f33824ad7f52a369c42a4a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Fri, 23 Mar 2018 15:54:36 +0100 Subject: Check that db.prepare worked before using the returned statement --- src/database/select_query.hpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index 5a17f38..743a011 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -115,6 +115,8 @@ struct SelectQuery: public Query #endif auto statement = db.prepare(this->body); + if (!statement) + return rows; statement->bind(std::move(this->params)); while (statement->step() == StepResult::Row) -- cgit v1.2.3 From 857c7d3972a03cbeebf730d99b924d3710dee6a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Tue, 10 Apr 2018 23:33:59 +0200 Subject: Use a different Date data type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PLEASE backup your database before testing this commit, and report any migration issue. In postgresql, we use timestamp with timezone. In sqlite3 we use REAL (the date is expressed as julianday) This requires a migration of the muclogline_ table: In postgresql it’s pretty simple, we convert all the integer into timestamps With sqlite3, we actually rename the table, create the new one with the correct type, then copy everything to the new table, with a conversion function for the Date_ column, and then we delete the old table. fix #3343 --- src/database/select_query.hpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index 743a011..3013dd8 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -3,8 +3,8 @@ #include #include +#include #include -#include #include #include @@ -41,6 +41,14 @@ extract_row_value(Statement& statement, const int i) return result; } +template +typename std::enable_if::value, T>::type +extract_row_value(Statement& statement, const int i) +{ + const std::string timestamp = statement.get_column_text(i); + return {timestamp}; +} + template typename std::enable_if::type extract_row_values(Row& row, Statement& statement) @@ -58,6 +66,18 @@ typename std::enable_if::type extract_row_values(Row&, Statement&) {} +template +std::string before_column() +{ + return {}; +} + +template +std::string after_column() +{ + return {}; +} + template struct SelectQuery: public Query { @@ -76,7 +96,8 @@ struct SelectQuery: public Query using ColumnsType = std::tuple; using ColumnType = typename std::remove_reference(std::declval()))>::type; - this->body += " " + std::string{ColumnType::name}; + this->body += " "; + this->body += before_column() + ColumnType::name + after_column(); if (N < (sizeof...(T) - 1)) this->body += ", "; -- cgit v1.2.3 From 4bd7b6981bb49dd4111c908aaa34c34f677171f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Fri, 13 Apr 2018 23:35:06 +0200 Subject: Refactor that fixes a compilation issue in Release mode Some template specialization were not found, because they were not declared at the point they were used. We moved things around, things are less inter-dependant, and also now it works. --- src/database/select_query.hpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index 3013dd8..0de4fe5 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -2,6 +2,8 @@ #include +#include +#include #include #include #include @@ -78,6 +80,12 @@ std::string after_column() return {}; } +template <> +std::string before_column(); + +template <> +std::string after_column(); + template struct SelectQuery: public Query { @@ -153,3 +161,9 @@ struct SelectQuery: public Query const std::string table_name; }; +template +auto select(const Table table) +{ + SelectQuery query(table.name); + return query; +} -- cgit v1.2.3 From 61de6b1dac4ef29627f3bdb9ce11b6c0d06f4a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Tue, 24 Apr 2018 19:19:06 +0200 Subject: Revert "Use a different Date data type" This reverts commit 857c7d3972a03cbeebf730d99b924d3710dee6a0. --- src/database/select_query.hpp | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index 0de4fe5..b9fdc06 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include #include #include @@ -43,14 +43,6 @@ extract_row_value(Statement& statement, const int i) return result; } -template -typename std::enable_if::value, T>::type -extract_row_value(Statement& statement, const int i) -{ - const std::string timestamp = statement.get_column_text(i); - return {timestamp}; -} - template typename std::enable_if::type extract_row_values(Row& row, Statement& statement) @@ -68,24 +60,6 @@ typename std::enable_if::type extract_row_values(Row&, Statement&) {} -template -std::string before_column() -{ - return {}; -} - -template -std::string after_column() -{ - return {}; -} - -template <> -std::string before_column(); - -template <> -std::string after_column(); - template struct SelectQuery: public Query { @@ -104,8 +78,7 @@ struct SelectQuery: public Query using ColumnsType = std::tuple; using ColumnType = typename std::remove_reference(std::declval()))>::type; - this->body += " "; - this->body += before_column() + ColumnType::name + after_column(); + this->body += " " + std::string{ColumnType::name}; if (N < (sizeof...(T) - 1)) this->body += ", "; -- cgit v1.2.3 From d7bc737751aae7bdc77c68e4d2953aa0d6670724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Tue, 21 Aug 2018 19:54:47 +0200 Subject: Add two missing ref --- src/database/select_query.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/database/select_query.hpp') diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp index b9fdc06..e372f2e 100644 --- a/src/database/select_query.hpp +++ b/src/database/select_query.hpp @@ -135,7 +135,7 @@ struct SelectQuery: public Query }; template -auto select(const Table table) +auto select(const Table& table) { SelectQuery query(table.name); return query; -- cgit v1.2.3