NewSource: Remove Insert implemantation and replace it with a insert_or_ignore method.

This commit is contained in:
Jordan Petridis 2018-01-27 18:09:40 +02:00
parent a4660a0700
commit a3705d424b
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 23 additions and 18 deletions

View File

@ -5,6 +5,7 @@ use hyper;
use native_tls;
use reqwest;
use rss;
use url;
use std::io;
@ -17,6 +18,7 @@ error_chain! {
RSSError(rss::Error);
ReqError(reqwest::Error);
HyperError(hyper::Error);
UrlError(url::ParseError);
TLSError(native_tls::Error);
IoError(io::Error);
}

View File

@ -2,11 +2,11 @@
use diesel;
use diesel::prelude::*;
use url::Url;
use database::connection;
use dbqueries;
// use models::{Insert, Update};
use models::Insert;
use models::Source;
use schema::source;
@ -24,30 +24,30 @@ pub(crate) struct NewSource {
http_etag: Option<String>,
}
impl Insert for NewSource {
fn insert(&self) -> Result<()> {
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
// FIXME: Insert or ignore
let _ = diesel::insert_into(source).values(self).execute(&con);
Ok(())
}
}
impl NewSource {
pub(crate) fn new(uri: &str) -> NewSource {
pub(crate) fn new(uri: &Url) -> NewSource {
NewSource {
uri: uri.trim().to_string(),
uri: uri.to_string(),
last_modified: None,
http_etag: None,
}
}
pub(crate) fn insert_or_ignore(&self) -> Result<()> {
use schema::source::dsl::*;
let db = connection();
let con = db.get()?;
diesel::insert_or_ignore_into(source)
.values(self)
.execute(&con)
.map(|_| ())
.map_err(From::from)
}
// Look out for when tryinto lands into stable.
pub(crate) fn into_source(self) -> Result<Source> {
self.insert()?;
self.insert_or_ignore()?;
dbqueries::get_source_from_uri(&self.uri)
}
}

View File

@ -1,5 +1,6 @@
use diesel::SaveChangesDsl;
use rss::Channel;
use url::Url;
use hyper;
use hyper::{Client, Method, Request, Response, StatusCode, Uri};
@ -146,7 +147,9 @@ impl Source {
///
/// This only indexes the `Source` struct, not the Podcast Feed.
pub fn from_url(uri: &str) -> Result<Source> {
NewSource::new(uri).into_source()
let url = Url::parse(&uri)?;
NewSource::new(&url).into_source()
}
/// `Feed` constructor.

View File

@ -136,7 +136,7 @@ pub fn get_download_folder(pd_title: &str) -> Result<String> {
/// Removes all the entries associated with the given show from the database,
/// and deletes all of the downloaded content.
/// TODO: Write Tests
// TODO: Write Tests
pub fn delete_show(pd: &Podcast) -> Result<()> {
dbqueries::remove_feed(pd)?;
info!("{} was removed succesfully.", pd.title());