rbdc_mssql/
driver.rs

1use crate::{MssqlConnectOptions, MssqlConnection};
2use futures_core::future::BoxFuture;
3use rbdc::db::{ConnectOptions, Connection, Driver, Placeholder};
4use rbdc::{impl_exchange, Error};
5use tiberius::Config;
6
7#[derive(Debug)]
8pub struct MssqlDriver {}
9
10impl Driver for MssqlDriver {
11    fn name(&self) -> &str {
12        "mssql"
13    }
14
15    fn connect(&self, url: &str) -> BoxFuture<Result<Box<dyn Connection>, Error>> {
16        let url = url.to_owned();
17        Box::pin(async move {
18            let mut opt = self.default_option();
19            opt.set_uri(&url)?;
20            if let Some(opt) = opt.downcast_ref::<MssqlConnectOptions>() {
21                let conn = MssqlConnection::establish(&opt.0).await?;
22                Ok(Box::new(conn) as Box<dyn Connection>)
23            } else {
24                Err(Error::from("downcast_ref failure"))
25            }
26        })
27    }
28
29    fn connect_opt<'a>(
30        &'a self,
31        opt: &'a dyn ConnectOptions,
32    ) -> BoxFuture<'a, Result<Box<dyn Connection>, Error>> {
33        let opt = opt.downcast_ref::<MssqlConnectOptions>().unwrap();
34        Box::pin(async move {
35            let conn = MssqlConnection::establish(&opt.0).await?;
36            Ok(Box::new(conn) as Box<dyn Connection>)
37        })
38    }
39
40    fn default_option(&self) -> Box<dyn ConnectOptions> {
41        let mut config = Config::new();
42        config.trust_cert();
43        Box::new(MssqlConnectOptions(config))
44    }
45}
46
47impl Placeholder for MssqlDriver {
48    fn exchange(&self, sql: &str) -> String {
49        impl_exchange("@P", 1, sql)
50    }
51}
52
53#[cfg(test)]
54mod test {
55    use crate::driver::MssqlDriver;
56    use rbdc::db::Placeholder;
57    #[test]
58    fn test_exchange() {
59        let v = "insert into biz_activity (id,name,pc_link,h5_link,pc_banner_img,h5_banner_img,sort,status,remark,create_time,version,delete_flag) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
60        let d = MssqlDriver {};
61        let sql = d.exchange(v);
62        assert_eq!("insert into biz_activity (id,name,pc_link,h5_link,pc_banner_img,h5_banner_img,sort,status,remark,create_time,version,delete_flag) VALUES (@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8,@P9,@P10,@P11,@P12)", sql);
63    }
64    // #[tokio::test]
65    // async fn test_mssql_pool() {
66    //     use rbdc::pool::Pool;
67    //     use rbdc_pool_fast::FastPool;
68    //     let task = async move {
69    //         //jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
70    //         let uri =
71    //             "jdbc:sqlserver://localhost:1433;User=SA;Password={TestPass!123456};Database=master;";
72    //         // let pool = Pool::new_url(MssqlDriver {}, "jdbc:sqlserver://SA:TestPass!123456@localhost:1433;database=test").unwrap();
73    //         let pool = FastPool::new(ConnManager::new(MssqlDriver {}, uri).unwrap()).unwrap();
74    //         let mut conn = pool.get().await.unwrap();
75    //         let data = conn
76    //             .get_values("SELECT 1", vec![])
77    //             .await
78    //             .unwrap();
79    //         for mut x in data {
80    //             println!("row: {}", x);
81    //         }
82    //     };
83    //     task.await;
84    // }
85}