#[cfg(feature = "tracing")]
pub(crate) fn sql_digest(sql: &str) -> String {
const MAX: usize = 120;
let mut collapsed = String::with_capacity(sql.len().min(MAX));
let mut last_was_space = false;
for ch in sql.trim().chars() {
if ch.is_whitespace() {
if !last_was_space {
collapsed.push(' ');
last_was_space = true;
}
} else {
collapsed.push(ch);
last_was_space = false;
}
if collapsed.len() >= MAX {
collapsed.push('…');
break;
}
}
collapsed
}
#[cfg(feature = "tracing")]
#[macro_export]
macro_rules! obs_span {
($name:expr $(,)?) => {{
$crate::__tracing::span!($crate::__tracing::Level::INFO, $name).entered()
}};
($name:expr, $($fields:tt)+) => {{
$crate::__tracing::span!($crate::__tracing::Level::INFO, $name, $($fields)+).entered()
}};
}
#[cfg(not(feature = "tracing"))]
#[macro_export]
macro_rules! obs_span {
($name:expr $(,)?) => {
$crate::ObsSpanGuard
};
($name:expr, $($fields:tt)+) => {
$crate::ObsSpanGuard
};
}
#[cfg(not(feature = "tracing"))]
#[doc(hidden)]
pub struct ObsSpanGuard;
#[cfg(feature = "tracing")]
#[macro_export]
macro_rules! obs_record {
($guard:expr, $($field:ident).+ = $value:expr) => {{
let _ = $crate::__tracing::Span::record(
&*$guard,
::core::stringify!($($field).+),
$value,
);
}};
}
#[cfg(not(feature = "tracing"))]
#[macro_export]
macro_rules! obs_record {
($guard:expr, $($field:ident).+ = $value:expr) => {{}};
}
#[cfg(all(test, feature = "tracing"))]
mod tests {
use super::sql_digest;
#[test]
fn sql_digest_collapses_whitespace_and_keeps_shape() {
let digest = sql_digest(" select n\n from dual\t where 1=1 ");
assert_eq!(digest, "select n from dual where 1=1");
}
#[test]
fn sql_digest_is_length_capped() {
let long = format!("select {} from dual", "x".repeat(500));
let digest = sql_digest(&long);
assert!(
digest.chars().count() <= 121,
"digest must be length-capped, got {} chars",
digest.chars().count()
);
assert!(
digest.ends_with('…'),
"a truncated digest is marked with an ellipsis"
);
}
#[test]
fn sql_digest_preserves_a_literal_only_because_no_value_extraction_is_promised() {
let digest = sql_digest("select * from emp where id = :1");
assert_eq!(digest, "select * from emp where id = :1");
assert!(
!digest.chars().any(|c| c.is_ascii_digit() && c != '1'),
"a parameterized digest carries the bind placeholder, not a value"
);
}
}