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// }