summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouiz’ <louiz@louiz.org>2017-08-26 17:40:54 +0200
committerlouiz’ <louiz@louiz.org>2017-08-26 17:42:59 +0200
commit2c717d347d796a2b007331c42d78146e156eaea0 (patch)
treef9143de9de6d8b0470c527df6118f2270c0e1cd9
parent655151d88a6ab948949b73682c3a76a0274eb10c (diff)
downloadbiboumi-2c717d347d796a2b007331c42d78146e156eaea0.tar.gz
biboumi-2c717d347d796a2b007331c42d78146e156eaea0.tar.bz2
biboumi-2c717d347d796a2b007331c42d78146e156eaea0.tar.xz
biboumi-2c717d347d796a2b007331c42d78146e156eaea0.zip
Add an index for the muc_log_line table
This immensely speeds up the archive select queries. fix #3292
-rw-r--r--src/database/database.cpp3
-rw-r--r--src/database/index.hpp42
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);
+ }
+}