From a9dec8dbe898554b7515e5c00d3bfcbb7475c984 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Sat, 4 Nov 2017 13:56:23 +0200 Subject: [PATCH] Refactored refresh_feed. --- hammond-data/src/index_feed.rs | 13 +++++++++---- hammond-gtk/src/headerbar.rs | 2 +- hammond-gtk/src/main.rs | 3 ++- hammond-gtk/src/utils.rs | 21 +++++++++------------ 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/hammond-data/src/index_feed.rs b/hammond-data/src/index_feed.rs index 2ddb778..13904f3 100644 --- a/hammond-data/src/index_feed.rs +++ b/hammond-data/src/index_feed.rs @@ -90,9 +90,9 @@ fn insert_return_episode(con: &SqliteConnection, ep: &NewEpisode) -> Result Result<()> { - let mut f = fetch_feeds(db)?; + let mut f = fetch_all_feeds(db)?; - index_feed(&db, &mut f); + index_feed(db, &mut f); info!("Indexing done."); Ok(()) } @@ -166,12 +166,17 @@ fn index_channel_items(db: &Database, it: &[rss::Item], pd: &Podcast) { } // Maybe this can be refactored into an Iterator for lazy evaluation. -pub fn fetch_feeds(db: &Database) -> Result> { +pub fn fetch_all_feeds(db: &Database) -> Result> { let mut feeds = { let conn = db.lock().unwrap(); dbqueries::get_sources(&conn)? }; + let results = fetch_feeds(db, &mut feeds); + Ok(results) +} + +pub fn fetch_feeds(db: &Database, feeds: &mut [Source]) -> Vec { let results: Vec = feeds .par_iter_mut() .filter_map(|x| { @@ -186,7 +191,7 @@ pub fn fetch_feeds(db: &Database) -> Result> { }) .collect(); - Ok(results) + results } pub fn refresh_source(db: &Database, feed: &mut Source) -> Result { diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index da07c7c..7ac1d69 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -64,7 +64,7 @@ fn on_add_bttn_clicked(db: &Database, stack: >k::Stack, url: &str) { if let Ok(s) = source { // update the db - utils::refresh_feed(db, stack, Some(Box::new(vec![s]))); + utils::refresh_feed(db, stack, Some(vec![s])); } else { error!("Expected Error, feed probably already exists."); error!("Error: {:?}", source.unwrap_err()); diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 670e4da..a12acb0 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -12,8 +12,9 @@ extern crate hammond_downloader; extern crate log; extern crate loggerv; extern crate open; -extern crate rayon; +// extern crate rayon; +// use rayon::prelude::*; use log::LogLevel; use hammond_data::dbcheckup; diff --git a/hammond-gtk/src/utils.rs b/hammond-gtk/src/utils.rs index bfc7575..d3631fb 100644 --- a/hammond-gtk/src/utils.rs +++ b/hammond-gtk/src/utils.rs @@ -1,6 +1,5 @@ use glib; use gtk; -use rayon::prelude::*; use hammond_data::index_feed; use hammond_data::models::Source; @@ -18,26 +17,24 @@ thread_local!( gtk::Stack, Receiver)>> = RefCell::new(None)); -pub fn refresh_feed(db: &Database, stack: >k::Stack, source: Option>>) { +/// Update the rss feed(s) originating from `Source`. +/// If `source` is None, Fetches all the `Source` entries in the database and updates them. +/// When It's done,it queues up a `podcast_view` refresh. +pub fn refresh_feed(db: &Database, stack: >k::Stack, source: Option>) { + // Create a async channel. let (sender, receiver) = channel(); + // Pass the desired arguments into the Local Thread Storage. GLOBAL.with(clone!(db, stack => move |global| { *global.borrow_mut() = Some((db, stack, receiver)); })); - // TODO: add timeout option and error reporting. thread::spawn(clone!(db => move || { let feeds = { - if let Some(mut boxed_vec) = source { - let f = boxed_vec - .par_iter_mut() - .filter_map(|mut s| { - index_feed::refresh_source(&db, &mut s).ok() - }) - .collect(); - Ok(f) + if let Some(mut vec) = source { + Ok(index_feed::fetch_feeds(&db, &mut vec)) } else { - index_feed::fetch_feeds(&db) + index_feed::fetch_all_feeds(&db) } };