diff options
| author | Nathan Perry <avaglir@gmail.com> | 2019-01-24 20:03:25 -0500 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2019-01-24 20:03:25 -0500 |
| commit | 1a8a6eca29afe2178c6cf17abce9ab7e229ca26c (patch) | |
| tree | 15f15250ab2bc940dc5b64b26729183a7c4e39e0 /src/db/mod.rs | |
| parent | 928fd4314db88c623ea991de4e6e669027f57848 (diff) | |
improve imports further and fix compile warnings
Diffstat (limited to 'src/db/mod.rs')
| -rw-r--r-- | src/db/mod.rs | 257 |
1 files changed, 129 insertions, 128 deletions
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<PgConnection> = ConnectionManager::new(DB_URL.clone());
-}
-
-pub fn connection() -> Result<PgConnection> {
- CONN_MGR.connect().map_err(Error::from)
-}
-
-pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> {
- 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::<Meme>(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::<Text, _>(&format_search)))
- .limit(1)
- .first::<Meme>(conn);
- }
-
- meme
- .map_err(Error::from)
-}
-
-pub fn delete_meme<T: AsRef<str>>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> {
- conn.transaction::<(), Error, _>(|| {
- let deleted = memes::table
- .filter(memes::title.eq(search.as_ref()))
- .first::<Meme>(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<Meme> {
- memes::table
- .filter(memes::content.is_not_null())
- .order(random.desc())
- .first::<Meme>(conn)
- .map_err(Error::from)
-}
-
-pub fn rand_image(conn: &PgConnection) -> Result<Meme> {
- memes::table
- .filter(memes::image_id.is_not_null())
- .order(random.desc())
- .first::<Meme>(conn)
- .map_err(Error::from)
-}
-
-pub fn rand_audio(conn: &PgConnection) -> Result<Meme> {
- memes::table
- .filter(memes::audio_id.is_not_null())
- .order(random.desc())
- .first::<Meme>(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<PgConnection> = ConnectionManager::new(DB_URL.clone()); +} + +pub fn connection() -> Result<PgConnection> { + CONN_MGR.connect().map_err(Error::from) +} + +pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> { + 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::<Meme>(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::<Text, _>(&format_search))) + .limit(1) + .first::<Meme>(conn); + } + + meme + .map_err(Error::from) +} + +pub fn delete_meme<T: AsRef<str>>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> { + conn.transaction::<(), Error, _>(|| { + let deleted = memes::table + .filter(memes::title.eq(search.as_ref())) + .first::<Meme>(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<Meme> { + memes::table + .filter(memes::content.is_not_null()) + .order(random.desc()) + .first::<Meme>(conn) + .map_err(Error::from) +} + +pub fn rand_image(conn: &PgConnection) -> Result<Meme> { + memes::table + .filter(memes::image_id.is_not_null()) + .order(random.desc()) + .first::<Meme>(conn) + .map_err(Error::from) +} + +pub fn rand_audio(conn: &PgConnection) -> Result<Meme> { + memes::table + .filter(memes::audio_id.is_not_null()) + .order(random.desc()) + .first::<Meme>(conn) + .map_err(Error::from) +} + +no_arg_sql_function!(random, sql_types::Double, "SQL random() function"); |
