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 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<Mutex<Pool>>,
}
impl Db {
pub fn initialize(env: String) -> Self {
pub fn initialize(env: String) -> Result<Self, mysql::Error> {
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<PooledConn, mysql::Error> {
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<PooledConn, mysql::Error> = pool.get_conn() ;
conn
let pool = self.pool.lock().unwrap();
pool.get_conn()
}
}

View File

@ -13,7 +13,7 @@ pub mod service;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
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<PooledConn, mysql::Error> = db.get_connection();
match conn_res {