diff options
author | 2017-09-14 22:26:38 +0300 | |
---|---|---|
committer | 2017-09-14 22:26:38 +0300 | |
commit | e6738569c3c3ca1b32f9892d98254f975da3c982 (patch) | |
tree | 85153ece5c6eeeb49c52805cdfdb2aa551048b29 /src/controller.cpp | |
parent | 37744d0a48fbcffcb5e18b25a703cea7b2e7cd76 (diff) | |
download | newsboat-e6738569c3c3ca1b32f9892d98254f975da3c982.tar.gz newsboat-e6738569c3c3ca1b32f9892d98254f975da3c982.tar.zst newsboat-e6738569c3c3ca1b32f9892d98254f975da3c982.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | src/controller.cpp | 38 |
1 files changed, 10 insertions, 28 deletions
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<std::shared_ptr<rss_item>> controller::search_for_items(const std::string& query, std::shared_ptr<rss_feed> feed) { std::vector<std::shared_ptr<rss_item>> 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<rss_item> 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<std::string> 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 { |