Skip to content

Commit 0887ee4

Browse files
billy1624tyt2y3
authored andcommitted
Dynamically select backend
1 parent 1903155 commit 0887ee4

21 files changed

+187
-3
lines changed

LICENSE-APACHE

100755100644
File mode changed.

LICENSE-MIT

100755100644
File mode changed.

src/backend/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ pub use mysql::*;
1616
pub use sqlite::*;
1717
pub use postgres::*;
1818

19+
pub trait GenericBuilder: QueryBuilder + TableBuilder + IndexBuilder + ForeignKeyBuilder {
20+
fn query_builder(&self) -> Box<dyn QueryBuilder>;
21+
fn table_builder(&self) -> Box<dyn TableBuilder>;
22+
fn index_builder(&self) -> Box<dyn IndexBuilder>;
23+
fn foreign_key_builder(&self) -> Box<dyn ForeignKeyBuilder>;
24+
}
25+
1926
pub trait QueryBuilder {
2027
/// Translate [`InsertStatement`] into database specific SQL statement.
2128
fn prepare_insert_statement(&mut self, insert: &InsertStatement, sql: &mut dyn FmtWrite, collector: &mut dyn FnMut(Value));

src/backend/mysql/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,22 @@ impl MysqlQueryBuilder {
1818
pub fn new() -> Self {
1919
Self
2020
}
21+
}
22+
23+
impl GenericBuilder for MysqlQueryBuilder {
24+
fn query_builder(&self) -> Box<dyn QueryBuilder> {
25+
Box::new(MysqlQueryBuilder)
26+
}
27+
28+
fn table_builder(&self) -> Box<dyn TableBuilder> {
29+
Box::new(MysqlQueryBuilder)
30+
}
31+
32+
fn index_builder(&self) -> Box<dyn IndexBuilder> {
33+
Box::new(MysqlQueryBuilder)
34+
}
35+
36+
fn foreign_key_builder(&self) -> Box<dyn ForeignKeyBuilder> {
37+
Box::new(MysqlQueryBuilder)
38+
}
2139
}

src/backend/mysql/table.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ impl TableBuilder for MysqlQueryBuilder {
5858
ColumnType::Char(length) => format!("char({})", length),
5959
ColumnType::CharDefault => "char".into(),
6060
ColumnType::String(length) => format!("varchar({})", length),
61-
ColumnType::StringDefault => "varchar".into(),
61+
ColumnType::StringDefault => "varchar(255)".into(),
6262
ColumnType::Text => "text".into(),
6363
ColumnType::TinyInteger(length) => format!("tinyint({})", length),
6464
ColumnType::TinyIntegerDefault => "tinyint".into(),

src/backend/postgres/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,22 @@ impl PostgresQueryBuilder {
1818
pub fn new() -> Self {
1919
Self
2020
}
21+
}
22+
23+
impl GenericBuilder for PostgresQueryBuilder {
24+
fn query_builder(&self) -> Box<dyn QueryBuilder> {
25+
Box::new(PostgresQueryBuilder)
26+
}
27+
28+
fn table_builder(&self) -> Box<dyn TableBuilder> {
29+
Box::new(PostgresQueryBuilder)
30+
}
31+
32+
fn index_builder(&self) -> Box<dyn IndexBuilder> {
33+
Box::new(PostgresQueryBuilder)
34+
}
35+
36+
fn foreign_key_builder(&self) -> Box<dyn ForeignKeyBuilder> {
37+
Box::new(PostgresQueryBuilder)
38+
}
2139
}

src/backend/sqlite/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,22 @@ impl SqliteQueryBuilder {
1818
pub fn new() -> Self {
1919
Self
2020
}
21+
}
22+
23+
impl GenericBuilder for SqliteQueryBuilder {
24+
fn query_builder(&self) -> Box<dyn QueryBuilder> {
25+
Box::new(SqliteQueryBuilder)
26+
}
27+
28+
fn table_builder(&self) -> Box<dyn TableBuilder> {
29+
Box::new(SqliteQueryBuilder)
30+
}
31+
32+
fn index_builder(&self) -> Box<dyn IndexBuilder> {
33+
Box::new(SqliteQueryBuilder)
34+
}
35+
36+
fn foreign_key_builder(&self) -> Box<dyn ForeignKeyBuilder> {
37+
Box::new(SqliteQueryBuilder)
38+
}
2139
}

src/foreign_key/create.rs

+7
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ impl ForeignKeyCreateStatement {
9494
sql
9595
}
9696

97+
/// Build corresponding SQL statement for certain database backend and return SQL string
98+
pub fn build_any(&self, mut foreign_key_builder: Box<dyn ForeignKeyBuilder>) -> String {
99+
let mut sql = String::new();
100+
foreign_key_builder.prepare_foreign_key_create_statement(self, &mut sql);
101+
sql
102+
}
103+
97104
/// Build corresponding SQL statement for certain database backend and return SQL string
98105
pub fn to_string<T: ForeignKeyBuilder>(&self, foreign_key_builder: T) -> String {
99106
self.build(foreign_key_builder)

src/foreign_key/drop.rs

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ impl ForeignKeyDropStatement {
6464
sql
6565
}
6666

67+
/// Build corresponding SQL statement for certain database backend and return SQL string
68+
pub fn build_any(&self, mut foreign_key_builder: Box<dyn ForeignKeyBuilder>) -> String {
69+
let mut sql = String::new();
70+
foreign_key_builder.prepare_foreign_key_drop_statement(self, &mut sql);
71+
sql
72+
}
73+
6774
/// Build corresponding SQL statement for certain database backend and return SQL string
6875
pub fn to_string<T: ForeignKeyBuilder>(&self, foreign_key_builder: T) -> String {
6976
self.build(foreign_key_builder)

src/index/create.rs

+7
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ impl IndexCreateStatement {
7575
sql
7676
}
7777

78+
/// Build corresponding SQL statement for certain database backend and return SQL string
79+
pub fn build_any(&self, mut index_builder: Box<dyn IndexBuilder>) -> String {
80+
let mut sql = String::new();
81+
index_builder.prepare_index_create_statement(self, &mut sql);
82+
sql
83+
}
84+
7885
/// Build corresponding SQL statement for certain database backend and return SQL string
7986
pub fn to_string<T: IndexBuilder>(&self, index_builder: T) -> String {
8087
self.build(index_builder)

src/index/drop.rs

+7
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ impl IndexDropStatement {
6767
sql
6868
}
6969

70+
/// Build corresponding SQL statement for certain database backend and return SQL string
71+
pub fn build_any(&self, mut index_builder: Box<dyn IndexBuilder>) -> String {
72+
let mut sql = String::new();
73+
index_builder.prepare_index_drop_statement(self, &mut sql);
74+
sql
75+
}
76+
7077
/// Build corresponding SQL statement for certain database backend and return SQL string
7178
pub fn to_string<T: IndexBuilder>(&self, index_builder: T) -> String {
7279
self.build(index_builder)

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@
238238
//! r#"CREATE TABLE IF NOT EXISTS `character` ("#,
239239
//! r#"`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,"#,
240240
//! r#"`font_size` int NOT NULL,"#,
241-
//! r#"`character` varchar NOT NULL,"#,
241+
//! r#"`character` varchar(255) NOT NULL,"#,
242242
//! r#"`size_w` int NOT NULL,"#,
243243
//! r#"`size_h` int NOT NULL,"#,
244244
//! r#"`font_id` int DEFAULT NULL,"#,

src/query/delete.rs

+15
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,13 @@ impl DeleteStatement {
309309
sql
310310
}
311311

312+
/// Build corresponding SQL statement for certain database backend and collect query parameters
313+
pub fn build_collect_any(&self, mut query_builder: Box<dyn QueryBuilder>, collector: &mut dyn FnMut(Value)) -> String {
314+
let mut sql = String::new();
315+
query_builder.prepare_delete_statement(self, &mut sql, collector);
316+
sql
317+
}
318+
312319
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
313320
///
314321
/// # Examples
@@ -339,6 +346,14 @@ impl DeleteStatement {
339346
(sql, params)
340347
}
341348

349+
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
350+
pub fn build_any(&self, query_builder: Box<dyn QueryBuilder>) -> (String, Vec<Value>) {
351+
let mut params = Vec::new();
352+
let mut collector = |v| params.push(v);
353+
let sql = self.build_collect_any(query_builder, &mut collector);
354+
(sql, params)
355+
}
356+
342357
/// Build corresponding SQL statement for certain database backend and return SQL string
343358
///
344359
/// # Examples

src/query/insert.rs

+15
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,13 @@ impl InsertStatement {
260260
sql
261261
}
262262

263+
/// Build corresponding SQL statement for certain database backend and collect query parameters
264+
pub fn build_collect_any(&self, mut query_builder: Box<dyn QueryBuilder>, collector: &mut dyn FnMut(Value)) -> String {
265+
let mut sql = String::new();
266+
query_builder.prepare_insert_statement(self, &mut sql, collector);
267+
sql
268+
}
269+
263270
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
264271
///
265272
/// # Examples
@@ -298,6 +305,14 @@ impl InsertStatement {
298305
(sql, params)
299306
}
300307

308+
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
309+
pub fn build_any(&self, query_builder: Box<dyn QueryBuilder>) -> (String, Vec<Value>) {
310+
let mut params = Vec::new();
311+
let mut collector = |v| params.push(v);
312+
let sql = self.build_collect_any(query_builder, &mut collector);
313+
(sql, params)
314+
}
315+
301316
/// Build corresponding SQL statement for certain database backend and return SQL string
302317
///
303318
/// # Examples

src/query/select.rs

+15
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,13 @@ impl SelectStatement {
12581258
sql
12591259
}
12601260

1261+
/// Build corresponding SQL statement for certain database backend and collect query parameters
1262+
pub fn build_collect_any(&self, mut query_builder: Box<dyn QueryBuilder>, collector: &mut dyn FnMut(Value)) -> String {
1263+
let mut sql = String::new();
1264+
query_builder.prepare_select_statement(self, &mut sql, collector);
1265+
sql
1266+
}
1267+
12611268
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
12621269
///
12631270
/// # Examples
@@ -1289,6 +1296,14 @@ impl SelectStatement {
12891296
(sql, params)
12901297
}
12911298

1299+
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
1300+
pub fn build_any(&self, query_builder: Box<dyn QueryBuilder>) -> (String, Vec<Value>) {
1301+
let mut params = Vec::new();
1302+
let mut collector = |v| params.push(v);
1303+
let sql = self.build_collect_any(query_builder, &mut collector);
1304+
(sql, params)
1305+
}
1306+
12921307
/// Build corresponding SQL statement for certain database backend and return SQL string
12931308
///
12941309
/// # Examples

src/query/update.rs

+15
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,13 @@ impl UpdateStatement {
441441
sql
442442
}
443443

444+
/// Build corresponding SQL statement for certain database backend and collect query parameters
445+
pub fn build_collect_any(&self, mut query_builder: Box<dyn QueryBuilder>, collector: &mut dyn FnMut(Value)) -> String {
446+
let mut sql = String::new();
447+
query_builder.prepare_update_statement(self, &mut sql, collector);
448+
sql
449+
}
450+
444451
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
445452
///
446453
/// # Examples
@@ -477,6 +484,14 @@ impl UpdateStatement {
477484
(sql, params)
478485
}
479486

487+
/// Build corresponding SQL statement for certain database backend and collect query parameters into a vector
488+
pub fn build_any(&self, query_builder: Box<dyn QueryBuilder>) -> (String, Vec<Value>) {
489+
let mut params = Vec::new();
490+
let mut collector = |v| params.push(v);
491+
let sql = self.build_collect_any(query_builder, &mut collector);
492+
(sql, params)
493+
}
494+
480495
/// Build corresponding SQL statement for certain database backend and return SQL string
481496
///
482497
/// # Examples

src/table/alter.rs

+7
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,13 @@ impl TableAlterStatement {
199199
sql
200200
}
201201

202+
/// Build corresponding SQL statement for certain database backend and return SQL string
203+
pub fn build_any(&self, mut table_builder: Box<dyn TableBuilder>) -> String {
204+
let mut sql = String::new();
205+
table_builder.prepare_table_alter_statement(self, &mut sql);
206+
sql
207+
}
208+
202209
/// Build corresponding SQL statement for certain database backend and return SQL string
203210
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
204211
self.build(table_builder)

src/table/create.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use crate::{ColumnDef, backend::TableBuilder, foreign_key::*, types::*};
3333
/// r#"CREATE TABLE IF NOT EXISTS `character` ("#,
3434
/// r#"`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,"#,
3535
/// r#"`font_size` int NOT NULL,"#,
36-
/// r#"`character` varchar NOT NULL,"#,
36+
/// r#"`character` varchar(255) NOT NULL,"#,
3737
/// r#"`size_w` int NOT NULL,"#,
3838
/// r#"`size_h` int NOT NULL,"#,
3939
/// r#"`font_id` int DEFAULT NULL,"#,
@@ -182,6 +182,13 @@ impl TableCreateStatement {
182182
sql
183183
}
184184

185+
/// Build corresponding SQL statement for certain database backend and return SQL string
186+
pub fn build_any(&self, mut table_builder: Box<dyn TableBuilder>) -> String {
187+
let mut sql = String::new();
188+
table_builder.prepare_table_create_statement(self, &mut sql);
189+
sql
190+
}
191+
185192
/// Build corresponding SQL statement for certain database backend and return SQL string
186193
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
187194
self.build(table_builder)

src/table/drop.rs

+7
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ impl TableDropStatement {
8888
sql
8989
}
9090

91+
/// Build corresponding SQL statement for certain database backend and return SQL string
92+
pub fn build_any(&self, mut table_builder: Box<dyn TableBuilder>) -> String {
93+
let mut sql = String::new();
94+
table_builder.prepare_table_drop_statement(self, &mut sql);
95+
sql
96+
}
97+
9198
/// Build corresponding SQL statement for certain database backend and return SQL string
9299
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
93100
self.build(table_builder)

src/table/rename.rs

+7
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ impl TableRenameStatement {
6161
sql
6262
}
6363

64+
/// Build corresponding SQL statement for certain database backend and return SQL string
65+
pub fn build_any(&self, mut table_builder: Box<dyn TableBuilder>) -> String {
66+
let mut sql = String::new();
67+
table_builder.prepare_table_rename_statement(self, &mut sql);
68+
sql
69+
}
70+
6471
/// Build corresponding SQL statement for certain database backend and return SQL string
6572
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
6673
self.build(table_builder)

src/table/truncate.rs

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ impl TableTruncateStatement {
5858
sql
5959
}
6060

61+
/// Build corresponding SQL statement for certain database backend and return SQL string
62+
pub fn build_any(&self, mut table_builder: Box<dyn TableBuilder>) -> String {
63+
let mut sql = String::new();
64+
table_builder.prepare_table_truncate_statement(self, &mut sql);
65+
sql
66+
}
67+
6168
/// Build corresponding SQL statement for certain database backend and return SQL string
6269
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
6370
self.build(table_builder)

0 commit comments

Comments
 (0)