From 1a8a6eca29afe2178c6cf17abce9ab7e229ca26c Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Thu, 24 Jan 2019 20:03:25 -0500 Subject: improve imports further and fix compile warnings --- src/db/mod.rs | 257 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 129 insertions(+), 128 deletions(-) (limited to 'src/db/mod.rs') diff --git a/src/db/mod.rs b/src/db/mod.rs index 722c72d..1ff05ce 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,128 +1,129 @@ -use std::{ - env, - convert::AsRef, -}; - -use diesel::{ - prelude::*, - r2d2::{ConnectionManager, ManageConnection}, - NotFound, -}; - -use super::{Result, Error}; -pub use self::models::*; -use self::schema::*; - -mod schema; -mod models; - -lazy_static! { - static ref DB_URL: String = env::var("DATABASE_URL").expect("no database url in environment").into(); - static ref CONN_MGR: ConnectionManager = ConnectionManager::new(DB_URL.clone()); -} - -pub fn connection() -> Result { - CONN_MGR.connect().map_err(Error::from) -} - -pub fn find_meme>(conn: &PgConnection, search: T) -> Result { - use diesel::dsl::sql; - use diesel::sql_types::Text; - - let search = search.as_ref(); - - // TODO: check for injection - let mut meme = memes::table - .filter(memes::title.eq(search)) - .limit(1) - .first::(conn); - - if let Err(NotFound) = meme { - let format_search = format!("%{}%", search); - - meme = memes::table - .filter(memes::title.ilike(&format_search).or(sql("content ILIKE ").bind::(&format_search))) - .limit(1) - .first::(conn); - } - - meme - .map_err(Error::from) -} - -pub fn delete_meme>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> { - conn.transaction::<(), Error, _>(|| { - let deleted = memes::table - .filter(memes::title.eq(search.as_ref())) - .first::(conn)?; - - ::diesel::delete(memes::table) - .filter(memes::id.eq(deleted.id)) - .execute(conn)?; - - if let Some(image_id) = deleted.image_id { - let count = memes::table - .filter(memes::image_id.eq(image_id)) - .count() - .execute(conn)?; - - if count == 0 { - ::diesel::delete(images::table) - .filter(images::id.eq(image_id)) - .execute(conn)?; - } - } - - if let Some(audio_id) = deleted.audio_id { - let count = memes::table - .select(::diesel::dsl::count_star()) - .filter(memes::audio_id.eq(audio_id)) - .execute(conn)?; - - if count == 0 { - ::diesel::delete(audio::table) - .filter(audio::id.eq(audio_id)) - .execute(conn)?; - } - } - - let tombstone = NewTombstone { - deleted_by: deleted_by as i64, - metadata_id: deleted.metadata_id, - meme_id: deleted.id, - }; - - let _ = ::diesel::insert_into(tombstones::table) - .values(&tombstone) - .execute(conn)?; - - Ok(()) - }) -} - -pub fn rand_text(conn: &PgConnection) -> Result { - memes::table - .filter(memes::content.is_not_null()) - .order(random.desc()) - .first::(conn) - .map_err(Error::from) -} - -pub fn rand_image(conn: &PgConnection) -> Result { - memes::table - .filter(memes::image_id.is_not_null()) - .order(random.desc()) - .first::(conn) - .map_err(Error::from) -} - -pub fn rand_audio(conn: &PgConnection) -> Result { - memes::table - .filter(memes::audio_id.is_not_null()) - .order(random.desc()) - .first::(conn) - .map_err(Error::from) -} - -use diesel::sql_types; -no_arg_sql_function!(random, sql_types::Double, "SQL random() function"); +use std::{ + convert::AsRef, + env, +}; + +use diesel::{ + NotFound, + prelude::*, + r2d2::{ConnectionManager, ManageConnection}, +}; +use diesel::sql_types; + +use crate::{Error, Result}; + +pub use self::models::*; +use self::schema::*; + +mod schema; +mod models; + +lazy_static! { + static ref DB_URL: String = env::var("DATABASE_URL").expect("no database url in environment").into(); + static ref CONN_MGR: ConnectionManager = ConnectionManager::new(DB_URL.clone()); +} + +pub fn connection() -> Result { + CONN_MGR.connect().map_err(Error::from) +} + +pub fn find_meme>(conn: &PgConnection, search: T) -> Result { + use diesel::dsl::sql; + use diesel::sql_types::Text; + + let search = search.as_ref(); + + // TODO: check for injection + let mut meme = memes::table + .filter(memes::title.eq(search)) + .limit(1) + .first::(conn); + + if let Err(NotFound) = meme { + let format_search = format!("%{}%", search); + + meme = memes::table + .filter(memes::title.ilike(&format_search).or(sql("content ILIKE ").bind::(&format_search))) + .limit(1) + .first::(conn); + } + + meme + .map_err(Error::from) +} + +pub fn delete_meme>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> { + conn.transaction::<(), Error, _>(|| { + let deleted = memes::table + .filter(memes::title.eq(search.as_ref())) + .first::(conn)?; + + ::diesel::delete(memes::table) + .filter(memes::id.eq(deleted.id)) + .execute(conn)?; + + if let Some(image_id) = deleted.image_id { + let count = memes::table + .filter(memes::image_id.eq(image_id)) + .count() + .execute(conn)?; + + if count == 0 { + ::diesel::delete(images::table) + .filter(images::id.eq(image_id)) + .execute(conn)?; + } + } + + if let Some(audio_id) = deleted.audio_id { + let count = memes::table + .select(::diesel::dsl::count_star()) + .filter(memes::audio_id.eq(audio_id)) + .execute(conn)?; + + if count == 0 { + ::diesel::delete(audio::table) + .filter(audio::id.eq(audio_id)) + .execute(conn)?; + } + } + + let tombstone = NewTombstone { + deleted_by: deleted_by as i64, + metadata_id: deleted.metadata_id, + meme_id: deleted.id, + }; + + let _ = ::diesel::insert_into(tombstones::table) + .values(&tombstone) + .execute(conn)?; + + Ok(()) + }) +} + +pub fn rand_text(conn: &PgConnection) -> Result { + memes::table + .filter(memes::content.is_not_null()) + .order(random.desc()) + .first::(conn) + .map_err(Error::from) +} + +pub fn rand_image(conn: &PgConnection) -> Result { + memes::table + .filter(memes::image_id.is_not_null()) + .order(random.desc()) + .first::(conn) + .map_err(Error::from) +} + +pub fn rand_audio(conn: &PgConnection) -> Result { + memes::table + .filter(memes::audio_id.is_not_null()) + .order(random.desc()) + .first::(conn) + .map_err(Error::from) +} + +no_arg_sql_function!(random, sql_types::Double, "SQL random() function"); -- cgit v1.3.1