From 39dff5e27a11db5ed9df4a6215399493d3bcdc6f Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Sun, 26 Nov 2017 00:40:03 +0200 Subject: [PATCH] Moved insert functions into an Insert trait and implemented it for each NewModel. --- hammond-data/src/dbqueries.rs | 18 --------------- hammond-data/src/models/insertables.rs | 32 +++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 6ae58d3..d621126 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -206,24 +206,6 @@ pub fn update_none_to_played_now(parent: &Podcast) -> Result { }) } -pub fn insert_new_source(con: &SqliteConnection, s: &NewSource) -> QueryResult { - use schema::source::dsl::*; - - diesel::insert_into(source).values(s).execute(&*con) -} - -pub fn insert_new_podcast(con: &SqliteConnection, pd: &NewPodcast) -> QueryResult { - use schema::podcast::dsl::*; - - diesel::insert_into(podcast).values(pd).execute(&*con) -} - -pub fn insert_new_episode(con: &SqliteConnection, ep: &NewEpisode) -> QueryResult { - use schema::episode::dsl::*; - - diesel::insert_into(episode).values(ep).execute(&*con) -} - pub fn update_podcast(con: &SqliteConnection, pd_id: i32, pd: &NewPodcast) -> QueryResult { use schema::podcast::dsl::*; diff --git a/hammond-data/src/models/insertables.rs b/hammond-data/src/models/insertables.rs index 99252ec..90f5ac3 100644 --- a/hammond-data/src/models/insertables.rs +++ b/hammond-data/src/models/insertables.rs @@ -7,8 +7,13 @@ use utils::url_cleaner; use errors::*; use dbqueries; +use diesel; use database::connection; +trait Insert { + fn insert(&self, &SqliteConnection) -> QueryResult; +} + #[derive(Insertable)] #[table_name = "source"] #[derive(Debug, Clone)] @@ -18,6 +23,13 @@ pub struct NewSource { http_etag: Option, } +impl Insert for NewSource { + fn insert(&self, con: &SqliteConnection) -> QueryResult { + use schema::source::dsl::*; + diesel::insert_into(source).values(self).execute(&*con) + } +} + impl NewSource { pub fn new_with_uri(uri: &str) -> NewSource { let uri = url_cleaner(uri); @@ -34,7 +46,7 @@ impl NewSource { // Throw away the result like `insert or ignore` // Diesel deos not support `insert or ignore` yet. - let _ = dbqueries::insert_new_source(&con, self); + let _ = self.insert(&con); Ok(()) } @@ -59,6 +71,13 @@ pub struct NewEpisode { pub podcast_id: i32, } +impl Insert for NewEpisode { + fn insert(&self, con: &SqliteConnection) -> QueryResult { + use schema::episode::dsl::*; + diesel::insert_into(episode).values(self).execute(&*con) + } +} + impl NewEpisode { // TODO: Currently using diesel from master git. // Watch out for v0.99.0 beta and change the toml. @@ -84,7 +103,7 @@ impl NewEpisode { } } Err(_) => { - dbqueries::insert_new_episode(con, self)?; + self.insert(con)?; } } Ok(()) @@ -102,6 +121,13 @@ pub struct NewPodcast { pub source_id: i32, } +impl Insert for NewPodcast { + fn insert(&self, con: &SqliteConnection) -> QueryResult { + use schema::podcast::dsl::*; + diesel::insert_into(podcast).values(self).execute(&*con) + } +} + impl NewPodcast { // Look out for when tryinto lands into stable. pub fn into_podcast(self) -> Result { @@ -127,7 +153,7 @@ impl NewPodcast { } } Err(_) => { - dbqueries::insert_new_podcast(&con, self)?; + self.insert(&con)?; } } Ok(())