Skip to content

Commit 160b7bd

Browse files
committed
issues-179 Add backend generators
1 parent 842e6d3 commit 160b7bd

File tree

12 files changed

+245
-21
lines changed

12 files changed

+245
-21
lines changed

src/backend/mysql/view.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
use crate::*;
22

3-
impl ViewBuilder for MysqlQueryBuilder {}
3+
impl ViewBuilder for MysqlQueryBuilder {
4+
fn prepare_view_rename_statement(&self, rename: &ViewRenameStatement, sql: &mut SqlWriter) {
5+
write!(sql, "RENAME TABLE ").unwrap();
6+
if let Some(from_name) = &rename.from_name {
7+
from_name.prepare(sql, self.quote());
8+
}
9+
write!(sql, " TO ").unwrap();
10+
if let Some(to_name) = &rename.to_name {
11+
to_name.prepare(sql, self.quote());
12+
}
13+
}
14+
}

src/backend/postgres/view.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
11
use crate::*;
22

3-
impl ViewBuilder for PostgresQueryBuilder {}
3+
impl ViewBuilder for PostgresQueryBuilder {
4+
fn prepare_view_create_befor_view(&self, create: &ViewCreateStatement, sql: &mut SqlWriter) {
5+
if create.or_replace {
6+
write!(sql, " OR REPLACE").unwrap();
7+
}
8+
9+
if create.temporary {
10+
write!(sql, " TEMPORARY").unwrap();
11+
}
12+
13+
if create.recursive {
14+
write!(sql, " RECURSIVE").unwrap();
15+
}
16+
}
17+
18+
fn prepare_view_rename_statement(&self, rename: &ViewRenameStatement, sql: &mut SqlWriter) {
19+
write!(sql, "ALTER VIEW ").unwrap();
20+
if let Some(from_name) = &rename.from_name {
21+
from_name.prepare(sql, self.quote());
22+
}
23+
write!(sql, " TO ").unwrap();
24+
if let Some(to_name) = &rename.to_name {
25+
to_name.prepare(sql, self.quote());
26+
}
27+
}
28+
}

src/backend/sqlite/table.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,18 @@ impl TableBuilder for SqliteQueryBuilder {
130130
.unwrap()
131131
}
132132

133+
/// Translate [`TableDropStatement`] into SQL statement.
134+
fn prepare_table_drop_statement(&self, drop: &TableDropStatement, sql: &mut SqlWriter) {
135+
write!(sql, "DROP TABLE ").unwrap();
136+
137+
if drop.if_exists {
138+
write!(sql, "IF EXISTS ").unwrap();
139+
}
140+
141+
// SQLite does not support drop many tables
142+
TableBuilder::prepare_table_ref(self, &drop.tables[0], sql);
143+
}
144+
133145
fn prepare_table_drop_opt(&self, _drop_opt: &TableDropOpt, _sql: &mut dyn std::fmt::Write) {
134146
// SQLite does not support table drop options
135147
}

src/backend/sqlite/view.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,37 @@
11
use crate::*;
22

33
impl ViewBuilder for SqliteQueryBuilder {
4-
fn prepare_view_rename_statement(&self, rename: &ViewRenameStatement, sql: &mut SqlWriter) {}
4+
fn prepare_view_create_befor_view(&self, create: &ViewCreateStatement, sql: &mut SqlWriter) {
5+
if create.temporary {
6+
write!(sql, " TEMPORARY").unwrap();
7+
}
8+
}
9+
10+
fn prepare_view_create_after_view(&self, create: &ViewCreateStatement, sql: &mut SqlWriter) {
11+
if create.if_not_exists {
12+
write!(sql, " IF NOT EXISTS").unwrap();
13+
}
14+
}
15+
16+
fn prepare_view_create_opt_update(&self, _opt: &ViewCreateOpt, _sql: &mut SqlWriter) {
17+
// SQLite does not support view create options
18+
}
19+
20+
fn prepare_view_rename_statement(&self, _rename: &ViewRenameStatement, _sql: &mut SqlWriter) {
21+
// SQLite does not support rename view
22+
}
23+
24+
/// Translate [`ViewDropStatement`] into SQL statement.
25+
fn prepare_view_drop_statement(&self, drop: &ViewDropStatement, sql: &mut SqlWriter) {
26+
write!(sql, "DROP VIEW ").unwrap();
27+
28+
if drop.if_exists {
29+
write!(sql, "IF EXISTS ").unwrap();
30+
}
31+
self.prepare_view_ref(&drop.views[0], sql);
32+
}
33+
34+
fn prepare_view_drop_opt(&self, _drop_opt: &ViewDropOpt, _sql: &mut dyn std::fmt::Write) {
35+
// SQLite does not support view drop options
36+
}
537
}

src/backend/view_builder.rs

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,108 @@
11
use crate::*;
22

33
pub trait ViewBuilder: QueryBuilder + QuotedBuilder {
4-
fn prepare_view_create_statement(&self, create: &ViewCreateStatement, sql: &mut SqlWriter) {}
4+
/// Translate [`ViewCreateStatement`] into SQL statement.
5+
fn prepare_view_create_statement(&self, create: &ViewCreateStatement, sql: &mut SqlWriter) {
6+
write!(sql, "CREATE").unwrap();
7+
self.prepare_view_create_befor_view(create, sql);
58

6-
fn prepare_view_drop_statement(&self, drop: &ViewDropStatement, sql: &mut SqlWriter) {}
9+
write!(sql, " VIEW ").unwrap();
10+
self.prepare_view_create_after_view(create, sql);
711

8-
fn prepare_view_rename_statement(&self, rename: &ViewRenameStatement, sql: &mut SqlWriter) {}
12+
if let Some(view_ref) = &create.view {
13+
self.prepare_view_ref(view_ref, sql);
14+
}
15+
16+
if !create.columns.is_empty() {
17+
write!(sql, " ( ").unwrap();
18+
create.columns.iter().fold(true, |first, column| {
19+
if !first {
20+
write!(sql, ", ").unwrap();
21+
}
22+
column.prepare(sql, self.quote());
23+
false
24+
});
25+
write!(sql, " ) ").unwrap();
26+
}
27+
28+
write!(sql, " AS ").unwrap();
29+
// self.prepare_select_statement(create.query, sql);
30+
if let Some(opt) = &create.opt {
31+
self.prepare_view_create_opt_update(opt, sql);
32+
}
33+
}
34+
35+
fn prepare_view_create_befor_view(&self, _create: &ViewCreateStatement, _sql: &mut SqlWriter) {}
36+
37+
fn prepare_view_create_after_view(&self, _create: &ViewCreateStatement, _sql: &mut SqlWriter) {}
38+
39+
fn prepare_view_create_opt_update(&self, opt: &ViewCreateOpt, sql: &mut SqlWriter) {
40+
write!(sql, " WITH ").unwrap();
41+
match opt {
42+
ViewCreateOpt::Cascade => write!(sql, "CASCADED").unwrap(),
43+
ViewCreateOpt::Local => write!(sql, "LOCAL").unwrap(),
44+
}
45+
write!(sql, " CHECK OPTION").unwrap();
46+
}
47+
48+
fn prepare_view_rename_statement(&self, _rename: &ViewRenameStatement, _sql: &mut SqlWriter);
49+
50+
/// Translate [`ViewDropStatement`] into SQL statement.
51+
fn prepare_view_drop_statement(&self, drop: &ViewDropStatement, sql: &mut SqlWriter) {
52+
write!(sql, "DROP VIEW ").unwrap();
53+
54+
if drop.if_exists {
55+
write!(sql, "IF EXISTS ").unwrap();
56+
}
57+
58+
drop.views.iter().fold(true, |first, view| {
59+
if !first {
60+
write!(sql, ", ").unwrap();
61+
}
62+
self.prepare_view_ref(view, sql);
63+
false
64+
});
65+
66+
let mut view_drop_opt = String::new();
67+
for drop_opt in drop.options.iter() {
68+
write!(&mut view_drop_opt, " ").unwrap();
69+
self.prepare_view_drop_opt(drop_opt, &mut view_drop_opt);
70+
}
71+
write!(sql, "{}", view_drop_opt.trim_end()).unwrap();
72+
}
73+
74+
/// Translate [`ViewDropOpt`] into SQL statement.
75+
fn prepare_view_drop_opt(&self, drop_opt: &ViewDropOpt, sql: &mut dyn std::fmt::Write) {
76+
write!(
77+
sql,
78+
"{}",
79+
match drop_opt {
80+
ViewDropOpt::Restrict => "RESTRICT",
81+
ViewDropOpt::Cascade => "CASCADE",
82+
}
83+
)
84+
.unwrap();
85+
}
86+
87+
/// Translate [`TableRef`] into SQL statement.
88+
fn prepare_view_ref(&self, table_ref: &TableRef, sql: &mut SqlWriter) {
89+
match table_ref {
90+
TableRef::Table(table) => {
91+
table.prepare(sql, self.quote());
92+
}
93+
TableRef::SchemaTable(schema, table) => {
94+
schema.prepare(sql, self.quote());
95+
write!(sql, ".").unwrap();
96+
table.prepare(sql, self.quote());
97+
}
98+
TableRef::DatabaseSchemaTable(database, schema, table) => {
99+
database.prepare(sql, self.quote());
100+
write!(sql, ".").unwrap();
101+
schema.prepare(sql, self.quote());
102+
write!(sql, ".").unwrap();
103+
table.prepare(sql, self.quote());
104+
}
105+
_ => panic!("Not supported"),
106+
}
107+
}
9108
}

src/query/delete.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
types::*,
66
value::*,
77
Query, QueryStatementBuilder, QueryStatementWriter, SelectExpr, SelectStatement,
8-
SubQueryStatement, WithClause, WithQuery,
8+
SubQueryBuilder, SubQueryStatement, WithClause, WithQuery,
99
};
1010

1111
/// Delete existing rows from the table
@@ -227,7 +227,9 @@ impl QueryStatementBuilder for DeleteStatement {
227227
) {
228228
query_builder.prepare_delete_statement(self, sql, collector);
229229
}
230+
}
230231

232+
impl SubQueryBuilder for DeleteStatement {
231233
fn into_sub_query_statement(self) -> SubQueryStatement {
232234
SubQueryStatement::DeleteStatement(self)
233235
}

src/query/insert.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{
22
backend::QueryBuilder, error::*, prepare::*, types::*, value::*, Expr, OnConflict, Query,
33
QueryStatementBuilder, QueryStatementWriter, SelectExpr, SelectStatement, SimpleExpr,
4-
SubQueryStatement, WithClause, WithQuery,
4+
SubQueryBuilder, SubQueryStatement, WithClause, WithQuery,
55
};
66

77
/// Represents a value source that can be used in an insert query.
@@ -438,7 +438,9 @@ impl QueryStatementBuilder for InsertStatement {
438438
) {
439439
query_builder.prepare_insert_statement(self, sql, collector);
440440
}
441+
}
441442

443+
impl SubQueryBuilder for InsertStatement {
442444
fn into_sub_query_statement(self) -> SubQueryStatement {
443445
SubQueryStatement::InsertStatement(self)
444446
}

src/query/select.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use crate::{
55
query::{condition::*, OrderedStatement},
66
types::*,
77
value::*,
8-
QueryStatementBuilder, QueryStatementWriter, SubQueryStatement, WindowStatement, WithClause,
9-
WithQuery,
8+
QueryStatementBuilder, QueryStatementWriter, SubQueryBuilder, SubQueryStatement,
9+
WindowStatement, WithClause, WithQuery,
1010
};
1111

1212
/// Select rows from an existing table
@@ -2121,7 +2121,9 @@ impl QueryStatementBuilder for SelectStatement {
21212121
) {
21222122
query_builder.prepare_select_statement(self, sql, collector);
21232123
}
2124+
}
21242125

2126+
impl SubQueryBuilder for SelectStatement {
21252127
fn into_sub_query_statement(self) -> SubQueryStatement {
21262128
SubQueryStatement::SelectStatement(self)
21272129
}

src/query/traits.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ pub trait QueryStatementBuilder: Debug {
3333
sql: &mut SqlWriter,
3434
collector: &mut dyn FnMut(Value),
3535
);
36+
}
3637

38+
pub trait SubQueryBuilder: Debug {
3739
fn into_sub_query_statement(self) -> SubQueryStatement;
3840
}
3941

src/query/update.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
types::*,
77
value::*,
88
Query, QueryStatementBuilder, QueryStatementWriter, SelectExpr, SelectStatement,
9-
SubQueryStatement, WithClause, WithQuery,
9+
SubQueryBuilder, SubQueryStatement, WithClause, WithQuery,
1010
};
1111

1212
/// Update existing rows in the table
@@ -356,7 +356,9 @@ impl QueryStatementBuilder for UpdateStatement {
356356
) {
357357
query_builder.prepare_update_statement(self, sql, collector);
358358
}
359+
}
359360

361+
impl SubQueryBuilder for UpdateStatement {
360362
fn into_sub_query_statement(self) -> SubQueryStatement {
361363
SubQueryStatement::UpdateStatement(self)
362364
}

src/query/with.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::SelectExpr;
77
use crate::SelectStatement;
88
use crate::SimpleExpr;
99
use crate::SqlWriter;
10+
use crate::SubQueryBuilder;
1011
use crate::SubQueryStatement;
1112
use crate::TableRef;
1213
use crate::Value;
@@ -110,7 +111,7 @@ impl CommonTableExpression {
110111
/// columns.
111112
pub fn query<Q>(&mut self, query: Q) -> &mut Self
112113
where
113-
Q: QueryStatementBuilder,
114+
Q: SubQueryBuilder,
114115
{
115116
self.query = Some(Box::new(query.into_sub_query_statement()));
116117
self
@@ -492,7 +493,7 @@ impl WithClause {
492493
/// execute the argument query with this WITH clause.
493494
pub fn query<T>(self, query: T) -> WithQuery
494495
where
495-
T: QueryStatementBuilder + 'static,
496+
T: SubQueryBuilder + 'static,
496497
{
497498
WithQuery::new().with_clause(self).query(query).to_owned()
498499
}
@@ -583,7 +584,7 @@ impl WithQuery {
583584
/// Set the query that you execute with the [WithClause].
584585
pub fn query<T>(&mut self, query: T) -> &mut Self
585586
where
586-
T: QueryStatementBuilder,
587+
T: SubQueryBuilder,
587588
{
588589
self.query = Some(Box::new(query.into_sub_query_statement()));
589590
self
@@ -599,7 +600,9 @@ impl QueryStatementBuilder for WithQuery {
599600
) {
600601
query_builder.prepare_with_query(self, sql, collector);
601602
}
603+
}
602604

605+
impl SubQueryBuilder for WithQuery {
603606
fn into_sub_query_statement(self) -> SubQueryStatement {
604607
SubQueryStatement::WithStatement(self)
605608
}

0 commit comments

Comments
 (0)