diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index e0cb36d3bcfc1b43228148b347ab29ed54d6fce7..9fd0a5bf26229778b84a559836fbfaf8c38734e8 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -22,15 +22,12 @@ static std::string in_encoding_for(const Bridge& bridge, const Iid& iid) { #ifdef USE_DATABASE const auto jid = bridge.get_bare_jid(); - auto options = Database::get_irc_channel_options_with_server_default(jid, iid.get_server(), iid.get_local()); - auto result = options.col(); - if (!result.empty()) - return result; + return Database::get_encoding_in(jid, iid.get_server(), iid.get_local()); #else (void)bridge; (void)iid; -#endif return {"ISO-8859-1"}; +#endif } Bridge::Bridge(std::string user_jid, BiboumiComponent& xmpp, std::shared_ptr& poller): diff --git a/src/database/database.cpp b/src/database/database.cpp index 266b17e5fbc31ad26fc0dfe859a5e2d568d1ee96..0f2349d1afc7b1e5da39ebe67ba6a18766e13db1 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -14,6 +14,7 @@ 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"); +std::map Database::encoding_in_cache{}; void Database::open(const std::string& filename) diff --git a/src/database/database.hpp b/src/database/database.hpp index c00c938958d1855d7994053adc26a4c1bbf50c30..f4b2ecd745d5115fa020fdf6794cd3713608def6 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -13,6 +13,7 @@ #include #include +#include class Database @@ -140,7 +141,41 @@ class Database static RosterTable roster; static sqlite3* db; + /** + * Some caches, to avoid doing very frequent query requests for a few options. + */ + using CacheKey = std::tuple; + + static EncodingIn::real_type get_encoding_in(const std::string& owner, + const std::string& server, + const std::string& channel) + { + CacheKey channel_key{owner, server, channel}; + auto it = Database::encoding_in_cache.find(channel_key); + if (it == Database::encoding_in_cache.end()) + { + auto options = Database::get_irc_channel_options_with_server_default(owner, server, channel); + EncodingIn::real_type result = options.col(); + if (result.empty()) + result = "ISO-8859-1"; + it = Database::encoding_in_cache.insert(std::make_pair(channel_key, result)).first; + } + return it->second; + } + static void invalidate_encoding_in_cache(const std::string& owner, + const std::string& server, + const std::string& channel) + { + CacheKey channel_key{owner, server, channel}; + Database::encoding_in_cache.erase(channel_key); + } + static void invalidate_encoding_in_cache() + { + Database::encoding_in_cache.clear(); + } + private: static std::string gen_uuid(); + static std::map encoding_in_cache; }; #endif /* USE_DATABASE */ diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp index 65f9966da74495fc2c39e8c6d732b4a90f447b34..d78dc981875a07b5d75d8096dedffa7b2b3a0ea3 100644 --- a/src/xmpp/biboumi_adhoc_commands.cpp +++ b/src/xmpp/biboumi_adhoc_commands.cpp @@ -430,7 +430,7 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com options.col() = value->get_inner(); } - + Database::invalidate_encoding_in_cache(); options.save(Database::db); command_node.delete_all_children(); @@ -599,7 +599,7 @@ bool handle_irc_channel_configuration_form(XmppComponent& xmpp_component, const } } - + Database::invalidate_encoding_in_cache(requester.bare(), iid.get_server(), iid.get_local()); options.save(Database::db); } return true;