Skip to main content

rbdc_sqlite/
driver.rs

1use crate::SqliteConnectOptions;
2use futures_core::future::BoxFuture;
3use rbdc::db::{ConnectOptions, Connection, Driver, Placeholder};
4use rbdc::Error;
5
6#[derive(Debug)]
7pub struct SqliteDriver {}
8
9impl Driver for SqliteDriver {
10    fn name(&self) -> &str {
11        "sqlite"
12    }
13
14    fn connect(&self, url: &str) -> BoxFuture<'_, Result<Box<dyn Connection>, Error>> {
15        let url = url.to_owned();
16        Box::pin(async move {
17            let mut opt = self.default_option();
18            opt.set_uri(&url)?;
19            if let Some(opt) = opt.downcast_ref::<SqliteConnectOptions>() {
20                let conn = opt.connect().await?;
21                Ok(Box::new(conn) as Box<dyn Connection>)
22            } else {
23                Err(Error::from("downcast_ref failure"))
24            }
25        })
26    }
27
28    fn connect_opt<'a>(
29        &'a self,
30        opt: &'a dyn ConnectOptions,
31    ) -> BoxFuture<'a, Result<Box<dyn Connection>, Error>> {
32        let opt: &SqliteConnectOptions = opt.downcast_ref().expect(
33            "SqliteDriver::connect_opt requires SqliteConnectOptions, got a different ConnectOptions type",
34        );
35        Box::pin(async move {
36            let conn = opt.connect().await?;
37            Ok(Box::new(conn) as Box<dyn Connection>)
38        })
39    }
40
41    fn default_option(&self) -> Box<dyn ConnectOptions> {
42        Box::new(SqliteConnectOptions::default())
43    }
44}
45
46impl Placeholder for SqliteDriver {
47    fn exchange(&self, sql: &str) -> String {
48        sql.to_string()
49    }
50}
51
52#[cfg(test)]
53mod test {
54    #[test]
55    fn test_default() {}
56}
57// #[cfg(test)]
58// mod test {
59//     use crate::driver::SqliteDriver;
60//     use crate::SqliteConnectOptions;
61//     use rbdc::block_on;
62//     use rbdc::db::{ConnectOptions, Driver};
63//     use rbdc::decimal::Decimal;
64//     use rbdc::pool::Pool;
65//     use rbs::Value;
66//     use std::fs::File;
67//
68//     #[test]
69//     fn test_sqlite_pool() {
70//         let f = File::create("../target/test.db");
71//         if f.is_err() {
72//             println!("{}", f.err().unwrap());
73//         } else {
74//             drop(f);
75//         }
76//         let f = async move {
77//             let pool = Pool::new_url(SqliteDriver {}, "sqlite://../target/test.db").unwrap();
78//             let mut conn = pool.get().await.unwrap();
79//             conn.exec(
80//                 "CREATE TABLE `biz_activity`
81// (
82//     `id`            TEXT PRIMARY KEY NOT NULL,
83//     `name`          TEXT     DEFAULT NULL,
84//     `pc_link`       TEXT     DEFAULT NULL,
85//     `h5_link`       TEXT     DEFAULT NULL,
86//     `sort`          TEXT     DEFAULT NULL,
87//     `status`        INT      DEFAULT NULL,
88//     `version`       INT      DEFAULT NULL,
89//     `remark`        TEXT     DEFAULT NULL,
90//     `create_time`   datetime DEFAULT NULL,
91//     `delete_flag`   INT(1)   DEFAULT NULL,
92//     `pc_banner_img` TEXT     DEFAULT NULL,
93//     `h5_banner_img` TEXT     DEFAULT NULL
94// );
95//
96// INSERT INTO `biz_activity`
97// VALUES ('1', '活动1', NULL, NULL, '1', 1, 1, 'fff', '2019-12-12 00:00:00', 0, NULL, NULL),
98//        ('178', 'test_insret', '', '', '1', 1, 0, '', '2020-06-17 20:08:13', 0, NULL, NULL),
99//        ('221', 'test', '', '', '0', 0, 0, '', '2020-06-17 20:10:23', 0, NULL, NULL),
100//        ('222', 'test', '', '', '0', 0, 0, '', '2020-06-17 20:10:23', 0, NULL, NULL),
101//        ('223', 'test', '', '', '0', 0, 0, '', '2020-06-17 20:10:23', 0, NULL, NULL);",
102//                 vec![],
103//             )
104//             .await;
105//
106//             let data = conn
107//                 .exec_decode("select * from biz_activity", vec![])
108//                 .await
109//                 .unwrap();
110//             for mut x in data {
111//                 println!("row: {}", x);
112//             }
113//         };
114//         block_on!(f);
115//     }
116//
117//     #[test]
118//     fn test_sqlite_param() {
119//         let task = async move {
120//             let mut d = SqliteDriver {};
121//             let mut c = d.connect("sqlite://../target/test.db").await.unwrap();
122//             let param = vec![
123//                 Decimal("1".to_string()).into(),
124//                 Value::String("1".to_string()),
125//             ];
126//             println!("param => {}", Value::Array(param.clone()));
127//             let data = c
128//                 .exec("update biz_activity set version = ? where id  = ?", param)
129//                 .await
130//                 .unwrap();
131//             println!("{}", data);
132//         };
133//         block_on!(task);
134//     }
135// }