diff options
Diffstat (limited to 'src/database')
-rw-r--r-- | src/database/count_query.hpp | 1 | ||||
-rw-r--r-- | src/database/database.cpp | 51 | ||||
-rw-r--r-- | src/database/database.hpp | 74 | ||||
-rw-r--r-- | src/database/insert_query.hpp | 4 | ||||
-rw-r--r-- | src/database/query.hpp | 5 | ||||
-rw-r--r-- | src/database/row.hpp | 5 | ||||
-rw-r--r-- | src/database/select_query.hpp | 2 | ||||
-rw-r--r-- | src/database/table.cpp | 4 | ||||
-rw-r--r-- | src/database/table.hpp | 21 |
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&) |