diff options
author | louiz’ <louiz@louiz.org> | 2017-06-23 00:16:24 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2017-07-16 00:16:43 +0200 |
commit | 84034ed3dc19f718dcc93a35dbf4c840a55efb1b (patch) | |
tree | 70f6add500c66bc6e6aacddf1ed870ad31bae171 /src/database | |
parent | b2334707107e65dd15590b7472c990bbf79549eb (diff) | |
download | biboumi-84034ed3dc19f718dcc93a35dbf4c840a55efb1b.tar.gz biboumi-84034ed3dc19f718dcc93a35dbf4c840a55efb1b.tar.bz2 biboumi-84034ed3dc19f718dcc93a35dbf4c840a55efb1b.tar.xz biboumi-84034ed3dc19f718dcc93a35dbf4c840a55efb1b.zip |
Use a db roster to manage biboumi’s presence with the contacts
Diffstat (limited to 'src/database')
-rw-r--r-- | src/database/database.cpp | 51 | ||||
-rw-r--r-- | src/database/database.hpp | 15 |
2 files changed, 65 insertions, 1 deletions
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 b5f2ff0..c00c938 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -72,6 +72,11 @@ class Database struct Persistent: Column<bool> { static constexpr auto name = "persistent_"; 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; @@ -84,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; @@ -109,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); @@ -123,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: |