pg_extras/queries/
calls.rs

1use crate::queries::shared::{get_default_interval, Query};
2use crate::PgStatsVersion;
3use sqlx::postgres::{types::PgInterval, PgRow};
4use sqlx::Row;
5
6#[derive(Debug, Clone)]
7pub struct Calls {
8    pub qry: String,
9    pub exec_time: PgInterval,
10    pub prop_exec_time: String,
11    pub ncalls: String,
12    pub sync_io_time: PgInterval,
13}
14
15impl serde::Serialize for Calls {
16    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17    where
18        S: serde::Serializer,
19    {
20        use serde::ser::SerializeStruct;
21        let mut state = serializer.serialize_struct("Calls", 5)?;
22        state.serialize_field("qry", &self.qry)?;
23        state.serialize_field("exec_time", &format!("{:?}", self.exec_time))?;
24        state.serialize_field("prop_exec_time", &self.prop_exec_time)?;
25        state.serialize_field("ncalls", &self.ncalls)?;
26        state.serialize_field("sync_io_time", &format!("{:?}", self.sync_io_time))?;
27        state.end()
28    }
29}
30
31impl Query for Calls {
32    fn new(row: &PgRow) -> Self {
33        Self {
34            qry: row.try_get("qry").unwrap_or_default(),
35            exec_time: row.try_get("exec_time").unwrap_or(get_default_interval()),
36            prop_exec_time: row.try_get("prop_exec_time").unwrap_or_default(),
37            ncalls: row.try_get("ncalls").unwrap_or_default(),
38            sync_io_time: row
39                .try_get("sync_io_time")
40                .unwrap_or(get_default_interval()),
41        }
42    }
43
44    fn to_row(&self) -> prettytable::Row {
45        row![
46            self.qry,
47            format!("{:?}", self.exec_time),
48            self.prop_exec_time,
49            self.ncalls,
50            format!("{:?}", self.sync_io_time),
51        ]
52    }
53
54    fn headers() -> prettytable::Row {
55        row![
56            "qry",
57            "exec_time",
58            "prop_exec_time",
59            "ncalls",
60            "sync_io_time"
61        ]
62    }
63
64    fn read_file(pg_statement_version: Option<PgStatsVersion>) -> String {
65        let default = include_str!("../sql/calls.sql");
66
67        match pg_statement_version {
68            Some(PgStatsVersion::Legacy) => include_str!("../sql/calls_legacy.sql"),
69            Some(PgStatsVersion::Standard) => default,
70            Some(PgStatsVersion::Pg17) => include_str!("../sql/calls_17.sql"),
71            None => default,
72        }
73        .to_string()
74    }
75}