Implemented package information cache in package manager

This commit is contained in:
Matthias Koefferlein 2023-10-31 22:30:52 +01:00
parent 82a0ef7791
commit 579bee3b75
2 changed files with 37 additions and 15 deletions

View File

@ -857,6 +857,8 @@ SaltManagerDialog::salt_mine_about_to_change ()
void
SaltManagerDialog::refresh ()
{
m_salt_grain_cache.clear ();
if (! m_salt_mine_url.empty ()) {
tl::log << tl::to_string (tr ("Downloading package repository from %1").arg (tl::to_qstring (m_salt_mine_url)));
@ -1227,10 +1229,12 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTex
tl_assert (m_downloaded_grain.get () == 0);
m_downloaded_grain.reset (0);
if (m_downloaded_grain_reader.get ()) {
// NOTE: don't delete the reader in the slot it triggered
m_downloaded_grain_reader->close ();
}
m_downloaded_grain_reader.reset (0);
mp_downloaded_target = details;
m_salt_mine_grain.reset (new lay::SaltGrain (*g));
@ -1262,21 +1266,31 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTex
std::string url = g->url ();
m_downloaded_grain.reset (new SaltGrain ());
m_downloaded_grain->set_url (url);
auto sg = m_salt_grain_cache.find (url);
if (sg == m_salt_grain_cache.end ()) {
// NOTE: stream_from_url may modify the URL, hence we set it again
ProcessEventCallback callback;
m_downloaded_grain_reader.reset (SaltGrain::stream_from_url (url, 60.0, &callback));
m_downloaded_grain->set_url (url);
m_downloaded_grain.reset (new SaltGrain ());
m_downloaded_grain->set_url (url);
// NOTE: stream_from_url may modify the URL, hence we set it again
ProcessEventCallback callback;
m_downloaded_grain_reader.reset (SaltGrain::stream_from_url (url, 60.0, &callback));
m_downloaded_grain->set_url (url);
tl::InputHttpStream *http = dynamic_cast<tl::InputHttpStream *> (m_downloaded_grain_reader->base ());
if (http) {
// async reading on HTTP
http->ready ().add (this, &SaltManagerDialog::data_ready);
http->send ();
} else {
data_ready ();
}
tl::InputHttpStream *http = dynamic_cast<tl::InputHttpStream *> (m_downloaded_grain_reader->base ());
if (http) {
// async reading on HTTP
http->ready ().add (this, &SaltManagerDialog::data_ready);
http->send ();
} else {
m_downloaded_grain.reset (new SaltGrain (sg->second));
data_ready ();
}
} catch (tl::Exception &ex) {
@ -1295,14 +1309,21 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTex
void
SaltManagerDialog::data_ready ()
{
if (! m_salt_mine_grain.get () || ! m_downloaded_grain.get () || ! m_downloaded_grain_reader.get () || ! mp_downloaded_target) {
if (! m_salt_mine_grain.get () || ! m_downloaded_grain.get () || ! mp_downloaded_target) {
return;
}
// Load the grain file (save URL as it is overwritten by the grain.xml content)
std::string url = m_downloaded_grain->url ();
m_downloaded_grain->load (*m_downloaded_grain_reader);
m_downloaded_grain->set_url (url);
if (m_downloaded_grain_reader.get ()) {
m_downloaded_grain->load (*m_downloaded_grain_reader);
m_downloaded_grain->set_url (url);
}
// commit to cache
if (m_salt_grain_cache.find (url) == m_salt_grain_cache.end ()) {
m_salt_grain_cache [url] = *m_downloaded_grain;
}
try {

View File

@ -190,6 +190,7 @@ private:
std::unique_ptr<tl::InputStream> m_salt_mine_reader;
tl::DeferredMethod<SaltManagerDialog> dm_mine_update_selected_changed;
tl::DeferredMethod<SaltManagerDialog> dm_mine_new_selected_changed;
std::map<std::string, lay::SaltGrain> m_salt_grain_cache;
SaltGrain *current_grain ();
std::vector<lay::SaltGrain *> current_grains ();