Replaced pool.get().unwrap() statements with get()?.

This commit is contained in:
Jordan Petridis 2017-11-25 03:29:06 +02:00
parent f0a0fdfa83
commit f83f894e44
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
6 changed files with 87 additions and 85 deletions

View File

@ -49,13 +49,12 @@ fn init_pool(db_path: &str) -> Pool {
.build(); .build();
let manager = ConnectionManager::<SqliteConnection>::new(db_path); let manager = ConnectionManager::<SqliteConnection>::new(db_path);
let pool = Arc::new(r2d2::Pool::new(config, manager).expect("Failed to create pool.")); let pool = Arc::new(r2d2::Pool::new(config, manager).expect("Failed to create pool."));
info!("Database pool initialized.");
{ {
let db = Arc::clone(&pool).get().unwrap(); let db = Arc::clone(&pool).get().expect("Failed to initialize pool.");
run_migration_on(&*db).unwrap(); run_migration_on(&*db).expect("Failed to run migrations during init.");
} }
info!("Database pool initialized.");
pool pool
} }

View File

@ -2,155 +2,156 @@ use diesel::prelude::*;
use diesel; use diesel;
use models::{Episode, NewEpisode, NewPodcast, NewSource, Podcast, Source}; use models::{Episode, NewEpisode, NewPodcast, NewSource, Podcast, Source};
use chrono::prelude::*; use chrono::prelude::*;
use errors::*;
/// Random db querries helper functions. /// Random db querries helper functions.
/// Probably needs cleanup. /// Probably needs cleanup.
use database::connection; use database::connection;
pub fn get_sources() -> QueryResult<Vec<Source>> { pub fn get_sources() -> Result<Vec<Source>> {
use schema::source::dsl::*; use schema::source::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
source.load::<Source>(&*con) Ok(source.load::<Source>(&*con)?)
} }
pub fn get_podcasts() -> QueryResult<Vec<Podcast>> { pub fn get_podcasts() -> Result<Vec<Podcast>> {
use schema::podcast::dsl::*; use schema::podcast::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
podcast.load::<Podcast>(&*con) Ok(podcast.load::<Podcast>(&*con)?)
} }
pub fn get_episodes() -> QueryResult<Vec<Episode>> { pub fn get_episodes() -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode.order(epoch.desc()).load::<Episode>(&*con) Ok(episode.order(epoch.desc()).load::<Episode>(&*con)?)
} }
pub fn get_downloaded_episodes() -> QueryResult<Vec<Episode>> { pub fn get_downloaded_episodes() -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode Ok(episode
.filter(local_uri.is_not_null()) .filter(local_uri.is_not_null())
.load::<Episode>(&*con) .load::<Episode>(&*con)?)
} }
pub fn get_played_episodes() -> QueryResult<Vec<Episode>> { pub fn get_played_episodes() -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode.filter(played.is_not_null()).load::<Episode>(&*con) Ok(episode.filter(played.is_not_null()).load::<Episode>(&*con)?)
} }
pub fn get_episode_from_id(ep_id: i32) -> QueryResult<Episode> { pub fn get_episode_from_id(ep_id: i32) -> Result<Episode> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode.filter(id.eq(ep_id)).get_result::<Episode>(&*con) Ok(episode.filter(id.eq(ep_id)).get_result::<Episode>(&*con)?)
} }
pub fn get_episode_local_uri_from_id(ep_id: i32) -> QueryResult<Option<String>> { pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result<Option<String>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode Ok(episode
.filter(id.eq(ep_id)) .filter(id.eq(ep_id))
.select(local_uri) .select(local_uri)
.get_result::<Option<String>>(&*con) .get_result::<Option<String>>(&*con)?)
} }
pub fn get_episodes_with_limit(limit: u32) -> QueryResult<Vec<Episode>> { pub fn get_episodes_with_limit(limit: u32) -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
episode Ok(episode
.order(epoch.desc()) .order(epoch.desc())
.limit(i64::from(limit)) .limit(i64::from(limit))
.load::<Episode>(&*con) .load::<Episode>(&*con)?)
} }
pub fn get_podcast_from_id(pid: i32) -> QueryResult<Podcast> { pub fn get_podcast_from_id(pid: i32) -> Result<Podcast> {
use schema::podcast::dsl::*; use schema::podcast::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
podcast.filter(id.eq(pid)).get_result::<Podcast>(&*con) Ok(podcast.filter(id.eq(pid)).get_result::<Podcast>(&*con)?)
} }
pub fn get_pd_episodes(parent: &Podcast) -> QueryResult<Vec<Episode>> { pub fn get_pd_episodes(parent: &Podcast) -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
Episode::belonging_to(parent) Ok(Episode::belonging_to(parent)
.order(epoch.desc()) .order(epoch.desc())
.load::<Episode>(&*con) .load::<Episode>(&*con)?)
} }
pub fn get_pd_unplayed_episodes(parent: &Podcast) -> QueryResult<Vec<Episode>> { pub fn get_pd_unplayed_episodes(parent: &Podcast) -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
Episode::belonging_to(parent) Ok(Episode::belonging_to(parent)
.filter(played.is_null()) .filter(played.is_null())
.order(epoch.desc()) .order(epoch.desc())
.load::<Episode>(&*con) .load::<Episode>(&*con)?)
} }
pub fn get_pd_episodes_limit(parent: &Podcast, limit: u32) -> QueryResult<Vec<Episode>> { pub fn get_pd_episodes_limit(parent: &Podcast, limit: u32) -> Result<Vec<Episode>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
Episode::belonging_to(parent) Ok(Episode::belonging_to(parent)
.order(epoch.desc()) .order(epoch.desc())
.limit(i64::from(limit)) .limit(i64::from(limit))
.load::<Episode>(&*con) .load::<Episode>(&*con)?)
} }
pub fn get_source_from_uri(uri_: &str) -> QueryResult<Source> { pub fn get_source_from_uri(uri_: &str) -> Result<Source> {
use schema::source::dsl::*; use schema::source::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
source.filter(uri.eq(uri_)).get_result::<Source>(&*con) Ok(source.filter(uri.eq(uri_)).get_result::<Source>(&*con)?)
} }
// pub fn get_podcast_from_title(title_: &str) -> QueryResult<Podcast> { // pub fn get_podcast_from_title(title_: &str) -> QueryResult<Podcast> {
// use schema::podcast::dsl::*; // use schema::podcast::dsl::*;
// let db = connection(); // let db = connection();
// let con = db.get().unwrap(); // let con = db.get()?;
// podcast // podcast
// .filter(title.eq(title_)) // .filter(title.eq(title_))
// .get_result::<Podcast>(&*con) // .get_result::<Podcast>(&*con)
// } // }
pub fn get_podcast_from_source_id(sid: i32) -> QueryResult<Podcast> { pub fn get_podcast_from_source_id(sid: i32) -> Result<Podcast> {
use schema::podcast::dsl::*; use schema::podcast::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
podcast Ok(podcast
.filter(source_id.eq(sid)) .filter(source_id.eq(sid))
.get_result::<Podcast>(&*con) .get_result::<Podcast>(&*con)?)
} }
pub fn get_episode_from_uri(con: &SqliteConnection, uri_: &str) -> QueryResult<Episode> { pub fn get_episode_from_uri(con: &SqliteConnection, uri_: &str) -> QueryResult<Episode> {
@ -159,11 +160,11 @@ pub fn get_episode_from_uri(con: &SqliteConnection, uri_: &str) -> QueryResult<E
episode.filter(uri.eq(uri_)).get_result::<Episode>(&*con) episode.filter(uri.eq(uri_)).get_result::<Episode>(&*con)
} }
pub fn remove_feed(pd: &Podcast) -> QueryResult<()> { pub fn remove_feed(pd: &Podcast) -> Result<()> {
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
con.transaction(|| -> QueryResult<()> { con.transaction(|| -> Result<()> {
delete_source(&con, pd.source_id())?; delete_source(&con, pd.source_id())?;
delete_podcast(&con, *pd.id())?; delete_podcast(&con, *pd.id())?;
delete_podcast_episodes(&con, *pd.id())?; delete_podcast_episodes(&con, *pd.id())?;
@ -190,17 +191,18 @@ pub fn delete_podcast_episodes(con: &SqliteConnection, parent_id: i32) -> QueryR
diesel::delete(episode.filter(podcast_id.eq(parent_id))).execute(&*con) diesel::delete(episode.filter(podcast_id.eq(parent_id))).execute(&*con)
} }
pub fn update_none_to_played_now(parent: &Podcast) -> QueryResult<usize> { pub fn update_none_to_played_now(parent: &Podcast) -> Result<usize> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
let epoch_now = Utc::now().timestamp() as i32; let epoch_now = Utc::now().timestamp() as i32;
con.transaction(|| -> QueryResult<usize> { con.transaction(|| -> Result<usize> {
diesel::update(Episode::belonging_to(parent).filter(played.is_null())) Ok(diesel::update(
.set(played.eq(Some(epoch_now))) Episode::belonging_to(parent).filter(played.is_null()),
.execute(&*con) ).set(played.eq(Some(epoch_now)))
.execute(&*con)?)
}) })
} }

View File

@ -44,7 +44,7 @@ impl Feed {
fn index_channel_items(&self, pd: &Podcast) -> Result<()> { fn index_channel_items(&self, pd: &Podcast) -> Result<()> {
let episodes = self.parse_channel_items(pd); let episodes = self.parse_channel_items(pd);
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
let _ = con.transaction::<(), Error, _>(|| { let _ = con.transaction::<(), Error, _>(|| {
episodes.into_iter().for_each(|x| { episodes.into_iter().for_each(|x| {
@ -83,7 +83,7 @@ impl Feed {
let eps = self.parse_channel_items(&pd); let eps = self.parse_channel_items(&pd);
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
// TODO: Make it parallel // TODO: Make it parallel
// This returns only the episodes in the xml feed. // This returns only the episodes in the xml feed.
let episodes: Vec<_> = eps.into_iter() let episodes: Vec<_> = eps.into_iter()
@ -142,7 +142,7 @@ mod tests {
use rss; use rss;
use models::Source; use models::Source;
use database::{connection, truncate_db}; use database::truncate_db;
use std::fs; use std::fs;
use std::io::BufReader; use std::io::BufReader;

View File

@ -27,19 +27,19 @@ impl NewSource {
} }
} }
fn index(&self) { fn index(&self) -> Result<()> {
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
// Throw away the result like `insert or ignore` // Throw away the result like `insert or ignore`
// Diesel deos not support `insert or ignore` yet. // Diesel deos not support `insert or ignore` yet.
let _ = dbqueries::insert_new_source(&con, self); let _ = dbqueries::insert_new_source(&con, self);
Ok(())
} }
// Look out for when tryinto lands into stable. // Look out for when tryinto lands into stable.
pub fn into_source(self) -> QueryResult<Source> { pub fn into_source(self) -> Result<Source> {
self.index(); self.index()?;
dbqueries::get_source_from_uri(&self.uri) dbqueries::get_source_from_uri(&self.uri)
} }
} }
@ -108,11 +108,11 @@ impl NewPodcast {
Ok(dbqueries::get_podcast_from_source_id(self.source_id)?) Ok(dbqueries::get_podcast_from_source_id(self.source_id)?)
} }
pub fn index(&self) -> QueryResult<()> { pub fn index(&self) -> Result<()> {
let pd = dbqueries::get_podcast_from_source_id(self.source_id); let pd = dbqueries::get_podcast_from_source_id(self.source_id);
let db = connection(); let db = connection();
let con = db.get().unwrap(); let con = db.get()?;
match pd { match pd {
Ok(foo) => { Ok(foo) => {
if foo.source_id() != self.source_id { if foo.source_id() != self.source_id {

View File

@ -2,7 +2,6 @@ use chrono::prelude::*;
use reqwest; use reqwest;
use diesel::SaveChangesDsl; use diesel::SaveChangesDsl;
use diesel::result::QueryResult;
use reqwest::header::{ETag, LastModified}; use reqwest::header::{ETag, LastModified};
use rss::Channel; use rss::Channel;
@ -133,18 +132,18 @@ impl Episode {
self.podcast_id self.podcast_id
} }
pub fn set_played_now(&mut self) -> QueryResult<()> { pub fn set_played_now(&mut self) -> Result<()> {
let epoch = Utc::now().timestamp() as i32; let epoch = Utc::now().timestamp() as i32;
self.set_played(Some(epoch)); self.set_played(Some(epoch));
self.save()?; self.save()?;
Ok(()) Ok(())
} }
pub fn save(&self) -> QueryResult<Episode> { pub fn save(&self) -> Result<Episode> {
let db = connection(); let db = connection();
let tempdb = db.get().unwrap(); let tempdb = db.get()?;
self.save_changes::<Episode>(&*tempdb) Ok(self.save_changes::<Episode>(&*tempdb)?)
} }
} }
@ -222,11 +221,11 @@ impl Podcast {
self.always_dl = b self.always_dl = b
} }
pub fn save(&self) -> QueryResult<Podcast> { pub fn save(&self) -> Result<Podcast> {
let db = connection(); let db = connection();
let tempdb = db.get().unwrap(); let tempdb = db.get()?;
self.save_changes::<Podcast>(&*tempdb) Ok(self.save_changes::<Podcast>(&*tempdb)?)
} }
} }
@ -283,11 +282,11 @@ impl<'a> Source {
Ok(()) Ok(())
} }
pub fn save(&self) -> QueryResult<Source> { pub fn save(&self) -> Result<Source> {
let db = connection(); let db = connection();
let tempdb = db.get().unwrap(); let tempdb = db.get()?;
self.save_changes::<Source>(&*tempdb) Ok(self.save_changes::<Source>(&*tempdb)?)
} }
pub fn into_feed(mut self) -> Result<Feed> { pub fn into_feed(mut self) -> Result<Feed> {
@ -332,7 +331,7 @@ impl<'a> Source {
Ok(Feed::from_channel_source(chan, self)) Ok(Feed::from_channel_source(chan, self))
} }
pub fn from_url(uri: &str) -> QueryResult<Source> { pub fn from_url(uri: &str) -> Result<Source> {
NewSource::new_with_uri(uri).into_source() NewSource::new_with_uri(uri).into_source()
} }
} }

View File

@ -1,5 +1,6 @@
use diesel::result; use diesel::result;
use reqwest; use reqwest;
use hammond_data;
use std::io; use std::io;
error_chain! { error_chain! {
@ -7,5 +8,6 @@ error_chain! {
ReqError(reqwest::Error); ReqError(reqwest::Error);
IoError(io::Error); IoError(io::Error);
DieselResultError(result::Error); DieselResultError(result::Error);
DataError(hammond_data::errors::Error);
} }
} }