rbdc_oracle/
driver.rs

1use crate::options::OracleConnectOptions;
2use crate::connection::OracleConnection;
3use futures_core::future::BoxFuture;
4use rbdc::db::{ConnectOptions, Connection};
5use rbdc::db::{Driver, Placeholder};
6use rbdc::{Error, impl_exchange};
7
8#[derive(Debug)]
9pub struct OracleDriver {}
10
11impl Driver for OracleDriver {
12    fn name(&self) -> &str {
13        "oracle"
14    }
15
16    fn connect(&self, url: &str) -> BoxFuture<Result<Box<dyn Connection>, Error>> {
17        let url = url.to_string();
18
19        Box::pin(async move {
20            let parsed_url =
21                url::Url::parse(&url).map_err(|e| Error::from(format!("Invalid URL: {}", e)))?;
22
23            if parsed_url.scheme() != "oracle" {
24                return Err(Error::from("URL scheme must be 'oracle'"));
25            }
26
27            let username = parsed_url.username().to_string();
28            let password = parsed_url
29                .password()
30                .ok_or_else(|| Error::from("Password is required"))?
31                .to_string();
32
33            let host = parsed_url
34                .host_str()
35                .ok_or_else(|| Error::from("Host is required"))?;
36            let port = parsed_url.port().unwrap_or(1521);
37            let service = parsed_url.path().trim_start_matches('/');
38
39            let connect_string = if service.is_empty() {
40                format!("//{}:{}", host, port)
41            } else {
42                format!("//{}:{}/{}", host, port, service)
43            };
44            
45            let opt = OracleConnectOptions { username: username, password: password, connect_string: connect_string };
46            let conn = OracleConnection::establish(&opt).await?;
47            Ok(Box::new(conn) as Box<dyn Connection>)
48        })
49    }
50
51    fn connect_opt<'a>(
52        &'a self,
53        opt: &'a dyn ConnectOptions,
54    ) -> BoxFuture<Result<Box<dyn Connection>, Error>> {
55        let opt = match opt.downcast_ref::<OracleConnectOptions>() {
56            Some(oracle_opt) => oracle_opt.clone(),
57            None => return Box::pin(async { Err(Error::from("Invalid connection options type")) }),
58        };
59        Box::pin(async move {
60            let conn = OracleConnection::establish(&opt).await?;
61            Ok(Box::new(conn) as Box<dyn Connection>)
62        })
63    }
64
65    fn default_option(&self) -> Box<dyn ConnectOptions> {
66        Box::new(OracleConnectOptions::default())
67    }
68}
69
70impl Placeholder for OracleDriver {
71    fn exchange(&self, sql: &str) -> String {
72        impl_exchange(":",1,sql)
73    }
74}
75
76impl OracleDriver{
77    pub fn pub_exchange(&self, sql: &str) -> String{
78        self.exchange(sql)
79    }
80}