From e6738569c3c3ca1b32f9892d98254f975da3c982 Mon Sep 17 00:00:00 2001 From: Alexander Batischev Date: Thu, 14 Sep 2017 22:26:38 +0300 Subject: Use SQLite to search within query feeds This guarantees that the search within query feeds behaves exactly the same as the search within ordinary feeds. Fixes #520. --- src/controller.cpp | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) (limited to 'src/controller.cpp') diff --git a/src/controller.cpp b/src/controller.cpp index 40db06c5..3a534f28 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -1181,35 +1181,17 @@ void controller::rec_find_rss_outlines(xmlNode * node, std::string tag) { std::vector> controller::search_for_items(const std::string& query, std::shared_ptr feed) { std::vector> items; - LOG(level::DEBUG, "controller::search_for_items: setting feed pointers"); if (feed != nullptr && feed->rssurl().substr(0,6) == "query:") { - for (auto item : feed->items()) { - if (!item->deleted() - && (item->title().find(query) != std::string::npos - || item->description().find(query) != std::string::npos)) - { - std::shared_ptr newitem(new rss_item(nullptr)); - newitem->set_guid(item->guid()); - newitem->set_title(item->title()); - newitem->set_author(item->author()); - newitem->set_link(item->link()); - - newitem->set_pubDate(item->pubDate_timestamp()); - - newitem->set_size(item->size()); - newitem->set_unread(item->unread()); - newitem->set_feedurl(item->feedurl()); - - newitem->set_enclosure_url(item->enclosure_url()); - newitem->set_enclosure_type(item->enclosure_type()); - newitem->set_enqueued(item->enqueued()); - newitem->set_flags(item->flags()); - newitem->set_base(item->get_base()); - - newitem->set_feedptr(item->get_feedptr()); - newitem->set_cache(get_cache()); - - items.push_back(newitem); + std::unordered_set guids; + for (const auto& item : feed->items()) { + if (!item->deleted()) { + guids.insert(item->guid()); + } + } + guids = rsscache->search_in_items(query, guids); + for (const auto& item : feed->items()) { + if (guids.find(item->guid()) != guids.end()) { + items.push_back(item); } } } else { -- cgit v1.2.3