From df19464626d2f44e4af83b9c3c6419ea04682f60 Mon Sep 17 00:00:00 2001 From: mace Date: Mon, 25 Sep 2023 19:16:26 +0200 Subject: [PATCH] optimize database initializing --- src/database/db.rs | 58 +++++++++++++++++++++------------------------- src/main.rs | 2 +- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/database/db.rs b/src/database/db.rs index 311cc07..6762e15 100644 --- a/src/database/db.rs +++ b/src/database/db.rs @@ -1,20 +1,19 @@ -use mysql::{Pool, PooledConn, Opts}; -use sprintf::sprintf; -use std::{env, path::PathBuf}; +use mysql::{Opts, Pool, PooledConn}; +use std::{ + env, + path::PathBuf, + sync::{Arc, Mutex}, +}; use directories::BaseDirs; #[derive(Debug)] pub struct Db { - location: String, - user: String, - port: String, - password: String, - db_name: String, + pool: Arc>, } impl Db { - pub fn initialize(env: String) -> Self { + pub fn initialize(env: String) -> Result { let base_dir: BaseDirs = match BaseDirs::new() { Some(dirs) => dirs, None => panic!("No config folder found."), @@ -27,31 +26,26 @@ impl Db { Err(_) => panic!("Could not load .env file {:?}", config_file_path.as_path()), }; - Db { - location: env::var("LOCATION").unwrap_or_else(|_| "localhost".to_string()), - user: env::var("USERNAME").unwrap(), - port: env::var("PORT").unwrap_or_else(|_| "3306".to_string()), - password: env::var("PASSWORD").unwrap(), - db_name: env::var("DB").unwrap_or_else(|_| "efulfilment".to_string()), - } + let location: String = env::var("LOCATION").unwrap_or_else(|_| "localhost".to_string()); + let user: String = env::var("USERNAME").unwrap(); + let port: String = env::var("PORT").unwrap_or_else(|_| "3306".to_string()); + let password: String = env::var("PASSWORD").unwrap(); + let db_name: String = env::var("DB").unwrap_or_else(|_| "efulfilment".to_string()); + let url: String = format!( + "mysql://{}:{}@{}:{}/{}", + user, password, location, port, db_name + ); + + let pool: Pool = Pool::new(Opts::from_url(&url)?)?; + let database: Db = Self { + pool: Arc::new(Mutex::new(pool)), + }; + + Ok(database) } pub fn get_connection(&self) -> Result { - let url = sprintf!( - "mysql://%s:%s@%s:%s/%s", - self.user, - self.password, - self.location, - self.port, - self.db_name - ).unwrap(); - - let pool = match Pool::new(Opts::from_url(&url).unwrap()) { - Ok(p) => p, - Err(e) => return Err(e), - }; - let conn: Result = pool.get_conn() ; - - conn + let pool = self.pool.lock().unwrap(); + pool.get_conn() } } diff --git a/src/main.rs b/src/main.rs index 6867350..cfaccda 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,7 @@ pub mod service; fn main() -> std::result::Result<(), Box> { let args: Cli = Cli::parse(); let env: &String = &Cli::parse().env.unwrap_or("local".to_string()); - let db: Db = Db::initialize(env.to_string()); + let db: Db = Db::initialize(env.to_string())?; let conn_res: Result = db.get_connection(); match conn_res {