From 579bee3b75afbcf1d70a13633aaf00e74a592880 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 31 Oct 2023 22:30:52 +0100 Subject: [PATCH] Implemented package information cache in package manager --- src/lay/lay/laySaltManagerDialog.cc | 51 ++++++++++++++++++++--------- src/lay/lay/laySaltManagerDialog.h | 1 + 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/lay/lay/laySaltManagerDialog.cc b/src/lay/lay/laySaltManagerDialog.cc index b034f93e8..d78aa5ebe 100644 --- a/src/lay/lay/laySaltManagerDialog.cc +++ b/src/lay/lay/laySaltManagerDialog.cc @@ -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 (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 (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 { diff --git a/src/lay/lay/laySaltManagerDialog.h b/src/lay/lay/laySaltManagerDialog.h index db3851801..dd899371b 100644 --- a/src/lay/lay/laySaltManagerDialog.h +++ b/src/lay/lay/laySaltManagerDialog.h @@ -190,6 +190,7 @@ private: std::unique_ptr m_salt_mine_reader; tl::DeferredMethod dm_mine_update_selected_changed; tl::DeferredMethod dm_mine_new_selected_changed; + std::map m_salt_grain_cache; SaltGrain *current_grain (); std::vector current_grains ();