diff options
Diffstat (limited to 'src/db')
| -rw-r--r-- | src/db/mod.rs | 63 | ||||
| -rw-r--r-- | src/db/models.rs | 18 | ||||
| -rw-r--r-- | src/db/schema.rs | 21 |
3 files changed, 102 insertions, 0 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..8ce0011 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,63 @@ +use std::env;
+
+use diesel::prelude::*;
+
+use super::{Result, Error};
+pub use self::models::*;
+
+mod schema;
+mod models;
+
+fn connection() -> Result<PgConnection> {
+ let database_url = env::var("DATABASE_URL")?;
+ PgConnection::establish(&database_url).map_err(Error::from)
+}
+
+pub fn find_text(search: String) -> Result<TextMeme> {
+ use self::schema::text_memes::dsl::*;
+
+ let format_search = format!("%{}%", search);
+
+ let conn = connection()?;
+ text_memes
+ .filter(title.ilike(&format_search).or(content.ilike(&format_search)))
+ .limit(1)
+ .first::<TextMeme>(&conn)
+ .map_err(Error::from)
+}
+
+pub fn find_audio(search: String) -> Result<AudioMeme> {
+ use self::schema::audio_memes::dsl::*;
+
+ let format_search = format!("%{}%", search);
+
+ let conn = connection()?;
+ audio_memes
+ .filter(title.ilike(format_search))
+ .limit(1)
+ .first::<AudioMeme>(&conn)
+ .map_err(Error::from)
+}
+
+pub fn rand_audio() -> Result<AudioMeme> {
+ use self::schema::audio_memes::dsl::*;
+
+ let conn = connection()?;
+ audio_memes
+ .order(random.desc())
+ .first::<AudioMeme>(&conn)
+ .map_err(Error::from)
+}
+
+pub fn rand_text() -> Result<TextMeme> {
+ use self::schema::text_memes::dsl::*;
+
+ let conn = connection()?;
+ text_memes
+ .order(random.desc())
+ .first::<TextMeme>(&conn)
+ .map_err(Error::from)
+}
+
+use diesel::sql_types;
+no_arg_sql_function!(random, sql_types::Double, "SQL random() function");
diff --git a/src/db/models.rs b/src/db/models.rs new file mode 100644 index 0000000..899fa1e --- /dev/null +++ b/src/db/models.rs @@ -0,0 +1,18 @@ +use super::schema::*;
+
+#[derive(Insertable, Queryable, Identifiable, AsChangeset)]
+#[table_name="audio_memes"]
+pub struct AudioMeme {
+ pub id: i32,
+ pub title: String,
+ pub link: String,
+}
+
+#[derive(Insertable, Queryable, Identifiable, AsChangeset)]
+#[table_name="text_memes"]
+pub struct TextMeme {
+ pub id: i32,
+ pub title: String,
+ pub content: String,
+ pub pic_related: String,
+}
diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 0000000..b29a1ca --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,21 @@ +table! {
+ audio_memes (id) {
+ id -> Int4,
+ title -> Varchar,
+ link -> Varchar,
+ }
+}
+
+table! {
+ text_memes (id) {
+ id -> Int4,
+ title -> Varchar,
+ content -> Text,
+ pic_related -> Varchar,
+ }
+}
+
+allow_tables_to_appear_in_same_query!(
+ audio_memes,
+ text_memes,
+);
|
