#[macro_use]
mod query_id;
#[macro_use]
mod clause_macro;
mod ast_pass;
pub mod bind_collector;
mod debug_query;
mod delete_statement;
mod distinct_clause;
#[doc(hidden)]
pub mod functions;
mod group_by_clause;
mod insert_statement;
mod limit_clause;
pub(crate) mod locking_clause;
#[doc(hidden)]
pub mod nodes;
mod offset_clause;
mod order_clause;
mod returning_clause;
mod select_clause;
mod select_statement;
mod sql_query;
mod update_statement;
mod where_clause;
pub use self::ast_pass::AstPass;
pub use self::bind_collector::BindCollector;
pub use self::debug_query::DebugQuery;
pub use self::delete_statement::{BoxedDeleteStatement, DeleteStatement};
#[doc(inline)]
pub use self::insert_statement::{
IncompleteInsertStatement, InsertStatement, UndecoratedInsertRecord, ValuesClause,
};
pub use self::query_id::QueryId;
#[doc(hidden)]
pub use self::select_statement::{BoxedSelectStatement, SelectStatement};
pub use self::sql_query::SqlQuery;
#[cfg(feature = "with-deprecated")]
#[allow(deprecated)]
pub use self::update_statement::IncompleteUpdateStatement;
#[doc(inline)]
pub use self::update_statement::{
AsChangeset, BoxedUpdateStatement, IntoUpdateTarget, UpdateStatement, UpdateTarget,
};
pub(crate) use self::insert_statement::ColumnList;
use std::error::Error;
use backend::Backend;
use result::QueryResult;
#[doc(hidden)]
pub type Binds = Vec<Option<Vec<u8>>>;
pub type BuildQueryResult = Result<(), Box<dyn Error + Send + Sync>>;
pub trait QueryBuilder<DB: Backend> {
fn push_sql(&mut self, sql: &str);
fn push_identifier(&mut self, identifier: &str) -> QueryResult<()>;
fn push_bind_param(&mut self);
fn finish(self) -> String;
}
pub trait Query {
type SqlType;
}
impl<'a, T: Query> Query for &'a T {
type SqlType = T::SqlType;
}
pub trait SelectQuery {
type SqlType;
}
pub trait QueryFragment<DB: Backend> {
fn walk_ast(&self, pass: AstPass<DB>) -> QueryResult<()>;
fn to_sql(&self, out: &mut DB::QueryBuilder) -> QueryResult<()> {
self.walk_ast(AstPass::to_sql(out))
}
fn collect_binds(
&self,
out: &mut DB::BindCollector,
metadata_lookup: &DB::MetadataLookup,
) -> QueryResult<()> {
self.walk_ast(AstPass::collect_binds(out, metadata_lookup))
}
fn is_safe_to_cache_prepared(&self) -> QueryResult<bool> {
let mut result = true;
self.walk_ast(AstPass::is_safe_to_cache_prepared(&mut result))?;
Ok(result)
}
#[doc(hidden)]
fn is_noop(&self) -> QueryResult<bool> {
let mut result = true;
self.walk_ast(AstPass::is_noop(&mut result))?;
Ok(result)
}
}
impl<T: ?Sized, DB> QueryFragment<DB> for Box<T>
where
DB: Backend,
T: QueryFragment<DB>,
{
fn walk_ast(&self, pass: AstPass<DB>) -> QueryResult<()> {
QueryFragment::walk_ast(&**self, pass)
}
}
impl<'a, T: ?Sized, DB> QueryFragment<DB> for &'a T
where
DB: Backend,
T: QueryFragment<DB>,
{
fn walk_ast(&self, pass: AstPass<DB>) -> QueryResult<()> {
QueryFragment::walk_ast(&**self, pass)
}
}
impl<DB: Backend> QueryFragment<DB> for () {
fn walk_ast(&self, _: AstPass<DB>) -> QueryResult<()> {
Ok(())
}
}
impl<T, DB> QueryFragment<DB> for Option<T>
where
DB: Backend,
T: QueryFragment<DB>,
{
fn walk_ast(&self, out: AstPass<DB>) -> QueryResult<()> {
match *self {
Some(ref c) => c.walk_ast(out),
None => Ok(()),
}
}
}
pub trait AsQuery {
type SqlType;
type Query: Query<SqlType = Self::SqlType>;
fn as_query(self) -> Self::Query;
}
impl<T: Query> AsQuery for T {
type SqlType = <Self as Query>::SqlType;
type Query = Self;
fn as_query(self) -> Self::Query {
self
}
}
pub fn debug_query<DB, T>(query: &T) -> DebugQuery<T, DB> {
DebugQuery::new(query)
}