use std::sync::Arc;
use mongodb::{Client, Database};
use once_cell::sync::OnceCell;
use crate::connection::{create_client, create_client_options};
use crate::error::Error;
pub type Result<T> = std::result::Result<T, Error>;
pub(crate) static R_M_ORM_STATIC: OnceCell<Spark> = OnceCell::new();
#[derive(Debug)]
pub struct Spark {
#[allow(dead_code)]
client: Client,
db: Arc<Database>,
}
impl Spark {
pub async fn global_connect(
user_name: &str,
password: &str,
host: &str,
port: &str,
db_name: &str,
) -> Arc<Database> {
Self::init_logger();
let client_options = create_client_options(user_name, password, host, port)
.await
.unwrap();
let client = create_client(client_options).unwrap();
let db = client.database(db_name);
let rs = Spark {
client,
db: Arc::new(db),
};
R_M_ORM_STATIC.set(rs).unwrap();
Self::get_db()
}
pub async fn connect(
user_name: &str,
password: &str,
host: &str,
port: &str,
db_name: &str,
) -> Database {
Self::init_logger();
let client_options = create_client_options(user_name, password, host, port)
.await
.unwrap();
let client = create_client(client_options).unwrap();
client.database(db_name)
}
pub fn get_db() -> Arc<Database> {
let spark = R_M_ORM_STATIC.get();
match spark {
Some(rs) => rs.db.clone(),
None => panic!("The Data base not set !!!"),
}
}
pub fn from_mongo_result<T>(re: mongodb::error::Result<T>) -> Result<T> {
match re {
Ok(inner_re) => Ok(inner_re),
Err(error) => Err(Error::new(&error.to_string())),
}
}
pub fn use_db(){
}
fn init_logger() {
env_logger::init();
}
}