From 413384896f66aeb2737f5f60433c2467d867fb36 Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Fri, 1 Jun 2018 05:42:40 -0400 Subject: various command improvements - support last_meme (report details about last meme played back) - update filter priority for meme search (check title match first) --- src/db/mod.rs | 19 +++++++++++++++---- src/db/models.rs | 10 ++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'src/db') diff --git a/src/db/mod.rs b/src/db/mod.rs index 0bf2f1d..d1d7c9b 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -3,6 +3,7 @@ use std::convert::AsRef; use diesel::prelude::*; use diesel::r2d2::{ConnectionManager, ManageConnection}; +use diesel::NotFound; use super::{Result, Error}; pub use self::models::*; @@ -25,13 +26,23 @@ pub fn find_meme>(conn: &PgConnection, search: T) -> Result use diesel::sql_types::Text; let search = search.as_ref(); - let format_search = format!("%{}%", search); // TODO: check for injection - memes::table - .filter(memes::title.ilike(&format_search).or(sql("content ILIKE ").bind::(&format_search))) + let mut meme = memes::table + .filter(memes::title.eq(search)) .limit(1) - .first::(conn) + .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) } diff --git a/src/db/models.rs b/src/db/models.rs index d25b593..0708e7c 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -23,6 +23,10 @@ impl Meme { pub fn audio(&self, conn: &PgConnection) -> Option> { self.audio_id.map(|x: i32| audio::table.filter(audio::id.eq(x)).first(conn).map_err(Error::from)) } + + pub fn find(conn: &PgConnection, id: i32) -> Result { + memes::table.find(id).get_result(conn).map_err(Error::from) + } } #[derive(Insertable, PartialEq, Debug)] @@ -167,6 +171,12 @@ impl Metadata { .get_result::(conn) .map_err(Error::from) } + + pub fn find(conn: &PgConnection, id: i32) -> Result { + metadata::table.find(id) + .get_result::(conn) + .map_err(Error::from) + } } #[derive(Insertable, PartialEq, Debug)] -- cgit v1.3.1