From ce4e02594daf42fc12433efef55010ece8022e60 Mon Sep 17 00:00:00 2001 From: projectmoon Date: Thu, 31 Dec 2020 14:02:14 +0000 Subject: [PATCH] Add ability to pass in custom database path. --- .gitignore | 2 +- Cargo.toml | 2 +- src/db.rs | 8 +++++--- src/main.rs | 14 ++++++++++++-- src/migrate.rs | 13 ++++++++++++- src/migrator.rs | 7 ++++--- src/migrator/migrations/V1__users.rs | 2 +- src/migrator/migrations/V2__characters.rs | 2 +- 8 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 9b8c154..c76d9b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /target todo.org -*.sqlite +*.sqlite* *.sqlite.* diff --git a/Cargo.toml b/Cargo.toml index 6d41500..5eb49b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" default-run = "tenebrous" [[bin]] -name = "migrate" +name = "tenebrous-migrate" path = "src/migrate.rs" [[bin]] diff --git a/src/db.rs b/src/db.rs index 31e5bba..026c6ae 100644 --- a/src/db.rs +++ b/src/db.rs @@ -4,11 +4,13 @@ use sqlx::sqlite::{SqliteConnectOptions, SqlitePool, SqlitePoolOptions}; use sqlx::ConnectOptions; use std::str::FromStr; +/// Type alias for the Rocket-managed singleton database connection. pub type TenebrousDbConn<'a> = rocket::State<'a, SqlitePool>; -pub(crate) async fn create_pool() -> Result { +/// Create a connection pool to the database. +pub(crate) async fn create_pool(db_path: &str) -> Result { //Create database if missing. - let conn = SqliteConnectOptions::from_str("sqlite://tenebrous.sqlite")? + let conn = SqliteConnectOptions::from_str(&format!("sqlite://{}", db_path))? .create_if_missing(true) .connect() .await?; @@ -18,7 +20,7 @@ pub(crate) async fn create_pool() -> Result { //Return actual conncetion pool. SqlitePoolOptions::new() .max_connections(5) - .connect("tenebrous.sqlite") + .connect(db_path) .await .map_err(|e| e.into()) } diff --git a/src/main.rs b/src/main.rs index 8ef23fa..29b755c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ extern crate serde_derive; use rocket_contrib::serve::StaticFiles; use rocket_contrib::templates::Template; +use std::env; pub mod catchers; pub mod db; @@ -21,7 +22,16 @@ pub mod routes; #[rocket::main] async fn main() -> Result<(), Box> { - migrator::migrate().await?; + let args: Vec = env::args().collect(); + let db_path: &str = match &args[..] { + [_, path] => path.as_ref(), + [_, _, ..] => panic!("Expected exactly 0 or 1 argument"), + _ => "tenebrous.sqlite", + }; + + println!("Using database: {}", db_path); + + migrator::migrate(db_path).await?; let root_routes: Vec = { routes::root::routes() @@ -37,7 +47,7 @@ async fn main() -> Result<(), Box> { rocket::ignite() .attach(Template::fairing()) //.attach(db::TenebrousDbConn::fairing()) - .manage(crate::db::create_pool().await?) + .manage(crate::db::create_pool(db_path).await?) .mount("/", root_routes) .mount("/characters", character_routes) .mount("/api", api_routes) diff --git a/src/migrate.rs b/src/migrate.rs index c7d9f7b..5779dbd 100644 --- a/src/migrate.rs +++ b/src/migrate.rs @@ -1,6 +1,17 @@ +use std::env; + pub mod migrator; #[rocket::main] async fn main() -> Result<(), Box> { - crate::migrator::migrate().await + let args: Vec = env::args().collect(); + let db_path: &str = match &args[..] { + [_, path] => path.as_ref(), + [_, _, ..] => panic!("Expected exactly 0 or 1 argument"), + _ => "tenebrous.sqlite", + }; + + println!("Using database: {}", db_path); + + crate::migrator::migrate(db_path).await } diff --git a/src/migrator.rs b/src/migrator.rs index 4b1f9d3..e9d46e7 100644 --- a/src/migrator.rs +++ b/src/migrator.rs @@ -5,16 +5,17 @@ use std::str::FromStr; pub mod migrations; -pub(crate) async fn migrate() -> Result<(), Box> { +/// Run database migrations against the sqlite database. +pub(crate) async fn migrate(db_path: &str) -> Result<(), Box> { //Create database if missing. - let conn = SqliteConnectOptions::from_str("sqlite://tenebrous.sqlite")? + let conn = SqliteConnectOptions::from_str(&format!("sqlite://{}", db_path))? .create_if_missing(true) .connect() .await?; drop(conn); - let mut conn = Config::new(ConfigDbType::Sqlite).set_db_path("tenebrous.sqlite"); + let mut conn = Config::new(ConfigDbType::Sqlite).set_db_path(db_path); println!("Running migrations"); migrations::runner().run(&mut conn)?; Ok(()) diff --git a/src/migrator/migrations/V1__users.rs b/src/migrator/migrations/V1__users.rs index 107afc4..aabc96d 100644 --- a/src/migrator/migrations/V1__users.rs +++ b/src/migrator/migrations/V1__users.rs @@ -3,7 +3,7 @@ use barrel::{types, Migration}; pub fn migration() -> String { let mut m = Migration::new(); - println!("Applying: {}", file!()); + println!("Applying migration: {}", file!()); m.create_table("users", |t| { t.add_column("id", types::primary()); diff --git a/src/migrator/migrations/V2__characters.rs b/src/migrator/migrations/V2__characters.rs index a4aeb87..0d52a7f 100644 --- a/src/migrator/migrations/V2__characters.rs +++ b/src/migrator/migrations/V2__characters.rs @@ -3,7 +3,7 @@ use barrel::{types, Migration}; pub fn migration() -> String { let mut m = Migration::new(); - println!("Applying: {}", file!()); + println!("Applying migration: {}", file!()); m.create_table("characters", move |t| { let db_enum = r#"CHECK(data_type IN ('chronicles_of_darkness_v1', 'changeling_v1'))"#;