pg_extras/queries/
calls.rs1use 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}