Skip to main content

sea_orm/
metric.rs

1use std::{sync::Arc, time::Duration};
2
3pub(crate) type Callback = Arc<dyn Fn(&Info<'_>)>;
4
5#[allow(unused_imports)]
6pub(crate) use inner::metric;
7
8#[derive(Debug)]
9/// Information about a single query execution, passed to the callback
10/// registered via [`DatabaseConnection::set_metric_callback`](crate::DatabaseConnection::set_metric_callback).
11pub struct Info<'a> {
12    /// Query execution duration
13    pub elapsed: Duration,
14    /// SQL statement with parameters
15    pub statement: &'a crate::Statement,
16    /// `true` if the query returned an error
17    pub failed: bool,
18}
19
20mod inner {
21    #[allow(unused_macros)]
22    macro_rules! metric {
23        ($metric_callback:expr, $stmt:expr, $code:block) => {{
24            let _start = $metric_callback.is_some().then(std::time::SystemTime::now);
25            let res = $code;
26            if let (Some(_start), Some(callback)) = (_start, $metric_callback.as_deref()) {
27                let info = crate::metric::Info {
28                    elapsed: _start.elapsed().unwrap_or_default(),
29                    statement: $stmt,
30                    failed: res.is_err(),
31                };
32                callback(&info);
33            }
34            res
35        }};
36    }
37    pub(crate) use metric;
38}