rbdc-oracle 0.10.0

Oracle driver for rbdc
Documentation
use crate::options::OracleConnectOptions;
use futures_core::future::BoxFuture;
use rbdc::db::{ConnectOptions, Connection, Driver, Placeholder};
use rbdc::{Error, impl_exchange};

#[derive(Debug)]
pub struct OracleDriver;

impl Driver for OracleDriver {
    fn name(&self) -> &str {
        "oracle"
    }

    fn connect(&self, url: &str) -> BoxFuture<'_, Result<Box<dyn Connection>, Error>> {
        let url = url.to_owned();
        Box::pin(async move {
            let mut options = self.default_option();
            options.set_uri(&url)?;
            let options = options
                .downcast_ref::<OracleConnectOptions>()
                .ok_or_else(|| Error::from("downcast_ref failure"))?;
            let connection = options.connect().await?;
            Ok(Box::new(connection) as Box<dyn Connection>)
        })
    }

    fn connect_opt<'a>(
        &'a self,
        opt: &'a dyn ConnectOptions,
    ) -> BoxFuture<'a, Result<Box<dyn Connection>, Error>> {
        let options = opt
            .downcast_ref::<OracleConnectOptions>()
            .ok_or_else(|| Error::from("OracleDriver::connect_opt requires OracleConnectOptions"));
        Box::pin(async move {
            let options = options?;
            let connection = options.connect().await?;
            Ok(Box::new(connection) as Box<dyn Connection>)
        })
    }

    fn default_option(&self) -> Box<dyn ConnectOptions> {
        Box::new(OracleConnectOptions::default())
    }
}

impl Placeholder for OracleDriver {
    fn exchange(&self, sql: &str) -> String {
        impl_exchange(":", 1, sql)
    }
}

impl OracleDriver {
    pub fn pub_exchange(&self, sql: &str) -> String {
        self.exchange(sql)
    }
}