From 1fda857d25c3d33e593951eef3ce713fa69a7025 Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Thu, 5 Apr 2018 20:53:37 -0400 Subject: start to integrate db support with commands --- src/db/mod.rs | 69 +++++++++++++++++++++++++++++++++++--------------------- src/db/models.rs | 54 ++++++++++++++++++++++++++++++++------------ 2 files changed, 82 insertions(+), 41 deletions(-) (limited to 'src/db') diff --git a/src/db/mod.rs b/src/db/mod.rs index 8ce0011..e1c3a55 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,61 +1,78 @@ use std::env; use diesel::prelude::*; +use diesel::r2d2::{ConnectionManager, ManageConnection}; use super::{Result, Error}; pub use self::models::*; +use self::schema::*; mod schema; mod models; -fn connection() -> Result { - let database_url = env::var("DATABASE_URL")?; - PgConnection::establish(&database_url).map_err(Error::from) +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 find_text(search: String) -> Result { - use self::schema::text_memes::dsl::*; +pub fn connection() -> Result { + CONN_MGR.connect().map_err(Error::from) +} + +pub trait AssociatedData { + type Associated; + + fn associated_data(&self, conn: &PgConnection) -> Result; +} +pub fn find_text(conn: &PgConnection, search: String) -> Result { let format_search = format!("%{}%", search); - let conn = connection()?; - text_memes - .filter(title.ilike(&format_search).or(content.ilike(&format_search))) + text_memes::table + .filter(text_memes::title.ilike(&format_search).or(text_memes::content.ilike(&format_search))) .limit(1) - .first::(&conn) + .first::(conn) .map_err(Error::from) } -pub fn find_audio(search: String) -> Result { - use self::schema::audio_memes::dsl::*; - +pub fn find_audio(conn: &PgConnection, search: String) -> Result { let format_search = format!("%{}%", search); - let conn = connection()?; - audio_memes - .filter(title.ilike(format_search)) + audio_memes::table + .filter(audio_memes::title.ilike(format_search)) .limit(1) - .first::(&conn) + .first::(conn) .map_err(Error::from) } -pub fn rand_audio() -> Result { - use self::schema::audio_memes::dsl::*; +pub fn find_image(conn: &PgConnection, search: String) -> Result { + let format_search = format!("%{}%", search); - let conn = connection()?; - audio_memes + image_memes::table + .filter(image_memes::title.ilike(format_search)) + .limit(1) + .first::(conn) + .map_err(Error::from) +} + +pub fn rand_text(conn: &PgConnection) -> Result { + text_memes::table .order(random.desc()) - .first::(&conn) + .first::(conn) .map_err(Error::from) } -pub fn rand_text() -> Result { - use self::schema::text_memes::dsl::*; +pub fn rand_image(conn: &PgConnection) -> Result { + image_memes::table + .order(random.desc()) + .first::(conn) + .map_err(Error::from) +} - let conn = connection()?; - text_memes +pub fn rand_audio(conn: &PgConnection) -> Result { + audio_memes::table .order(random.desc()) - .first::(&conn) + .first::(conn) .map_err(Error::from) } diff --git a/src/db/models.rs b/src/db/models.rs index 85cba2a..c07a12a 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -1,5 +1,9 @@ -use super::schema::*; use chrono::naive::NaiveDateTime; +use diesel::prelude::*; + +use super::schema::*; +use super::AssociatedData; +use ::{Result, Error}; #[derive(Insertable, Queryable, Identifiable, PartialEq, AsChangeset, Debug)] #[table_name="text_memes"] @@ -12,6 +16,18 @@ pub struct TextMeme { pub metadata_id: i32, } +impl AssociatedData for TextMeme { + type Associated = (Option, Option