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 }