Skip to main content

pg_extras/queries/
long_running_queries.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 LongRunningQueries {
8    pub pid: i32,
9    pub duration: PgInterval,
10    pub query: String,
11}
12
13impl serde::Serialize for LongRunningQueries {
14    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15    where
16        S: serde::Serializer,
17    {
18        use serde::ser::SerializeStruct;
19        let mut state = serializer.serialize_struct("LongRunningQueries", 3)?;
20        state.serialize_field("pid", &self.pid)?;
21        state.serialize_field("duration", &format!("{:?}", self.duration))?;
22        state.serialize_field("query", &self.query)?;
23        state.end()
24    }
25}
26
27impl Query for LongRunningQueries {
28    fn new(row: &PgRow) -> Self {
29        Self {
30            pid: row.try_get("pid").unwrap_or_default(),
31            duration: row.try_get("duration").unwrap_or(get_default_interval()),
32            query: row.try_get("query").unwrap_or_default(),
33        }
34    }
35
36    fn to_row(&self) -> prettytable::Row {
37        row![self.pid, format!("{:?}", self.duration), self.query]
38    }
39
40    fn headers() -> prettytable::Row {
41        row!["pid", "duration", "query"]
42    }
43
44    fn read_file(_pg_statement_version: Option<PgStatsVersion>) -> String {
45        include_str!("../sql/long_running_queries.sql").to_string()
46    }
47}