data_goes 0.1.0-alpha.3.3

Biblioteca experimental para demonstração.
Documentation
use std::{collections::HashMap};
use tokio::sync::Mutex;
pub use crate::config::ConfigClient;
use mssql_client::{Ready};
use anyhow::{Ok};

pub enum DbClient {
    SqlServer(mssql_client::Client<Ready>),
    MySql(mysql_async::Conn),
    ClickHouse(clickhouse::Client),
}
pub struct ClientSql{   
    pub(crate) clients: HashMap<String, Mutex<DbClient>>,   
}


impl ClientSql {
    pub async fn new() -> anyhow::Result<Self>{
        let toml_str = std::fs::read_to_string("database.toml").expect("Arquivo database.toml");
        let app_config: crate::config::AppConfig = toml::from_str(&toml_str)?;
        let mut clients = std::collections::HashMap::new();
        for server_cfg in app_config.servers{
            let conn_mssql = format!("Server={};User Id={};Password={};TrustServerCertificate=true", server_cfg.host, server_cfg.user, server_cfg.password);
            if let std::result::Result::Ok(config) = mssql_client::Config::from_connection_string(&conn_mssql){
                if let std::result::Result::Ok(client) = mssql_client::Client::connect(config).await{
                    clients.insert(server_cfg.host.clone(), Mutex::new(DbClient::SqlServer(client)));
                    continue;
                }
            }
            let conn_mysql = format!("mysql://{}:{}@{}:3306", server_cfg.user, server_cfg.password, server_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{
                    clients.insert(server_cfg.host.clone(), Mutex::new(DbClient::MySql(client)));
                    continue;
                }
            }
            let ch_url = format!("http://{}:8123", server_cfg.host);
            let client_ch = clickhouse::Client::default()
                .with_url(&ch_url)
                .with_user(server_cfg.user.to_string())
                .with_password(server_cfg.password.to_string());
            if let std::result::Result::Ok(_) = client_ch.query("SELECT 1").fetch_one::<u8>().await{
                clients.insert(server_cfg.host.clone(), Mutex::new(DbClient::ClickHouse(client_ch)));
                continue;
            }
        }
        Ok(Self{clients})
    }
}