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