61 lines
1.7 KiB
Rust
61 lines
1.7 KiB
Rust
use mysql::{Pool, PooledConn, Opts};
|
|
use sprintf::sprintf;
|
|
use std::{env, path::PathBuf};
|
|
|
|
use directories::BaseDirs;
|
|
|
|
#[derive(Debug)]
|
|
pub struct Db {
|
|
location: String,
|
|
user: String,
|
|
port: String,
|
|
password: String,
|
|
db_name: String,
|
|
}
|
|
|
|
impl Db {
|
|
pub fn initialize(env: String) -> Self {
|
|
let base_dir: BaseDirs = match BaseDirs::new() {
|
|
Some(dirs) => dirs,
|
|
None => panic!("No config folder found."),
|
|
};
|
|
|
|
let config_file_path: PathBuf = base_dir.config_dir().join("rcc/").join(env);
|
|
|
|
match dotenv::from_path(config_file_path.as_path()) {
|
|
Ok(env) => env,
|
|
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()),
|
|
}
|
|
}
|
|
|
|
pub fn get_connection(&self) -> PooledConn {
|
|
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) => panic!("Cannot initialize pool: {e}"),
|
|
};
|
|
let conn: PooledConn = match pool.get_conn() {
|
|
Ok(db) => db,
|
|
Err(e) => panic!("Cannot connect to DB: {e}"),
|
|
};
|
|
|
|
conn
|
|
}
|
|
}
|