use toasty_core::{
Schema,
schema::app::ModelId,
stmt::{self, ExprSet, InsertTarget, UpdateTarget},
};
pub(crate) fn query_span(schema: &Schema, stmt: &stmt::Statement) -> tracing::Span {
let span = tracing::debug_span!(
target: "toasty::query",
"query",
stmt.kind = stmt.name(),
model = tracing::field::Empty,
);
if span.is_disabled() {
return tracing::Span::current();
}
if let Some(model_id) = stmt_model_id(stmt) {
let name = schema.app.model(model_id).name().upper_camel_case();
span.record("model", name.as_str());
}
span
}
pub(crate) fn raw_sql_span() -> tracing::Span {
let span = tracing::debug_span!(target: "toasty::query", "query", stmt.kind = "raw_sql");
if span.is_disabled() {
return tracing::Span::current();
}
span
}
fn stmt_model_id(stmt: &stmt::Statement) -> Option<ModelId> {
match stmt {
stmt::Statement::Query(query) => query_model_id(query),
stmt::Statement::Insert(insert) => match &insert.target {
InsertTarget::Model(model_id) => Some(*model_id),
InsertTarget::Scope(query) => query_model_id(query),
InsertTarget::Table(_) => None,
},
stmt::Statement::Update(update) => match &update.target {
UpdateTarget::Model(model_id) => Some(*model_id),
UpdateTarget::Query(query) => query_model_id(query),
UpdateTarget::Table(_) => None,
},
stmt::Statement::Delete(delete) => delete.from.as_model().map(|source| source.id),
}
}
fn query_model_id(query: &stmt::Query) -> Option<ModelId> {
match &query.body {
ExprSet::Select(select) => select.source.as_model().map(|source| source.id),
ExprSet::Update(update) => match &update.target {
UpdateTarget::Model(model_id) => Some(*model_id),
UpdateTarget::Query(query) => query_model_id(query),
UpdateTarget::Table(_) => None,
},
_ => None,
}
}