use log::{debug, info};
use crate::error::{Error, Result as SdkResult};
use crate::connection::{Connection, ConnectionOptions, DatabaseInfo};
pub struct DamengClient {
options: ConnectionOptions,
}
impl DamengClient {
pub fn new(options: ConnectionOptions) -> SdkResult<Self> {
debug!("Creating Dameng client with options: {}", options);
Self::validate_options(&options)?;
info!("Dameng client created successfully");
Ok(Self {
options,
})
}
pub fn connect(&self) -> SdkResult<Connection> {
debug!("Connecting to Dameng database");
let connection = Connection::with_options(self.options.clone())?;
info!("Successfully connected to Dameng database");
Ok(connection)
}
fn build_connection_string(options: &ConnectionOptions) -> String {
format!(
"Driver={{DM8 ODBC DRIVER}};Server={};Port={};UID={};PWD={};Schema={};",
options.server, options.port, options.username, options.password, options.schema
)
}
fn validate_options(options: &ConnectionOptions) -> SdkResult<()> {
if options.server.is_empty() {
return Err(Error::configuration("Server address cannot be empty"));
}
if options.port == 0 {
return Err(Error::configuration("Port cannot be zero"));
}
if options.username.is_empty() {
return Err(Error::configuration("Username cannot be empty"));
}
if options.password.is_empty() {
return Err(Error::configuration("Password cannot be empty"));
}
if options.schema.is_empty() {
return Err(Error::configuration("Schema cannot be empty"));
}
Ok(())
}
pub fn database_info(&self) -> SdkResult<DatabaseInfo> {
let connection = self.connect()?;
let info = connection.database_info()?;
Ok(info)
}
pub fn test_connection(&self) -> SdkResult<()> {
debug!("Testing database connection");
let mut connection = self.connect()?;
let _result = connection.execute("SELECT 1")?;
info!("Connection test successful");
Ok(())
}
pub fn options(&self) -> &ConnectionOptions {
&self.options
}
}