Skip to content

Commit 6b1aa0d

Browse files
committed
refactor(WIP-2)!: Querybuilder public interface
1 parent 1c0f25c commit 6b1aa0d

14 files changed

Lines changed: 126 additions & 86 deletions

File tree

canyon_core/src/connection/clients/mssql.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ use crate::mapper::RowMapper;
66
use crate::query::parameters::QueryParameter;
77
use crate::rows::{CanyonRows, FromSqlOwnedValue};
88
use bb8::PooledConnection;
9+
use bb8_tiberius::ConnectionManager as TiberiusConnectionManager;
910
use std::error::Error;
1011
use std::sync::Arc;
1112
use tiberius::Query;
12-
use bb8_tiberius::ConnectionManager as TiberiusConnectionManager;
1313

1414
type SqlServerConnectionPool = Arc<bb8::Pool<TiberiusConnectionManager>>;
1515

@@ -239,7 +239,9 @@ pub(crate) mod __impl {
239239
#[cfg(test)]
240240
mod tests {
241241
use super::__impl;
242-
use crate::connection::datasources::{Auth, DatasourceConfig, DatasourceProperties, SqlServerAuth};
242+
use crate::connection::datasources::{
243+
Auth, DatasourceConfig, DatasourceProperties, SqlServerAuth,
244+
};
243245
use tiberius::AuthMethod;
244246

245247
#[test]
@@ -284,4 +286,4 @@ mod tests {
284286
let config = __impl::sqlserver_config_from_datasource(&datasource).unwrap();
285287
assert_eq!(config.get_addr(), "localhost:1433");
286288
}
287-
}
289+
}

canyon_core/src/connection/clients/postgresql.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::mapper::RowMapper;
55
use crate::rows::FromSqlOwnedValue;
66
use crate::{query::parameters::QueryParameter, rows::CanyonRows};
77
use bb8::{Pool, PooledConnection};
8+
use bb8_postgres::PostgresConnectionManager;
89
use std::error::Error;
910
use std::sync::Arc;
10-
use bb8_postgres::PostgresConnectionManager;
1111
use tokio_postgres::types::ToSql;
1212
use tokio_postgres::{Config, NoTls};
1313

@@ -173,17 +173,17 @@ mod __impl {
173173
config: Config,
174174
) -> Result<Pool<PgManager>, Box<dyn Error + Send + Sync>> {
175175
let manager = PgManager::new(config, NoTls);
176-
let pool = bb8::Pool::builder()
177-
.max_size(10u32)
178-
.build(manager).await?;
176+
let pool = bb8::Pool::builder().max_size(10u32).build(manager).await?;
179177
Ok(pool)
180178
}
181179
}
182180

183181
#[cfg(test)]
184182
mod tests {
185183
use super::__impl;
186-
use crate::connection::datasources::{Auth, DatasourceConfig, DatasourceProperties, PostgresAuth};
184+
use crate::connection::datasources::{
185+
Auth, DatasourceConfig, DatasourceProperties, PostgresAuth,
186+
};
187187

188188
#[test]
189189
fn test_extract_postgres_auth_basic() {
@@ -215,15 +215,27 @@ mod tests {
215215

216216
let config = __impl::set_tokio_postgres_configs(&datasource, "pguser", "pgpass");
217217

218-
assert_eq!(config.get_hosts(), vec![tokio_postgres::config::Host::Tcp("localhost".into())]);
218+
assert_eq!(
219+
config.get_hosts(),
220+
vec![tokio_postgres::config::Host::Tcp("localhost".into())]
221+
);
219222
assert_eq!(config.get_dbname(), Some("pg_db"));
220223
assert_eq!(config.get_user(), Some("pguser"));
221224
assert_eq!(*config.get_ports().first().unwrap(), 5433);
222225

223226
// sanity check for configured timeouts and keepalives
224-
assert_eq!(config.get_connect_timeout(), Some(std::time::Duration::from_secs(5)).as_ref());
225-
assert_eq!(config.get_keepalives_idle(), std::time::Duration::from_secs(30));
226-
assert_eq!(config.get_keepalives_interval(), Some(std::time::Duration::from_secs(10)));
227+
assert_eq!(
228+
config.get_connect_timeout(),
229+
Some(std::time::Duration::from_secs(5)).as_ref()
230+
);
231+
assert_eq!(
232+
config.get_keepalives_idle(),
233+
std::time::Duration::from_secs(30)
234+
);
235+
assert_eq!(
236+
config.get_keepalives_interval(),
237+
Some(std::time::Duration::from_secs(10))
238+
);
227239
assert_eq!(config.get_keepalives_retries(), Some(3));
228240
}
229241

canyon_core/src/connection/datasources.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,14 @@ impl DatasourceConfig {
130130
}
131131

132132
pub fn get_port_or_default_by_db(&self) -> u16 {
133-
self.properties.port.unwrap_or(
134-
match self.get_db_type() {
135-
#[cfg(feature = "postgres")] DatabaseType::PostgreSql => 5432,
136-
#[cfg(feature = "mssql")] DatabaseType::SqlServer => 1433,
137-
#[cfg(feature = "mysql")] DatabaseType::MySQL => 3306,
138-
}
139-
)
133+
self.properties.port.unwrap_or(match self.get_db_type() {
134+
#[cfg(feature = "postgres")]
135+
DatabaseType::PostgreSql => 5432,
136+
#[cfg(feature = "mssql")]
137+
DatabaseType::SqlServer => 1433,
138+
#[cfg(feature = "mysql")]
139+
DatabaseType::MySQL => 3306,
140+
})
140141
}
141142
}
142143

canyon_core/src/query/operators.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use std::fmt::{Display, Formatter};
21
use crate::connection::database_type::DatabaseType;
2+
use std::fmt::{Display, Formatter};
33

44
pub trait Operator: Display {
55
fn as_str(&self, placeholder_counter: usize, datasource_type: &DatabaseType) -> String;
@@ -87,10 +87,14 @@ impl Operator for Like {
8787

8888
impl Display for Like {
8989
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
90-
write!(f, "{}", match *self {
91-
Like::Full => "Like::Full",
92-
Like::Left => "Like::Left",
93-
Like::Right => "Like::Right",
94-
})
90+
write!(
91+
f,
92+
"{}",
93+
match *self {
94+
Like::Full => "Like::Full",
95+
Like::Left => "Like::Left",
96+
Like::Right => "Like::Right",
97+
}
98+
)
9599
}
96-
}
100+
}

canyon_core/src/query/querybuilder/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ pub use self::{contracts::*, types::*};
66
pub struct TableMetadata<'a> {
77
pub schema: &'a str,
88
pub name: &'a str,
9-
}
9+
}

canyon_core/src/query/querybuilder/types/delete.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::connection::database_type::DatabaseType;
2-
use crate::query::query::Query;
3-
use std::error::Error;
42
use crate::query::bounds::{FieldIdentifier, FieldValueIdentifier};
53
use crate::query::operators::{Comp, Operator};
64
use crate::query::parameters::QueryParameter;
7-
use crate::query::querybuilder::{DeleteQueryBuilderOps, QueryBuilder, QueryBuilderOps, QueryKind};
5+
use crate::query::query::Query;
86
use crate::query::querybuilder::types::TableMetadata;
7+
use crate::query::querybuilder::{DeleteQueryBuilderOps, QueryBuilder, QueryBuilderOps, QueryKind};
8+
use std::error::Error;
99

1010
/// Contains the specific database operations associated with the
1111
/// *DELETE* SQL statements.
@@ -32,7 +32,6 @@ impl<'a> DeleteQueryBuilder<'a> {
3232
}
3333
}
3434

35-
3635
impl<'a> DeleteQueryBuilderOps<'a> for DeleteQueryBuilder<'a> {} // NOTE: for now, this is just a type formalism
3736

3837
impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
@@ -63,7 +62,7 @@ impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
6362
where
6463
Z: FieldIdentifier,
6564
Q: QueryParameter,
66-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
65+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
6766
{
6867
self._inner.and_values_in(and, values);
6968
self
@@ -74,7 +73,7 @@ impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
7473
where
7574
Z: FieldIdentifier,
7675
Q: QueryParameter,
77-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
76+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
7877
{
7978
self._inner.or_values_in(or, values);
8079
self

canyon_core/src/query/querybuilder/types/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl AsRef<str> for QueryKind {
2626
}
2727
}
2828

29-
#[derive(Default)]
29+
#[derive(Clone, Default)]
3030
pub struct TableMetadata<'a> {
3131
pub schema: Option<&'a str>,
3232
pub name: &'a str,

canyon_core/src/query/querybuilder/types/select.rs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,28 @@
1-
use crate::query::bounds::TableMetadata;
21
use crate::connection::database_type::DatabaseType;
3-
use crate::query::query::Query;
4-
use std::error::Error;
2+
use crate::query::bounds::TableMetadata;
53
use crate::query::bounds::{FieldIdentifier, FieldValueIdentifier};
64
use crate::query::operators::{Comp, Operator};
75
use crate::query::parameters::QueryParameter;
8-
use crate::query::querybuilder::{QueryBuilder, QueryBuilderOps, QueryKind, SelectQueryBuilderOps};
6+
use crate::query::query::Query;
97
use crate::query::querybuilder::types::TableMetadata as TableSchemaData;
8+
use crate::query::querybuilder::{QueryBuilder, QueryBuilderOps, QueryKind, SelectQueryBuilderOps};
9+
use std::error::Error;
1010

1111
pub struct SelectQueryBuilder<'a> {
1212
pub(crate) _inner: QueryBuilder<'a>,
13-
pub(crate) columns: &'a[&'a str]
13+
pub(crate) columns: &'a [String],
1414
}
1515

1616
impl<'a> SelectQueryBuilder<'a> {
1717
/// Generates a new public instance of the [`SelectQueryBuilder`]
1818
pub fn new(
1919
table_schema_data: TableSchemaData<'a>,
20-
columns: &'a [&str],
20+
columns: &'a [String],
2121
database_type: DatabaseType,
2222
) -> Result<Self, Box<dyn Error + Send + Sync + 'a>> {
2323
Ok(Self {
24-
_inner: QueryBuilder::new(
25-
table_schema_data,
26-
QueryKind::Select,
27-
database_type
28-
)?,
29-
columns
24+
_inner: QueryBuilder::new(table_schema_data, QueryKind::Select, database_type)?,
25+
columns,
3026
})
3127
}
3228

@@ -123,7 +119,7 @@ impl<'a> QueryBuilderOps<'a> for SelectQueryBuilder<'a> {
123119
where
124120
Z: FieldIdentifier,
125121
Q: QueryParameter,
126-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
122+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
127123
{
128124
self._inner.and_values_in(and, values);
129125
self
@@ -134,7 +130,7 @@ impl<'a> QueryBuilderOps<'a> for SelectQueryBuilder<'a> {
134130
where
135131
Z: FieldIdentifier,
136132
Q: QueryParameter,
137-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
133+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
138134
{
139135
self._inner.or_values_in(and, values);
140136
self
@@ -154,26 +150,32 @@ impl<'a> QueryBuilderOps<'a> for SelectQueryBuilder<'a> {
154150
}
155151

156152
mod __impl {
157-
use std::fmt::Write;
158-
use std::error::Error;
159153
use crate::query::querybuilder::SelectQueryBuilder;
154+
use std::error::Error;
155+
use std::fmt::Write;
160156

161157
/// Appends to the underlying SQL buffer all the columns passed in by the callee or simply pushes
162158
/// a wildcard * for the SELECT * FROM
163-
pub(crate) fn write_columns_or_select_all<'a>(mut _self: SelectQueryBuilder<'a>) -> Result<SelectQueryBuilder<'a>, Box<dyn Error + Send + Sync + 'a>> {
159+
pub(crate) fn write_columns_or_select_all<'a>(
160+
mut _self: SelectQueryBuilder<'a>,
161+
) -> Result<SelectQueryBuilder<'a>, Box<dyn Error + Send + Sync + 'a>> {
164162
if _self.columns.is_empty() {
165163
_self._inner.push_sql_char('*')?;
166164
} else {
167165
for (i, c) in _self.columns.iter().enumerate() {
168-
if i > 0 { _self._inner.push_sql(", ")?; }
166+
if i > 0 {
167+
_self._inner.push_sql(", ")?;
168+
}
169169
_self._inner.sql.push_str(c);
170170
}
171171
}
172172
Ok(_self)
173173
}
174174

175-
pub(crate) fn write_from_clause<'a>(mut _self: SelectQueryBuilder<'a>) -> Result<SelectQueryBuilder<'a>, Box<dyn Error + Send + Sync + 'a>> {
175+
pub(crate) fn write_from_clause<'a>(
176+
mut _self: SelectQueryBuilder<'a>,
177+
) -> Result<SelectQueryBuilder<'a>, Box<dyn Error + Send + Sync + 'a>> {
176178
write!(_self._inner.sql, "FROM {}", _self._inner.meta)?;
177179
Ok(_self)
178180
}
179-
}
181+
}

canyon_core/src/query/querybuilder/types/update.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::connection::database_type::DatabaseType;
2-
use crate::query::query::Query;
3-
use std::error::Error;
42
use crate::query::bounds::{FieldIdentifier, FieldValueIdentifier};
53
use crate::query::operators::{Comp, Operator};
64
use crate::query::parameters::QueryParameter;
7-
use crate::query::querybuilder::{QueryBuilder, QueryBuilderOps, QueryKind, UpdateQueryBuilderOps};
5+
use crate::query::query::Query;
86
use crate::query::querybuilder::types::TableMetadata;
7+
use crate::query::querybuilder::{QueryBuilder, QueryBuilderOps, QueryKind, UpdateQueryBuilderOps};
8+
use std::error::Error;
99

1010
/// Contains the specific database operations of the *UPDATE* SQL statements.
1111
pub struct UpdateQueryBuilder<'a> {
@@ -23,12 +23,11 @@ impl<'a> UpdateQueryBuilder<'a> {
2323
})
2424
}
2525

26-
pub fn build(self) -> Result<Query<'a>, Box<dyn Error + Send + Sync+ 'a>> {
26+
pub fn build(self) -> Result<Query<'a>, Box<dyn Error + Send + Sync + 'a>> {
2727
self._inner.build()
2828
}
2929
}
3030

31-
3231
impl<'a> UpdateQueryBuilderOps<'a> for UpdateQueryBuilder<'a> {
3332
/// Creates an SQL `SET` clause to specify the columns that must be updated in the sentence
3433
fn set<Z, Q>(mut self, columns: &'a [(Z, Q)]) -> Self
@@ -99,7 +98,7 @@ impl<'a> QueryBuilderOps<'a> for UpdateQueryBuilder<'a> {
9998
where
10099
Z: FieldIdentifier,
101100
Q: QueryParameter,
102-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
101+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
103102
{
104103
self._inner.and_values_in(and, values);
105104
self
@@ -110,7 +109,7 @@ impl<'a> QueryBuilderOps<'a> for UpdateQueryBuilder<'a> {
110109
where
111110
Z: FieldIdentifier,
112111
Q: QueryParameter,
113-
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>
112+
Vec<&'a (dyn QueryParameter + 'a)>: Extend<&'a Q>,
114113
{
115114
self._inner.or_values_in(or, values);
116115
self

0 commit comments

Comments
 (0)