Revert "Use std::optional<bool> instead of OptionalBool"
This reverts commit ba879a882e.
This commit is contained in:
@@ -69,7 +69,7 @@ class Database
|
||||
struct RecordHistory: Column<bool> { static constexpr auto name = "recordhistory_";
|
||||
RecordHistory(): Column<bool>(true) {}};
|
||||
|
||||
struct RecordHistoryOptional: Column<std::optional<bool>> { static constexpr auto name = "recordhistory_"; };
|
||||
struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordhistory_"; };
|
||||
|
||||
struct VerifyCert: Column<bool> { static constexpr auto name = "verifycert_";
|
||||
VerifyCert(): Column<bool>(true) {} };
|
||||
|
||||
@@ -11,11 +11,11 @@ void actual_bind(Statement& statement, const std::int64_t& value, int index)
|
||||
statement.bind_int64(index, value);
|
||||
}
|
||||
|
||||
void actual_bind(Statement& statement, const std::optional<bool>& value, int index)
|
||||
void actual_bind(Statement& statement, const OptionalBool& value, int index)
|
||||
{
|
||||
if (!value)
|
||||
if (!value.is_set)
|
||||
statement.bind_int64(index, 0);
|
||||
else if (*value)
|
||||
else if (value.value)
|
||||
statement.bind_int64(index, 1);
|
||||
else
|
||||
statement.bind_int64(index, -1);
|
||||
@@ -26,11 +26,11 @@ void actual_add_param(Query& query, const std::string& val)
|
||||
query.params.push_back(val);
|
||||
}
|
||||
|
||||
void actual_add_param(Query& query, const std::optional<bool>& val)
|
||||
void actual_add_param(Query& query, const OptionalBool& val)
|
||||
{
|
||||
if (!val)
|
||||
if (!val.is_set)
|
||||
query.params.push_back("0");
|
||||
else if (*val)
|
||||
else if (val.value)
|
||||
query.params.push_back("1");
|
||||
else
|
||||
query.params.push_back("-1");
|
||||
|
||||
@@ -18,7 +18,7 @@ void actual_bind(Statement& statement, const T& value, int index)
|
||||
{
|
||||
actual_bind(statement, static_cast<std::int64_t>(value), index);
|
||||
}
|
||||
void actual_bind(Statement& statement, const std::optional<bool>& value, int index);
|
||||
void actual_bind(Statement& statement, const OptionalBool& value, int index);
|
||||
|
||||
#ifdef DEBUG_SQL_QUERIES
|
||||
#include <utils/scopetimer.hpp>
|
||||
@@ -71,6 +71,7 @@ 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 OptionalBool& val);
|
||||
|
||||
template <typename T>
|
||||
typename std::enable_if<!std::is_integral<T>::value, Query&>::type
|
||||
@@ -79,7 +80,6 @@ operator<<(Query& query, const T&)
|
||||
query.body += T::name;
|
||||
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 std::string& str);
|
||||
|
||||
@@ -29,15 +29,16 @@ extract_row_value(Statement& statement, const int i)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
typename std::enable_if<std::is_same<std::optional<bool>, T>::value, T>::type
|
||||
typename std::enable_if<std::is_same<OptionalBool, 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)
|
||||
return true;
|
||||
result.set_value(true);
|
||||
else if (integer < 0)
|
||||
return false;
|
||||
return std::nullopt;
|
||||
result.set_value(false);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <std::size_t N=0, typename... T>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include <utils/optional_bool.hpp>
|
||||
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o)
|
||||
std::ostream& operator<<(std::ostream& os, const OptionalBool& o)
|
||||
{
|
||||
os << std::to_string(o);
|
||||
os << o.to_string();
|
||||
return os;
|
||||
}
|
||||
|
||||
+27
-11
@@ -1,21 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace std
|
||||
struct OptionalBool
|
||||
{
|
||||
inline
|
||||
std::string to_string(const std::optional<bool> b)
|
||||
{
|
||||
if (!b)
|
||||
OptionalBool() = default;
|
||||
|
||||
OptionalBool(bool value):
|
||||
is_set(true), value(value) {}
|
||||
|
||||
void set_value(bool value)
|
||||
{
|
||||
this->is_set = true;
|
||||
this->value = value;
|
||||
}
|
||||
|
||||
void unset()
|
||||
{
|
||||
this->is_set = false;
|
||||
}
|
||||
|
||||
std::string to_string() const
|
||||
{
|
||||
if (this->is_set == false)
|
||||
return "unset";
|
||||
else if (*b)
|
||||
else if (this->value)
|
||||
return "true";
|
||||
else
|
||||
return "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const std::optional<bool>& o);
|
||||
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,
|
||||
{
|
||||
// Value selected by default
|
||||
XmlSubNode value(record_history, "value");
|
||||
value.set_inner(std::to_string(options.col<Database::RecordHistoryOptional>()));
|
||||
value.set_inner(options.col<Database::RecordHistoryOptional>().to_string());
|
||||
}
|
||||
// All three possible values
|
||||
for (const auto& val: {"unset", "true", "false"})
|
||||
@@ -594,19 +594,19 @@ bool handle_irc_channel_configuration_form(XmppComponent& xmpp_component, const
|
||||
else if (field->get_tag("var") == "record_history" &&
|
||||
value && !value->get_inner().empty())
|
||||
{
|
||||
std::optional<bool>& database_value = options.col<Database::RecordHistoryOptional>();
|
||||
OptionalBool& database_value = options.col<Database::RecordHistoryOptional>();
|
||||
if (value->get_inner() == "true")
|
||||
database_value = true;
|
||||
database_value.set_value(true);
|
||||
else if (value->get_inner() == "false")
|
||||
database_value = false;
|
||||
database_value.set_value(false);
|
||||
else
|
||||
database_value.reset();
|
||||
database_value.unset();
|
||||
auto& biboumi_component = dynamic_cast<BiboumiComponent&>(xmpp_component);
|
||||
Bridge* bridge = biboumi_component.find_user_bridge(requester.bare());
|
||||
if (bridge)
|
||||
{
|
||||
if (database_value)
|
||||
bridge->set_record_history(*database_value);
|
||||
if (database_value.is_set)
|
||||
bridge->set_record_history(database_value.value);
|
||||
else
|
||||
{ // It is unset, we need to fetch the Global option, to
|
||||
// know if it’s enabled or not
|
||||
|
||||
+4
-4
@@ -56,13 +56,13 @@ TEST_CASE("Database")
|
||||
|
||||
CHECK(o.col<Database::EncodingIn>() == "");
|
||||
o.col<Database::EncodingIn>() = "ISO-8859-1";
|
||||
CHECK(!o.col<Database::RecordHistoryOptional>());
|
||||
o.col<Database::RecordHistoryOptional>() = false;
|
||||
CHECK(o.col<Database::RecordHistoryOptional>().is_set == false);
|
||||
o.col<Database::RecordHistoryOptional>().set_value(false);
|
||||
o.save(Database::db);
|
||||
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::RecordHistoryOptional>());
|
||||
CHECK(*o.col<Database::RecordHistoryOptional>() == false);
|
||||
CHECK(o.col<Database::RecordHistoryOptional>().is_set == true);
|
||||
CHECK(o.col<Database::RecordHistoryOptional>().value == false);
|
||||
}
|
||||
|
||||
SECTION("Channel options with server default")
|
||||
|
||||
Reference in New Issue
Block a user