use tokio::sync::Mutex;
pub use crate::config::ConfigClient;
use crate::client_builder::ClientBuilder;
use mssql_client::{Client, Config, Ready};
use anyhow::{Ok, Result};
pub enum DbClient {
SqlServer(mssql_client::Client<Ready>),
MySql(mysql_async::Conn)
}
pub struct ClientSql{
client:Mutex<DbClient>,
}
impl ClientSql {
pub async fn new<'a>(cfg: &ConfigClient<'a>)->Result<Self>{
let conn_mssql =format!("Server={};User Id={};Password={};TrustServerCertificate=true", cfg.host, cfg.user, cfg.password);
if let std::result::Result::Ok(config) = Config::from_connection_string(&conn_mssql){
if let std::result::Result::Ok(client) = mssql_client::Client::connect(config).await{
return Ok(Self{client: Mutex::new(DbClient::SqlServer(client)),});
}
}
let conn_mysql=format!("mysql://{}:{}@{}:3306", cfg.user, cfg.password, cfg.host);
if let std::result::Result::Ok(opts)= mysql_async::Opts::from_url(&conn_mysql){
if let std::result::Result::Ok(client)=mysql_async::Conn::new(opts).await{
return Ok(Self { client: Mutex::new(DbClient::MySql(client)),});
}
}
anyhow::bail!("Erro de autentificação")
}
pub fn builder<'a>() -> ClientBuilder<'a> {
ClientBuilder::new()
}
}