summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
authorlouiz’ <louiz@louiz.org>2017-07-28 18:03:16 +0200
committerlouiz’ <louiz@louiz.org>2017-07-28 18:03:16 +0200
commit8c92473a6681aaf671b21780202dde731772cee8 (patch)
tree6ff2ae92dc06ff873c2d0e162f50cc649f3b8198 /src/database
parent76f5fa81f2026770c907bee0e931aae8d8c7a1bd (diff)
parent6187423e6ed834570783ef3097a6ef73cc58107a (diff)
downloadbiboumi-8c92473a6681aaf671b21780202dde731772cee8.tar.gz
biboumi-8c92473a6681aaf671b21780202dde731772cee8.tar.bz2
biboumi-8c92473a6681aaf671b21780202dde731772cee8.tar.xz
biboumi-8c92473a6681aaf671b21780202dde731772cee8.zip
Merge branch 'master' into debian
Diffstat (limited to 'src/database')
-rw-r--r--src/database/count_query.hpp1
-rw-r--r--src/database/database.cpp51
-rw-r--r--src/database/database.hpp74
-rw-r--r--src/database/insert_query.hpp4
-rw-r--r--src/database/query.hpp5
-rw-r--r--src/database/row.hpp5
-rw-r--r--src/database/select_query.hpp2
-rw-r--r--src/database/table.cpp4
-rw-r--r--src/database/table.hpp21
9 files changed, 100 insertions, 67 deletions
diff --git a/src/database/count_query.hpp b/src/database/count_query.hpp
index b7bbf51..0dde63c 100644
--- a/src/database/count_query.hpp
+++ b/src/database/count_query.hpp
@@ -29,7 +29,6 @@ struct CountQuery: public Query
if (sqlite3_step(statement.get()) != SQLITE_DONE)
log_warning("Count request returned more than one result.");
- log_debug("Returning count: ", res);
return res;
}
};
diff --git a/src/database/database.cpp b/src/database/database.cpp
index 92f7682..85c675e 100644
--- a/src/database/database.cpp
+++ b/src/database/database.cpp
@@ -13,6 +13,8 @@ Database::MucLogLineTable Database::muc_log_lines("MucLogLine_");
Database::GlobalOptionsTable Database::global_options("GlobalOptions_");
Database::IrcServerOptionsTable Database::irc_server_options("IrcServerOptions_");
Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOptions_");
+Database::RosterTable Database::roster("roster");
+
void Database::open(const std::string& filename)
{
@@ -36,6 +38,8 @@ void Database::open(const std::string& filename)
Database::irc_server_options.upgrade(Database::db);
Database::irc_channel_options.create(Database::db);
Database::irc_channel_options.upgrade(Database::db);
+ Database::roster.create(Database::db);
+ Database::roster.upgrade(Database::db);
}
@@ -177,6 +181,51 @@ std::vector<Database::MucLogLine> Database::get_muc_logs(const std::string& owne
return {result.crbegin(), result.crend()};
}
+void Database::add_roster_item(const std::string& local, const std::string& remote)
+{
+ auto roster_item = Database::roster.row();
+
+ roster_item.col<Database::LocalJid>() = local;
+ roster_item.col<Database::RemoteJid>() = remote;
+
+ roster_item.save(Database::db);
+}
+
+void Database::delete_roster_item(const std::string& local, const std::string& remote)
+{
+ Query query("DELETE FROM "s + Database::roster.get_name());
+ query << " WHERE " << Database::RemoteJid{} << "=" << remote << \
+ " AND " << Database::LocalJid{} << "=" << local;
+
+ query.execute(Database::db);
+}
+
+bool Database::has_roster_item(const std::string& local, const std::string& remote)
+{
+ auto query = Database::roster.select();
+ query.where() << Database::LocalJid{} << "=" << local << \
+ " and " << Database::RemoteJid{} << "=" << remote;
+
+ auto res = query.execute(Database::db);
+
+ return !res.empty();
+}
+
+std::vector<Database::RosterItem> Database::get_contact_list(const std::string& local)
+{
+ auto query = Database::roster.select();
+ query.where() << Database::LocalJid{} << "=" << local;
+
+ return query.execute(Database::db);
+}
+
+std::vector<Database::RosterItem> Database::get_full_roster()
+{
+ auto query = Database::roster.select();
+
+ return query.execute(Database::db);
+}
+
void Database::close()
{
sqlite3_close_v2(Database::db);
@@ -192,4 +241,4 @@ std::string Database::gen_uuid()
return uuid_str;
}
-#endif \ No newline at end of file
+#endif
diff --git a/src/database/database.hpp b/src/database/database.hpp
index 28b6b1b..c00c938 100644
--- a/src/database/database.hpp
+++ b/src/database/database.hpp
@@ -20,85 +20,67 @@ class Database
public:
using time_point = std::chrono::system_clock::time_point;
- struct Uuid: Column<std::string> { static constexpr auto name = "uuid_";
- static constexpr auto options = ""; };
+ struct Uuid: Column<std::string> { static constexpr auto name = "uuid_"; };
- struct Owner: Column<std::string> { static constexpr auto name = "owner_";
- static constexpr auto options = ""; };
+ struct Owner: Column<std::string> { static constexpr auto name = "owner_"; };
- struct IrcChanName: Column<std::string> { static constexpr auto name = "ircChanName_";
- static constexpr auto options = ""; };
+ struct IrcChanName: Column<std::string> { static constexpr auto name = "ircChanName_"; };
- struct Channel: Column<std::string> { static constexpr auto name = "channel_";
- static constexpr auto options = ""; };
+ struct Channel: Column<std::string> { static constexpr auto name = "channel_"; };
- struct IrcServerName: Column<std::string> { static constexpr auto name = "ircServerName_";
- static constexpr auto options = ""; };
+ struct IrcServerName: Column<std::string> { static constexpr auto name = "ircServerName_"; };
- struct Server: Column<std::string> { static constexpr auto name = "server_";
- static constexpr auto options = ""; };
+ struct Server: Column<std::string> { static constexpr auto name = "server_"; };
- struct Date: Column<time_point::rep> { static constexpr auto name = "date_";
- static constexpr auto options = ""; };
+ struct Date: Column<time_point::rep> { static constexpr auto name = "date_"; };
- struct Body: Column<std::string> { static constexpr auto name = "body_";
- static constexpr auto options = ""; };
+ struct Body: Column<std::string> { static constexpr auto name = "body_"; };
- struct Nick: Column<std::string> { static constexpr auto name = "nick_";
- static constexpr auto options = ""; };
+ struct Nick: Column<std::string> { static constexpr auto name = "nick_"; };
- struct Pass: Column<std::string> { static constexpr auto name = "pass_";
- static constexpr auto options = ""; };
+ struct Pass: Column<std::string> { static constexpr auto name = "pass_"; };
struct Ports: Column<std::string> { static constexpr auto name = "ports_";
- static constexpr auto options = "";
Ports(): Column<std::string>("6667") {} };
struct TlsPorts: Column<std::string> { static constexpr auto name = "tlsPorts_";
- static constexpr auto options = "";
TlsPorts(): Column<std::string>("6697;6670") {} };
- struct Username: Column<std::string> { static constexpr auto name = "username_";
- static constexpr auto options = ""; };
+ struct Username: Column<std::string> { static constexpr auto name = "username_"; };
- struct Realname: Column<std::string> { static constexpr auto name = "realname_";
- static constexpr auto options = ""; };
+ struct Realname: Column<std::string> { static constexpr auto name = "realname_"; };
- struct AfterConnectionCommand: Column<std::string> { static constexpr auto name = "afterConnectionCommand_";
- static constexpr auto options = ""; };
+ struct AfterConnectionCommand: Column<std::string> { static constexpr auto name = "afterConnectionCommand_"; };
- struct TrustedFingerprint: Column<std::string> { static constexpr auto name = "trustedFingerprint_";
- static constexpr auto options = ""; };
+ struct TrustedFingerprint: Column<std::string> { static constexpr auto name = "trustedFingerprint_"; };
- struct EncodingOut: Column<std::string> { static constexpr auto name = "encodingOut_";
- static constexpr auto options = ""; };
+ struct EncodingOut: Column<std::string> { static constexpr auto name = "encodingOut_"; };
- struct EncodingIn: Column<std::string> { static constexpr auto name = "encodingIn_";
- static constexpr auto options = ""; };
+ struct EncodingIn: Column<std::string> { static constexpr auto name = "encodingIn_"; };
struct MaxHistoryLength: Column<int> { static constexpr auto name = "maxHistoryLength_";
- static constexpr auto options = "";
MaxHistoryLength(): Column<int>(20) {} };
struct RecordHistory: Column<bool> { static constexpr auto name = "recordHistory_";
- static constexpr auto options = "";
RecordHistory(): Column<bool>(true) {}};
- struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordHistory_";
- static constexpr auto options = ""; };
+ struct RecordHistoryOptional: Column<OptionalBool> { static constexpr auto name = "recordHistory_"; };
struct VerifyCert: Column<bool> { static constexpr auto name = "verifyCert_";
- static constexpr auto options = "";
VerifyCert(): Column<bool>(true) {} };
struct Persistent: Column<bool> { static constexpr auto name = "persistent_";
- static constexpr auto options = "";
Persistent(): Column<bool>(false) {} };
+ struct LocalJid: Column<std::string> { static constexpr auto name = "local"; };
+
+ struct RemoteJid: Column<std::string> { static constexpr auto name = "remote"; };
+
+
using MucLogLineTable = Table<Id, Uuid, Owner, IrcChanName, IrcServerName, Date, Body, Nick>;
using MucLogLine = MucLogLineTable::RowType;
- using GlobalOptionsTable = Table<Id, Owner, MaxHistoryLength, RecordHistory>;
+ using GlobalOptionsTable = Table<Id, Owner, MaxHistoryLength, RecordHistory, Persistent>;
using GlobalOptions = GlobalOptionsTable::RowType;
using IrcServerOptionsTable = Table<Id, Owner, Server, Pass, AfterConnectionCommand, TlsPorts, Ports, Username, Realname, VerifyCert, TrustedFingerprint, EncodingOut, EncodingIn, MaxHistoryLength>;
@@ -107,6 +89,9 @@ class Database
using IrcChannelOptionsTable = Table<Id, Owner, Server, Channel, EncodingOut, EncodingIn, MaxHistoryLength, Persistent, RecordHistoryOptional>;
using IrcChannelOptions = IrcChannelOptionsTable::RowType;
+ using RosterTable = Table<LocalJid, RemoteJid>;
+ using RosterItem = RosterTable::RowType;
+
Database() = default;
~Database() = default;
@@ -132,6 +117,12 @@ class Database
static std::string store_muc_message(const std::string& owner, const std::string& chan_name, const std::string& server_name,
time_point date, const std::string& body, const std::string& nick);
+ static void add_roster_item(const std::string& local, const std::string& remote);
+ static bool has_roster_item(const std::string& local, const std::string& remote);
+ static void delete_roster_item(const std::string& local, const std::string& remote);
+ static std::vector<Database::RosterItem> get_contact_list(const std::string& local);
+ static std::vector<Database::RosterItem> get_full_roster();
+
static void close();
static void open(const std::string& filename);
@@ -146,6 +137,7 @@ class Database
static GlobalOptionsTable global_options;
static IrcServerOptionsTable irc_server_options;
static IrcChannelOptionsTable irc_channel_options;
+ static RosterTable roster;
static sqlite3* db;
private:
diff --git a/src/database/insert_query.hpp b/src/database/insert_query.hpp
index 9e410ce..2ece69d 100644
--- a/src/database/insert_query.hpp
+++ b/src/database/insert_query.hpp
@@ -20,8 +20,6 @@ actual_bind(Statement& statement, std::vector<std::string>& params, const std::t
params.erase(params.begin());
if (sqlite3_bind_text(statement.get(), N + 1, value.data(), static_cast<int>(value.size()), SQLITE_TRANSIENT) != SQLITE_OK)
log_error("Failed to bind ", value, " to param ", N);
- else
- log_debug("Bound (not id) [", value, "] to ", N);
}
template <int N, typename ColumnType, typename... T>
@@ -36,8 +34,6 @@ actual_bind(Statement& statement, std::vector<std::string>&, const std::tuple<T.
}
else if (sqlite3_bind_null(statement.get(), N + 1) != SQLITE_OK)
log_error("Failed to bind NULL to param ", N);
- else
- log_debug("Bound NULL to ", N);
}
struct InsertQuery: public Query
diff --git a/src/database/query.hpp b/src/database/query.hpp
index f103fe9..6e1db12 100644
--- a/src/database/query.hpp
+++ b/src/database/query.hpp
@@ -23,7 +23,6 @@ struct Query
Statement prepare(sqlite3* db)
{
sqlite3_stmt* stmt;
- log_debug(this->body);
auto res = sqlite3_prepare(db, this->body.data(), static_cast<int>(this->body.size()) + 1,
&stmt, nullptr);
if (res != SQLITE_OK)
@@ -36,9 +35,7 @@ struct Query
for (const std::string& param: this->params)
{
if (sqlite3_bind_text(statement.get(), i, param.data(), static_cast<int>(param.size()), SQLITE_TRANSIENT) != SQLITE_OK)
- log_debug("Failed to bind ", param, " to param ", i);
- else
- log_debug("Bound ", param, " to ", i);
+ log_error("Failed to bind ", param, " to param ", i);
i++;
}
diff --git a/src/database/row.hpp b/src/database/row.hpp
index e7a58c4..2b50874 100644
--- a/src/database/row.hpp
+++ b/src/database/row.hpp
@@ -17,9 +17,7 @@ typename std::enable_if<std::is_same<std::decay_t<ColumnType>, Id>::value, void>
update_id(std::tuple<T...>& columns, sqlite3* db)
{
auto&& column = std::get<ColumnType>(columns);
- log_debug("Found an autoincrement col.");
auto res = sqlite3_last_insert_rowid(db);
- log_debug("Value is now: ", res);
column.value = static_cast<Id::real_type>(res);
}
@@ -45,7 +43,7 @@ struct Row
{}
template <typename Type>
- auto& col()
+ typename Type::real_type& col()
{
auto&& col = std::get<Type>(this->columns);
return col.value;
@@ -63,7 +61,6 @@ struct Row
InsertQuery query(this->table_name);
query.insert_col_names(this->columns);
query.insert_values(this->columns);
- log_debug(query.body);
query.execute(this->columns, db);
diff --git a/src/database/select_query.hpp b/src/database/select_query.hpp
index f4d71af..872001c 100644
--- a/src/database/select_query.hpp
+++ b/src/database/select_query.hpp
@@ -79,7 +79,7 @@ struct SelectQuery: public Query
using ColumnsType = std::tuple<T...>;
using ColumnType = typename std::remove_reference<decltype(std::get<N>(std::declval<ColumnsType>()))>::type;
- this->body += " "s + ColumnType::name;
+ this->body += " " + std::string{ColumnType::name};
if (N < (sizeof...(T) - 1))
this->body += ", ";
diff --git a/src/database/table.cpp b/src/database/table.cpp
index 5929f33..9224d79 100644
--- a/src/database/table.cpp
+++ b/src/database/table.cpp
@@ -4,12 +4,10 @@ std::set<std::string> get_all_columns_from_table(sqlite3* db, const std::string&
{
std::set<std::string> result;
char* errmsg;
- std::string query{"PRAGMA table_info("s + table_name + ")"};
- log_debug(query);
+ std::string query{"PRAGMA table_info(" + table_name + ")"};
int res = sqlite3_exec(db, query.data(), [](void* param, int columns_nb, char** columns, char**) -> int {
constexpr int name_column = 1;
std::set<std::string>* result = static_cast<std::set<std::string>*>(param);
- log_debug("Table has column ", columns[name_column]);
if (name_column < columns_nb)
result->insert(columns[name_column]);
return 0;
diff --git a/src/database/table.hpp b/src/database/table.hpp
index 411ac6a..0060211 100644
--- a/src/database/table.hpp
+++ b/src/database/table.hpp
@@ -2,7 +2,6 @@
#include <database/select_query.hpp>
#include <database/type_to_sql.hpp>
-#include <logger/logger.hpp>
#include <database/row.hpp>
#include <algorithm>
@@ -17,8 +16,7 @@ template <typename ColumnType>
void add_column_to_table(sqlite3* db, const std::string& table_name)
{
const std::string name = ColumnType::name;
- std::string query{"ALTER TABLE "s + table_name + " ADD " + ColumnType::name + " " + TypeToSQLType<typename ColumnType::real_type>::type};
- log_debug(query);
+ std::string query{"ALTER TABLE " + table_name + " ADD " + ColumnType::name + " " + TypeToSQLType<typename ColumnType::real_type>::type};
char* error;
const auto result = sqlite3_exec(db, query.data(), nullptr, nullptr, &error);
if (result != SQLITE_OK)
@@ -28,6 +26,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, typename... Args>
+void append_option(Args&& ...)
+{ }
+
template <typename... T>
class Table
{
@@ -55,11 +64,8 @@ class Table
this->add_column_create(res);
res += ")";
- log_debug(res);
-
char* error;
const auto result = sqlite3_exec(db, res.data(), nullptr, nullptr, &error);
- log_debug("result: ", +result);
if (result != SQLITE_OK)
{
log_error("Error executing query: ", error);
@@ -110,14 +116,13 @@ class Table
str += ColumnType::name;
str += " ";
str += TypeToSQLType<RealType>::type;
- str += " "s + ColumnType::options;
+ append_option<ColumnType>(str);
if (N != sizeof...(T) - 1)
str += ",";
str += "\n";
add_column_create<N+1>(str);
}
-
template <std::size_t N=0>
typename std::enable_if<N == sizeof...(T), void>::type
add_column_create(std::string&)