-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql_where_model.rs
More file actions
88 lines (71 loc) · 2.41 KB
/
Copy pathsql_where_model.rs
File metadata and controls
88 lines (71 loc) · 2.41 KB
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
use crate::{
sql::{SqlData, SqlValues},
ColumnName, SqlValueMetadata, SqlWhereValueProvider,
};
pub enum WhereRawData<'s> {
Content(&'static str),
PlaceHolder(&'s dyn SqlWhereValueProvider),
}
pub enum WhereFieldData<'s> {
Data {
column_name: ColumnName,
op: Option<&'static str>,
ignore_if_none: bool,
value: Option<&'s dyn SqlWhereValueProvider>,
meta_data: Option<SqlValueMetadata>,
},
Raw(Vec<WhereRawData<'s>>),
}
pub trait SqlWhereModel {
fn fill_where_component(&self, sql: &mut String, params: &mut SqlValues);
fn get_limit(&self) -> Option<usize>;
fn get_offset(&self) -> Option<usize>;
fn has_conditions(&self) -> bool;
fn fill_limit_and_offset(&self, sql: &mut String) {
if let Some(limit) = self.get_limit() {
sql.push_str(" LIMIT ");
sql.push_str(limit.to_string().as_str());
}
if let Some(offset) = self.get_offset() {
sql.push_str(" OFFSET ");
sql.push_str(offset.to_string().as_str());
}
}
fn build_delete_sql(&self, table_name: &str) -> SqlData {
let mut sql = String::new();
sql.push_str("DELETE FROM ");
sql.push_str(table_name);
let mut params = SqlValues::new();
if self.has_conditions() {
sql.push_str(" WHERE ");
}
self.fill_where_component(&mut sql, &mut params);
self.fill_limit_and_offset(&mut sql);
SqlData::new(sql, params)
}
fn build_bulk_delete_sql(where_models: &[impl SqlWhereModel], table_name: &str) -> SqlData {
if where_models.len() == 1 {
let where_model = where_models.get(0).unwrap();
return where_model.build_delete_sql(table_name);
}
let mut sql = String::new();
sql.push_str("DELETE FROM ");
sql.push_str(table_name);
sql.push_str(" WHERE ");
let mut params = SqlValues::new();
let mut no = 0;
for where_model in where_models {
if where_model.has_conditions() {
if no > 0 {
sql.push_str(" OR ");
}
sql.push('(');
where_model.fill_where_component(&mut sql, &mut params);
sql.push(')');
where_model.fill_limit_and_offset(&mut sql);
no += 1;
}
}
SqlData::new(sql, params)
}
}