diff options
Diffstat (limited to 'src/database')
-rw-r--r-- | src/database/database.cpp | 3 | ||||
-rw-r--r-- | src/database/index.hpp | 42 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp index 0f2349d..f706528 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -6,6 +6,8 @@ #include <utils/get_first_non_empty.hpp> #include <utils/time.hpp> +#include <database/index.hpp> + #include <sqlite3.h> sqlite3* Database::db; @@ -42,6 +44,7 @@ void Database::open(const std::string& filename) Database::irc_channel_options.upgrade(Database::db); Database::roster.create(Database::db); Database::roster.upgrade(Database::db); + create_index<Database::Owner, Database::IrcChanName, Database::IrcServerName>(Database::db, "archive_index", Database::muc_log_lines.get_name()); } diff --git a/src/database/index.hpp b/src/database/index.hpp new file mode 100644 index 0000000..5924779 --- /dev/null +++ b/src/database/index.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include <sqlite3.h> + +#include <string> +#include <tuple> + +namespace +{ +template <std::size_t N=0, typename... T> +typename std::enable_if<N == sizeof...(T), void>::type +add_column_name(std::string&) +{ } + +template <std::size_t N=0, typename... T> +typename std::enable_if<N < sizeof...(T), void>::type +add_column_name(std::string& out) +{ + using ColumnType = typename std::remove_reference<decltype(std::get<N>(std::declval<std::tuple<T...>>()))>::type; + out += ColumnType::name; + if (N != sizeof...(T) - 1) + out += ","; + add_column_name<N+1, T...>(out); +} +} + +template <typename... Columns> +void create_index(sqlite3* db, const std::string& name, const std::string& table) +{ + std::string res{"CREATE INDEX IF NOT EXISTS "}; + res += name + " ON " + table + "("; + add_column_name<0, Columns...>(res); + res += ")"; + + char* error; + const auto result = sqlite3_exec(db, res.data(), nullptr, nullptr, &error); + if (result != SQLITE_OK) + { + log_error("Error executing query: ", error); + sqlite3_free(error); + } +} |