Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issues-347 Add SqlWriter trait #436

Merged
merged 6 commits into from
Sep 18, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
issues-347 Fix all compile errors
  • Loading branch information
ikrivosheev committed Sep 13, 2022
commit bcd35c35320918c80a9861e081753d420f4f9968
2 changes: 1 addition & 1 deletion src/backend/index_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 52,7 @@ pub trait IndexBuilder: QuotedBuilder TableRefBuilder {
#[doc(hidden)]
/// Write the column index prefix.
fn prepare_index_columns(&self, columns: &[IndexColumn], sql: &mut dyn SqlWriter) {
write!(sql, " (").unwrap();
write!(sql, "(").unwrap();
columns.iter().fold(true, |first, col| {
if !first {
write!(sql, ", ").unwrap();
Expand Down
2 changes: 1 addition & 1 deletion src/backend/mysql/foreign_key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 45,7 @@ impl ForeignKeyBuilder for MysqlQueryBuilder {
}
write!(sql, " FOREIGN KEY ").unwrap();

write!(sql, " (").unwrap();
write!(sql, "(").unwrap();
create.foreign_key.columns.iter().fold(true, |first, col| {
if !first {
write!(sql, ", ").unwrap();
Expand Down
6 changes: 5 additions & 1 deletion src/backend/mysql/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 43,7 @@ impl QueryBuilder for MysqlQueryBuilder {
}

fn prepare_on_conflict_keywords(&self, sql: &mut dyn SqlWriter) {
write!(sql, " ON DUPLICATE KEY ").unwrap();
write!(sql, " ON DUPLICATE KEY").unwrap();
}

fn prepare_on_conflict_do_update_keywords(&self, sql: &mut dyn SqlWriter) {
Expand Down Expand Up @@ -75,4 75,8 @@ impl QueryBuilder for MysqlQueryBuilder {
fn values_list_tuple_prefix(&self) -> &str {
"ROW"
}

fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter) {
sql.push_param(value.clone(), self as _);
}
}
4 changes: 4 additions & 0 deletions src/backend/postgres/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 101,8 @@ impl QueryBuilder for PostgresQueryBuilder {
_ => {}
};
}

fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter) {
sql.push_param(value.clone(), self as _);
}
}
17 changes: 8 additions & 9 deletions src/backend/query_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 360,7 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
self.prepare_simple_expr(&r#else.into(), sql);
}

write!(sql, " END) ").unwrap();
write!(sql, " END)").unwrap();
}

/// Translate [`SelectDistinct`] into SQL statement.
Expand Down Expand Up @@ -435,7 435,6 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
write!(sql, " ").unwrap();
self.prepare_join_table_ref(join_expr, sql);
if let Some(on) = &join_expr.on {
write!(sql, " ").unwrap();
self.prepare_join_on(on, sql);
}
}
Expand Down Expand Up @@ -801,7 800,6 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
if !matches!(order_expr.order, Order::Field(_)) {
self.prepare_simple_expr(&order_expr.expr, sql);
}
write!(sql, " ").unwrap();
self.prepare_order(order_expr, sql);
}

Expand Down Expand Up @@ -832,7 830,7 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
write!(sql, "CASE ").unwrap();
let mut i = 0;
for value in &values.0 {
write!(sql, " WHEN ").unwrap();
write!(sql, "WHEN ").unwrap();
self.prepare_simple_expr(&order_expr.expr, sql);
write!(sql, "=").unwrap();
let value = self.value_to_string(value);
Expand All @@ -844,9 842,7 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
}

/// Write [`Value`] into SQL statement as parameter.
fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter) {
sql.push_param(value.clone(), &self);
}
fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter);

/// Write [`Value`] inline.
fn prepare_constant(&self, value: &Value, sql: &mut dyn SqlWriter) {
Expand All @@ -856,7 852,6 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {

/// Translate a `&[ValueTuple]` into a VALUES list.
fn prepare_values_list(&self, value_tuples: &[ValueTuple], sql: &mut dyn SqlWriter) {
let (placeholder, numbered) = self.placeholder();
write!(sql, "VALUES ").unwrap();
value_tuples.iter().fold(true, |first, value_tuple| {
if !first {
Expand All @@ -868,7 863,7 @@ pub trait QueryBuilder: QuotedBuilder EscapeBuilder TableRefBuilder {
if !first {
write!(sql, ", ").unwrap();
}
sql.push_param(value, &self);
self.prepare_value(&value, sql);
false
});

Expand Down Expand Up @@ -1400,6 1395,10 @@ impl QueryBuilder for CommonSqlQueryBuilder {
fn prepare_query_statement(&self, query: &SubQueryStatement, sql: &mut dyn SqlWriter) {
query.prepare_statement(self, sql);
}

fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter) {
sql.push_param(value.clone(), self as _);
}
}

impl QuotedBuilder for CommonSqlQueryBuilder {
Expand Down
4 changes: 4 additions & 0 deletions src/backend/sqlite/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 34,8 @@ impl QueryBuilder for SqliteQueryBuilder {
// SQLite doesn't support inserting multiple rows with default values
write!(sql, "DEFAULT VALUES").unwrap()
}

fn prepare_value(&self, value: &Value, sql: &mut dyn SqlWriter) {
sql.push_param(value.clone(), self as _);
}
}
16 changes: 11 additions & 5 deletions src/prepare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 6,17 @@ pub use std::fmt::Write;
pub trait SqlWriter: Write ToString {
fn push_param(&mut self, value: Value, query_builder: &dyn QueryBuilder);

fn as_writer(&mut self) -> &mut dyn Write {
&mut self as _
}
fn as_writer(&mut self) -> &mut dyn Write;
}

impl SqlWriter for String {
fn push_param(&mut self, value: Value, query_builder: &dyn QueryBuilder) {
self.push_str(&query_builder.value_to_string(&value))
}

fn as_writer(&mut self) -> &mut dyn Write {
self as _
}
}

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -60,12 62,16 @@ impl SqlWriter for SqlWriterValues {
self.counter = 1;
if self.numbered {
let counter = self.counter;
write!(self, "{}{}", self.placeholder, counter).unwrap();
write!(self.string, "{}{}", self.placeholder, counter).unwrap();
} else {
write!(self, "{}", self.placeholder).unwrap();
write!(self.string, "{}", self.placeholder).unwrap();
}
self.values.push(value)
}

fn as_writer(&mut self) -> &mut dyn Write {
self as _
}
}

pub fn inject_parameters<I>(sql: &str, params: I, query_builder: &dyn QueryBuilder) -> String
Expand Down
4 changes: 1 addition & 3 deletions src/query/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 118,7 @@ pub trait QueryStatementWriter: QueryStatementBuilder {
/// );
/// ```
fn build_collect<T: QueryBuilder>(&self, query_builder: T, sql: &mut dyn SqlWriter) -> String {
let (placeholder, numbered) = query_builder.placeholder();
let mut sql = SqlWriterValues::new(placeholder, numbered);
self.build_collect_into(query_builder, &mut sql);
self.build_collect_into(query_builder, sql);
sql.to_string()
}

Expand Down
2 changes: 1 addition & 1 deletion tests/postgres/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 6,7 @@ mod index;
mod interval;
mod query;
mod table;
mod types;
// mod types;

#[path = "../common.rs"]
mod common;
Expand Down