Cache the encoding_in database value, to avoid doing a query for each message
This commit is contained in:
@@ -22,15 +22,12 @@ static std::string in_encoding_for(const Bridge& bridge, const Iid& iid)
|
|||||||
{
|
{
|
||||||
#ifdef USE_DATABASE
|
#ifdef USE_DATABASE
|
||||||
const auto jid = bridge.get_bare_jid();
|
const auto jid = bridge.get_bare_jid();
|
||||||
auto options = Database::get_irc_channel_options_with_server_default(jid, iid.get_server(), iid.get_local());
|
return Database::get_encoding_in(jid, iid.get_server(), iid.get_local());
|
||||||
auto result = options.col<Database::EncodingIn>();
|
|
||||||
if (!result.empty())
|
|
||||||
return result;
|
|
||||||
#else
|
#else
|
||||||
(void)bridge;
|
(void)bridge;
|
||||||
(void)iid;
|
(void)iid;
|
||||||
#endif
|
|
||||||
return {"ISO-8859-1"};
|
return {"ISO-8859-1"};
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Bridge::Bridge(std::string user_jid, BiboumiComponent& xmpp, std::shared_ptr<Poller>& poller):
|
Bridge::Bridge(std::string user_jid, BiboumiComponent& xmpp, std::shared_ptr<Poller>& poller):
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ Database::GlobalOptionsTable Database::global_options("GlobalOptions_");
|
|||||||
Database::IrcServerOptionsTable Database::irc_server_options("IrcServerOptions_");
|
Database::IrcServerOptionsTable Database::irc_server_options("IrcServerOptions_");
|
||||||
Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOptions_");
|
Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOptions_");
|
||||||
Database::RosterTable Database::roster("roster");
|
Database::RosterTable Database::roster("roster");
|
||||||
|
std::map<Database::CacheKey, Database::EncodingIn::real_type> Database::encoding_in_cache{};
|
||||||
|
|
||||||
|
|
||||||
void Database::open(const std::string& filename)
|
void Database::open(const std::string& filename)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
class Database
|
class Database
|
||||||
@@ -140,7 +141,41 @@ class Database
|
|||||||
static RosterTable roster;
|
static RosterTable roster;
|
||||||
static sqlite3* db;
|
static sqlite3* db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some caches, to avoid doing very frequent query requests for a few options.
|
||||||
|
*/
|
||||||
|
using CacheKey = std::tuple<std::string, std::string, std::string>;
|
||||||
|
|
||||||
|
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<Database::EncodingIn>();
|
||||||
|
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:
|
private:
|
||||||
static std::string gen_uuid();
|
static std::string gen_uuid();
|
||||||
|
static std::map<CacheKey, EncodingIn::real_type> encoding_in_cache;
|
||||||
};
|
};
|
||||||
#endif /* USE_DATABASE */
|
#endif /* USE_DATABASE */
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com
|
|||||||
options.col<Database::EncodingIn>() = value->get_inner();
|
options.col<Database::EncodingIn>() = value->get_inner();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Database::invalidate_encoding_in_cache();
|
||||||
options.save(Database::db);
|
options.save(Database::db);
|
||||||
|
|
||||||
command_node.delete_all_children();
|
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);
|
options.save(Database::db);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user