From a58671ea9a4e7924385968ab0947f4eb6c58d1bc Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 22 Nov 2017 21:54:09 +0200 Subject: [PATCH] Moved database related things into their own module. --- hammond-data/src/database.rs | 77 +++++++++++++++++++++++++++ hammond-data/src/dbqueries.rs | 2 +- hammond-data/src/lib.rs | 66 +---------------------- hammond-data/src/models/queryables.rs | 2 +- hammond-data/src/utils.rs | 11 ---- 5 files changed, 80 insertions(+), 78 deletions(-) create mode 100644 hammond-data/src/database.rs diff --git a/hammond-data/src/database.rs b/hammond-data/src/database.rs new file mode 100644 index 0000000..a6b031f --- /dev/null +++ b/hammond-data/src/database.rs @@ -0,0 +1,77 @@ +// use r2d2_diesel::ConnectionManager; +// use diesel::SqliteConnection; +use diesel::prelude::*; + +use std::path::PathBuf; +use std::sync::{Arc, Mutex}; +use std::io; +// use std::time::Duration; + +use xdg_; +use errors::*; + +// type Pool = r2d2::Pool>; +type Database = Arc>; + +embed_migrations!("migrations/"); + +lazy_static!{ + // static ref POOL: Pool = init_pool(DB_PATH.to_str().unwrap()); + + static ref DB: Arc> = Arc::new(Mutex::new(establish_connection())); +} + +#[cfg(not(test))] +lazy_static! { + static ref DB_PATH: PathBuf = xdg_::HAMMOND_XDG.place_data_file("hammond.db").unwrap(); +} + +#[cfg(test)] +extern crate tempdir; + +#[cfg(test)] +lazy_static! { + static ref TEMPDIR: tempdir::TempDir = { + tempdir::TempDir::new("hammond_unit_test").unwrap() + }; + + static ref DB_PATH: PathBuf = TEMPDIR.path().join("hammond.db"); +} + +pub fn connection() -> Database { + // POOL.clone() + Arc::clone(&DB) +} + +// fn init_pool(db_path: &str) -> Pool { +// let config = r2d2::Config::builder() +// // .pool_size(60) +// // .min_idle(Some(60)) +// // .connection_timeout(Duration::from_secs(60)) +// .build(); +// let manager = ConnectionManager::::new(db_path); +// let pool = r2d2::Pool::new(config, manager).expect("Failed to create pool."); +// info!("Database pool initialized."); + +// { +// let db = pool.clone().get().unwrap(); +// utils::run_migration_on(&*db).unwrap(); +// } + +// pool +// } + +pub fn establish_connection() -> SqliteConnection { + let database_url = DB_PATH.to_str().unwrap(); + let db = SqliteConnection::establish(database_url) + .expect(&format!("Error connecting to {}", database_url)); + run_migration_on(&db).unwrap(); + db +} + +pub fn run_migration_on(connection: &SqliteConnection) -> Result<()> { + info!("Running DB Migrations..."); + // embedded_migrations::run(connection)?; + embedded_migrations::run_with_output(connection, &mut io::stdout())?; + Ok(()) +} diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index f1be976..02c45b3 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -6,7 +6,7 @@ use chrono::prelude::*; /// Random db querries helper functions. /// Probably needs cleanup. -use connection; +use database::connection; pub fn get_sources() -> QueryResult> { use schema::source::dsl::*; diff --git a/hammond-data/src/lib.rs b/hammond-data/src/lib.rs index c435468..94dfc8d 100644 --- a/hammond-data/src/lib.rs +++ b/hammond-data/src/lib.rs @@ -29,23 +29,13 @@ pub mod dbqueries; pub mod utils; pub mod feed; pub mod errors; +pub mod database; mod models; mod parser; mod schema; -// use r2d2_diesel::ConnectionManager; -// use diesel::SqliteConnection; -use diesel::prelude::*; - -use std::path::PathBuf; -use std::sync::{Arc, Mutex}; -// use std::time::Duration; - pub use models::{Episode, Podcast, Source}; -// type Pool = r2d2::Pool>; -type Database = Arc>; - pub mod xdg_ { use std::path::PathBuf; use xdg; @@ -72,57 +62,3 @@ pub mod xdg_ { }; } } - -lazy_static!{ - // static ref POOL: Pool = init_pool(DB_PATH.to_str().unwrap()); - - static ref DB: Arc> = Arc::new(Mutex::new(establish_connection())); -} - -#[cfg(not(test))] -lazy_static! { - static ref DB_PATH: PathBuf = xdg_::HAMMOND_XDG.place_data_file("hammond.db").unwrap(); -} - -#[cfg(test)] -extern crate tempdir; - -#[cfg(test)] -lazy_static! { - static ref TEMPDIR: tempdir::TempDir = { - tempdir::TempDir::new("hammond_unit_test").unwrap() - }; - - static ref DB_PATH: PathBuf = TEMPDIR.path().join("hammond.db"); -} - -pub fn connection() -> Database { - // POOL.clone() - Arc::clone(&DB) -} - -// fn init_pool(db_path: &str) -> Pool { -// let config = r2d2::Config::builder() -// // .pool_size(60) -// // .min_idle(Some(60)) -// // .connection_timeout(Duration::from_secs(60)) -// .build(); -// let manager = ConnectionManager::::new(db_path); -// let pool = r2d2::Pool::new(config, manager).expect("Failed to create pool."); -// info!("Database pool initialized."); - -// { -// let db = pool.clone().get().unwrap(); -// utils::run_migration_on(&*db).unwrap(); -// } - -// pool -// } - -pub fn establish_connection() -> SqliteConnection { - let database_url = DB_PATH.to_str().unwrap(); - let db = SqliteConnection::establish(database_url) - .expect(&format!("Error connecting to {}", database_url)); - utils::run_migration_on(&db).unwrap(); - db -} diff --git a/hammond-data/src/models/queryables.rs b/hammond-data/src/models/queryables.rs index f896533..8316447 100644 --- a/hammond-data/src/models/queryables.rs +++ b/hammond-data/src/models/queryables.rs @@ -9,7 +9,7 @@ use feed::Feed; use errors::*; use models::insertables::NewSource; -use connection; +use database::connection; use std::io::Read; use std::str::FromStr; diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index 4d80076..46493bd 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -1,7 +1,6 @@ use rayon::prelude::*; use chrono::prelude::*; -use diesel::sqlite::SqliteConnection; use url::{Position, Url}; use errors::*; @@ -10,16 +9,6 @@ use models::Episode; use std::path::Path; use std::fs; -use std::io; - -embed_migrations!("migrations/"); - -pub fn run_migration_on(connection: &SqliteConnection) -> Result<()> { - info!("Running DB Migrations..."); - // embedded_migrations::run(connection)?; - embedded_migrations::run_with_output(connection, &mut io::stdout())?; - Ok(()) -} // TODO: Write unit test. fn download_checker() -> Result<()> {