Commit ba879a88 authored by louiz’'s avatar louiz’

Use std::optional<bool> instead of OptionalBool

parent 3f088e7b
...@@ -69,7 +69,7 @@ class Database ...@@ -69,7 +69,7 @@ class Database
struct RecordHistory: Column<bool> { static constexpr auto name = "recordhistory_"; struct RecordHistory: Column<bool> { static constexpr auto name = "recordhistory_";
RecordHistory(): Column<bool>(true) {}}; RecordHistory(): Column<bool>(true) {}};
struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordhistory_"; }; struct RecordHistoryOptional: Column<std::optional<bool>> { static constexpr auto name = "recordhistory_"; };
struct VerifyCert: Column<bool> { static constexpr auto name = "verifycert_"; struct VerifyCert: Column<bool> { static constexpr auto name = "verifycert_";
VerifyCert(): Column<bool>(true) {} }; VerifyCert(): Column<bool>(true) {} };
......
...@@ -11,11 +11,11 @@ void actual_bind(Statement& statement, const std::int64_t& value, int index) ...@@ -11,11 +11,11 @@ void actual_bind(Statement& statement, const std::int64_t& value, int index)
statement.bind_int64(index, value); statement.bind_int64(index, value);
} }
void actual_bind(Statement& statement, const OptionalBool& value, int index) void actual_bind(Statement& statement, const std::optional<bool>& value, int index)
{ {
if (!value.is_set) if (!value)
statement.bind_int64(index, 0); statement.bind_int64(index, 0);
else if (value.value) else if (*value)
statement.bind_int64(index, 1); statement.bind_int64(index, 1);
else else
statement.bind_int64(index, -1); statement.bind_int64(index, -1);
...@@ -26,11 +26,11 @@ void actual_add_param(Query& query, const std::string& val) ...@@ -26,11 +26,11 @@ void actual_add_param(Query& query, const std::string& val)
query.params.push_back(val); query.params.push_back(val);
} }
void actual_add_param(Query& query, const OptionalBool& val) void actual_add_param(Query& query, const std::optional<bool>& val)
{ {
if (!val.is_set) if (!val)
query.params.push_back("0"); query.params.push_back("0");
else if (val.value) else if (*val)
query.params.push_back("1"); query.params.push_back("1");
else else
query.params.push_back("-1"); query.params.push_back("-1");
......
...@@ -18,7 +18,7 @@ void actual_bind(Statement& statement, const T& value, int index) ...@@ -18,7 +18,7 @@ void actual_bind(Statement& statement, const T& value, int index)
{ {
actual_bind(statement, static_cast<std::int64_t>(value), index); actual_bind(statement, static_cast<std::int64_t>(value), index);
} }
void actual_bind(Statement& statement, const OptionalBool& value, int index); void actual_bind(Statement& statement, const std::optional<bool>& value, int index);
#ifdef DEBUG_SQL_QUERIES #ifdef DEBUG_SQL_QUERIES
#include <utils/scopetimer.hpp> #include <utils/scopetimer.hpp>
...@@ -71,7 +71,6 @@ void actual_add_param(Query& query, const T& val) ...@@ -71,7 +71,6 @@ void actual_add_param(Query& query, const T& val)
} }
void actual_add_param(Query& query, const std::string& val); void actual_add_param(Query& query, const std::string& val);
void actual_add_param(Query& query, const OptionalBool& val);
template <typename T> template <typename T>
typename std::enable_if<!std::is_integral<T>::value, Query&>::type typename std::enable_if<!std::is_integral<T>::value, Query&>::type
...@@ -80,6 +79,7 @@ operator<<(Query& query, const T&) ...@@ -80,6 +79,7 @@ operator<<(Query& query, const T&)
query.body += T::name; query.body += T::name;
return query; return query;
} }
void actual_add_param(Query& query, const std::optional<bool>& val);
Query& operator<<(Query& query, const char* str); Query& operator<<(Query& query, const char* str);
Query& operator<<(Query& query, const std::string& str); Query& operator<<(Query& query, const std::string& str);
......
...@@ -29,16 +29,15 @@ extract_row_value(Statement& statement, const int i) ...@@ -29,16 +29,15 @@ extract_row_value(Statement& statement, const int i)
} }
template <typename T> template <typename T>
typename std::enable_if<std::is_same<OptionalBool, T>::value, T>::type typename std::enable_if<std::is_same<std::optional<bool>, T>::value, T>::type
extract_row_value(Statement& statement, const int i) extract_row_value(Statement& statement, const int i)
{ {
const auto integer = statement.get_column_int(i); const auto integer = statement.get_column_int(i);
OptionalBool result;
if (integer > 0) if (integer > 0)
result.set_value(true); return true;
else if (integer < 0) else if (integer < 0)
result.set_value(false); return false;
return result; return std::nullopt;
} }
template <std::size_t N=0, typename... T> template <std::size_t N=0, typename... T>
......
#include <utils/optional_bool.hpp> #include <utils/optional_bool.hpp>
std::ostream& operator<<(std::ostream& os, const OptionalBool& o) std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o)
{ {
os << o.to_string(); os << std::to_string(o);
return os; return os;
} }
#pragma once #pragma once
#include <optional>
#include <string> #include <string>
struct OptionalBool namespace std
{ {
OptionalBool() = default; inline
std::string to_string(const std::optional<bool> b)
OptionalBool(bool value): {
is_set(true), value(value) {} if (!b)
return "unset";
void set_value(bool value) else if (*b)
{ return "true";
this->is_set = true; else
this->value = value; return "false";
} }
}
void unset()
{ std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o);
this->is_set = false;
}
std::string to_string() const
{
if (this->is_set == false)
return "unset";
else if (this->value)
return "true";
else
return "false";
}
bool is_set{false};
bool value{false};
};
std::ostream& operator<<(std::ostream& os, const OptionalBool& o);
...@@ -493,7 +493,7 @@ void insert_irc_channel_configuration_form(XmlNode& node, const Jid& requester, ...@@ -493,7 +493,7 @@ void insert_irc_channel_configuration_form(XmlNode& node, const Jid& requester,
{ {
// Value selected by default // Value selected by default
XmlSubNode value(record_history, "value"); XmlSubNode value(record_history, "value");
value.set_inner(options.col<Database::RecordHistoryOptional>().to_string()); value.set_inner(std::to_string(options.col<Database::RecordHistoryOptional>()));
} }
// All three possible values // All three possible values
for (const auto& val: {"unset", "true", "false"}) for (const auto& val: {"unset", "true", "false"})
...@@ -594,19 +594,19 @@ bool handle_irc_channel_configuration_form(XmppComponent& xmpp_component, const ...@@ -594,19 +594,19 @@ bool handle_irc_channel_configuration_form(XmppComponent& xmpp_component, const
else if (field->get_tag("var") == "record_history" && else if (field->get_tag("var") == "record_history" &&
value && !value->get_inner().empty()) value && !value->get_inner().empty())
{ {
OptionalBool& database_value = options.col<Database::RecordHistoryOptional>(); std::optional<bool>& database_value = options.col<Database::RecordHistoryOptional>();
if (value->get_inner() == "true") if (value->get_inner() == "true")
database_value.set_value(true); database_value = true;
else if (value->get_inner() == "false") else if (value->get_inner() == "false")
database_value.set_value(false); database_value = false;
else else
database_value.unset(); database_value.reset();
auto& biboumi_component = dynamic_cast<BiboumiComponent&>(xmpp_component); auto& biboumi_component = dynamic_cast<BiboumiComponent&>(xmpp_component);
Bridge* bridge = biboumi_component.find_user_bridge(requester.bare()); Bridge* bridge = biboumi_component.find_user_bridge(requester.bare());
if (bridge) if (bridge)
{ {
if (database_value.is_set) if (database_value)
bridge->set_record_history(database_value.value); bridge->set_record_history(*database_value);
else else
{ // It is unset, we need to fetch the Global option, to { // It is unset, we need to fetch the Global option, to
// know if it’s enabled or not // know if it’s enabled or not
......
...@@ -56,13 +56,13 @@ TEST_CASE("Database") ...@@ -56,13 +56,13 @@ TEST_CASE("Database")
CHECK(o.col<Database::EncodingIn>() == ""); CHECK(o.col<Database::EncodingIn>() == "");
o.col<Database::EncodingIn>() = "ISO-8859-1"; o.col<Database::EncodingIn>() = "ISO-8859-1";
CHECK(o.col<Database::RecordHistoryOptional>().is_set == false); CHECK(!o.col<Database::RecordHistoryOptional>());
o.col<Database::RecordHistoryOptional>().set_value(false); o.col<Database::RecordHistoryOptional>() = false;
o.save(Database::db); o.save(Database::db);
auto b = Database::get_irc_channel_options("zouzou@example.com", "irc.example.com", "#foo"); auto b = Database::get_irc_channel_options("zouzou@example.com", "irc.example.com", "#foo");
CHECK(o.col<Database::EncodingIn>() == "ISO-8859-1"); CHECK(o.col<Database::EncodingIn>() == "ISO-8859-1");
CHECK(o.col<Database::RecordHistoryOptional>().is_set == true); CHECK(o.col<Database::RecordHistoryOptional>());
CHECK(o.col<Database::RecordHistoryOptional>().value == false); CHECK(*o.col<Database::RecordHistoryOptional>() == false);
} }
SECTION("Channel options with server default") SECTION("Channel options with server default")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment