summaryrefslogtreecommitdiff
path: root/src/controller.cpp
diff options
context:
space:
mode:
authorGravatar Alexander Batischev <eual.jp@gmail.com> 2017-09-14 22:26:38 +0300
committerGravatar Alexander Batischev <eual.jp@gmail.com> 2017-09-14 22:26:38 +0300
commite6738569c3c3ca1b32f9892d98254f975da3c982 (patch)
tree85153ece5c6eeeb49c52805cdfdb2aa551048b29 /src/controller.cpp
parent37744d0a48fbcffcb5e18b25a703cea7b2e7cd76 (diff)
downloadnewsboat-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.cpp38
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 {