optimize database initializing

main
Mathias Rothenhaeusler 2023-09-25 19:16:26 +02:00
parent 94d05155fb
commit df19464626
2 changed files with 27 additions and 33 deletions

View File

@ -1,20 +1,19 @@
use mysql::{Pool, PooledConn, Opts}; use mysql::{Opts, Pool, PooledConn};
use sprintf::sprintf; use std::{
use std::{env, path::PathBuf}; env,
path::PathBuf,
sync::{Arc, Mutex},
};
use directories::BaseDirs; use directories::BaseDirs;
#[derive(Debug)] #[derive(Debug)]
pub struct Db { pub struct Db {
location: String, pool: Arc<Mutex<Pool>>,
user: String,
port: String,
password: String,
db_name: String,
} }
impl Db { impl Db {
pub fn initialize(env: String) -> Self { pub fn initialize(env: String) -> Result<Self, mysql::Error> {
let base_dir: BaseDirs = match BaseDirs::new() { let base_dir: BaseDirs = match BaseDirs::new() {
Some(dirs) => dirs, Some(dirs) => dirs,
None => panic!("No config folder found."), None => panic!("No config folder found."),
@ -27,31 +26,26 @@ impl Db {
Err(_) => panic!("Could not load .env file {:?}", config_file_path.as_path()), Err(_) => panic!("Could not load .env file {:?}", config_file_path.as_path()),
}; };
Db { let location: String = env::var("LOCATION").unwrap_or_else(|_| "localhost".to_string());
location: env::var("LOCATION").unwrap_or_else(|_| "localhost".to_string()), let user: String = env::var("USERNAME").unwrap();
user: env::var("USERNAME").unwrap(), let port: String = env::var("PORT").unwrap_or_else(|_| "3306".to_string());
port: env::var("PORT").unwrap_or_else(|_| "3306".to_string()), let password: String = env::var("PASSWORD").unwrap();
password: env::var("PASSWORD").unwrap(), let db_name: String = env::var("DB").unwrap_or_else(|_| "efulfilment".to_string());
db_name: 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<PooledConn, mysql::Error> { pub fn get_connection(&self) -> Result<PooledConn, mysql::Error> {
let url = sprintf!( let pool = self.pool.lock().unwrap();
"mysql://%s:%s@%s:%s/%s", pool.get_conn()
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<PooledConn, mysql::Error> = pool.get_conn() ;
conn
} }
} }

View File

@ -13,7 +13,7 @@ pub mod service;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> { fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
let args: Cli = Cli::parse(); let args: Cli = Cli::parse();
let env: &String = &Cli::parse().env.unwrap_or("local".to_string()); 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<PooledConn, mysql::Error> = db.get_connection(); let conn_res: Result<PooledConn, mysql::Error> = db.get_connection();
match conn_res { match conn_res {