pub(crate) mod eval;
pub(crate) mod exec;
mod extract_params;
#[cfg(test)]
pub(crate) mod test_util;
mod hir;
use hir::HirStatement;
mod index;
mod lower;
mod mir;
mod plan;
mod select_item;
pub(crate) use select_item::{SelectItem, SelectItems};
mod simplify;
mod ty;
mod verify;
use crate::Result;
use std::sync::Arc;
use toasty_core::{
Connection, Schema,
driver::Capability,
stmt::{self, Statement},
};
#[derive(Debug, Clone)]
pub(crate) struct Engine {
pub(crate) schema: Arc<Schema>,
pub(crate) capability: &'static Capability,
}
impl Engine {
pub(crate) fn new(schema: Arc<Schema>, capability: &'static Capability) -> Engine {
Engine { schema, capability }
}
pub(crate) fn capability(&self) -> &Capability {
self.capability
}
pub(crate) async fn exec(
&self,
connection: &mut dyn Connection,
stmt: Statement,
in_transaction: bool,
) -> Result<toasty_core::driver::ExecResponse> {
tracing::debug!(stmt.kind = stmt.name(), "executing statement");
if cfg!(debug_assertions) {
self.verify(&stmt);
}
if let stmt::Statement::Insert(stmt) = &stmt {
assert!(matches!(
stmt.returning,
Some(stmt::Returning::Model { .. })
));
}
let hir = self.lower_stmt(stmt)?;
let plan = self.plan_hir_statement(hir)?;
tracing::trace!(
actions = plan.actions.len(),
needs_transaction = plan.needs_transaction,
"execution plan ready"
);
self.exec_plan(connection, plan, in_transaction).await
}
fn expr_cx_for<'a>(&'a self, target: impl stmt::IntoExprTarget<'a>) -> stmt::ExprContext<'a> {
stmt::ExprContext::new_with_target(&self.schema, target)
}
}