dameng_rust_sdk 0.1.3

A Rust SDK for Dameng Database (DM8) with ODBC support
Documentation
//! Client for Dameng Rust SDK

use log::{debug, info};

use crate::error::{Error, Result as SdkResult};
use crate::connection::{Connection, ConnectionOptions, DatabaseInfo};

/// Dameng database client
pub struct DamengClient {
    options: ConnectionOptions,
}

impl DamengClient {
    /// Create a new Dameng client
    pub fn new(options: ConnectionOptions) -> SdkResult<Self> {
        debug!("Creating Dameng client with options: {}", options);
        
        // Validate connection options
        Self::validate_options(&options)?;
        
        info!("Dameng client created successfully");
        
        Ok(Self {
            options,
        })
    }
    
    /// Connect to the database
    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)
    }
    
    /// Build connection string from options
    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
        )
    }
    
    /// Validate connection options
    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(())
    }
    
    /// Get database information
    pub fn database_info(&self) -> SdkResult<DatabaseInfo> {
        let connection = self.connect()?;
        let info = connection.database_info()?;
        Ok(info)
    }
    
    /// Test the connection
    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(())
    }
    
    /// Get client options
    pub fn options(&self) -> &ConnectionOptions {
        &self.options
    }
}