Remove all the empty “options” members in Column classes

By using SFINAE to use that member only when it exists.
This commit is contained in:
louiz’
2017-07-08 12:36:08 +02:00
parent 870d462914
commit cf56b60fd3
2 changed files with 29 additions and 42 deletions
+17 -40
View File
@@ -20,79 +20,56 @@ class Database
public: public:
using time_point = std::chrono::system_clock::time_point; using time_point = std::chrono::system_clock::time_point;
struct Uuid: Column<std::string> { static constexpr auto name = "uuid_"; struct Uuid: Column<std::string> { static constexpr auto name = "uuid_"; };
static constexpr auto options = ""; };
struct Owner: Column<std::string> { static constexpr auto name = "owner_"; struct Owner: Column<std::string> { static constexpr auto name = "owner_"; };
static constexpr auto options = ""; };
struct IrcChanName: Column<std::string> { static constexpr auto name = "ircChanName_"; struct IrcChanName: Column<std::string> { static constexpr auto name = "ircChanName_"; };
static constexpr auto options = ""; };
struct Channel: Column<std::string> { static constexpr auto name = "channel_"; struct Channel: Column<std::string> { static constexpr auto name = "channel_"; };
static constexpr auto options = ""; };
struct IrcServerName: Column<std::string> { static constexpr auto name = "ircServerName_"; struct IrcServerName: Column<std::string> { static constexpr auto name = "ircServerName_"; };
static constexpr auto options = ""; };
struct Server: Column<std::string> { static constexpr auto name = "server_"; struct Server: Column<std::string> { static constexpr auto name = "server_"; };
static constexpr auto options = ""; };
struct Date: Column<time_point::rep> { static constexpr auto name = "date_"; struct Date: Column<time_point::rep> { static constexpr auto name = "date_"; };
static constexpr auto options = ""; };
struct Body: Column<std::string> { static constexpr auto name = "body_"; struct Body: Column<std::string> { static constexpr auto name = "body_"; };
static constexpr auto options = ""; };
struct Nick: Column<std::string> { static constexpr auto name = "nick_"; struct Nick: Column<std::string> { static constexpr auto name = "nick_"; };
static constexpr auto options = ""; };
struct Pass: Column<std::string> { static constexpr auto name = "pass_"; struct Pass: Column<std::string> { static constexpr auto name = "pass_"; };
static constexpr auto options = ""; };
struct Ports: Column<std::string> { static constexpr auto name = "ports_"; struct Ports: Column<std::string> { static constexpr auto name = "ports_";
static constexpr auto options = "";
Ports(): Column<std::string>("6667") {} }; Ports(): Column<std::string>("6667") {} };
struct TlsPorts: Column<std::string> { static constexpr auto name = "tlsPorts_"; struct TlsPorts: Column<std::string> { static constexpr auto name = "tlsPorts_";
static constexpr auto options = "";
TlsPorts(): Column<std::string>("6697;6670") {} }; TlsPorts(): Column<std::string>("6697;6670") {} };
struct Username: Column<std::string> { static constexpr auto name = "username_"; struct Username: Column<std::string> { static constexpr auto name = "username_"; };
static constexpr auto options = ""; };
struct Realname: Column<std::string> { static constexpr auto name = "realname_"; struct Realname: Column<std::string> { static constexpr auto name = "realname_"; };
static constexpr auto options = ""; };
struct AfterConnectionCommand: Column<std::string> { static constexpr auto name = "afterConnectionCommand_"; struct AfterConnectionCommand: Column<std::string> { static constexpr auto name = "afterConnectionCommand_"; };
static constexpr auto options = ""; };
struct TrustedFingerprint: Column<std::string> { static constexpr auto name = "trustedFingerprint_"; struct TrustedFingerprint: Column<std::string> { static constexpr auto name = "trustedFingerprint_"; };
static constexpr auto options = ""; };
struct EncodingOut: Column<std::string> { static constexpr auto name = "encodingOut_"; struct EncodingOut: Column<std::string> { static constexpr auto name = "encodingOut_"; };
static constexpr auto options = ""; };
struct EncodingIn: Column<std::string> { static constexpr auto name = "encodingIn_"; struct EncodingIn: Column<std::string> { static constexpr auto name = "encodingIn_"; };
static constexpr auto options = ""; };
struct MaxHistoryLength: Column<int> { static constexpr auto name = "maxHistoryLength_"; struct MaxHistoryLength: Column<int> { static constexpr auto name = "maxHistoryLength_";
static constexpr auto options = "";
MaxHistoryLength(): Column<int>(20) {} }; MaxHistoryLength(): Column<int>(20) {} };
struct RecordHistory: Column<bool> { static constexpr auto name = "recordHistory_"; struct RecordHistory: Column<bool> { static constexpr auto name = "recordHistory_";
static constexpr auto options = "";
RecordHistory(): Column<bool>(true) {}}; RecordHistory(): Column<bool>(true) {}};
struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordHistory_"; struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordHistory_"; };
static constexpr auto options = ""; };
struct VerifyCert: Column<bool> { static constexpr auto name = "verifyCert_"; struct VerifyCert: Column<bool> { static constexpr auto name = "verifyCert_";
static constexpr auto options = "";
VerifyCert(): Column<bool>(true) {} }; VerifyCert(): Column<bool>(true) {} };
struct Persistent: Column<bool> { static constexpr auto name = "persistent_"; struct Persistent: Column<bool> { static constexpr auto name = "persistent_";
static constexpr auto options = "";
Persistent(): Column<bool>(false) {} }; Persistent(): Column<bool>(false) {} };
using MucLogLineTable = Table<Id, Uuid, Owner, IrcChanName, IrcServerName, Date, Body, Nick>; using MucLogLineTable = Table<Id, Uuid, Owner, IrcChanName, IrcServerName, Date, Body, Nick>;
+12 -2
View File
@@ -28,6 +28,17 @@ void add_column_to_table(sqlite3* db, const std::string& table_name)
} }
} }
template <typename ColumnType, decltype(ColumnType::options) = nullptr>
void append_option(std::string& s)
{
s += " "s + ColumnType::options;
}
template <typename>
void append_option(...)
{ }
template <typename... T> template <typename... T>
class Table class Table
{ {
@@ -110,14 +121,13 @@ class Table
str += ColumnType::name; str += ColumnType::name;
str += " "; str += " ";
str += TypeToSQLType<RealType>::type; str += TypeToSQLType<RealType>::type;
str += " "s + ColumnType::options; append_option<ColumnType>(str);
if (N != sizeof...(T) - 1) if (N != sizeof...(T) - 1)
str += ","; str += ",";
str += "\n"; str += "\n";
add_column_create<N+1>(str); add_column_create<N+1>(str);
} }
template <std::size_t N=0> template <std::size_t N=0>
typename std::enable_if<N == sizeof...(T), void>::type typename std::enable_if<N == sizeof...(T), void>::type
add_column_create(std::string&) add_column_create(std::string&)