pg_extras/queries/
locks.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 Locks {
8    pub pid: i32,
9    pub relname: String,
10    pub transactionid: String,
11    pub granted: bool,
12    pub mode: String,
13    pub query_snippet: String,
14    pub age: PgInterval,
15    pub application: String,
16}
17
18impl serde::Serialize for Locks {
19    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20    where
21        S: serde::Serializer,
22    {
23        use serde::ser::SerializeStruct;
24        let mut state = serializer.serialize_struct("Locks", 8)?;
25        state.serialize_field("pid", &self.pid)?;
26        state.serialize_field("relname", &self.relname)?;
27        state.serialize_field("transactionid", &self.transactionid)?;
28        state.serialize_field("granted", &self.granted)?;
29        state.serialize_field("mode", &self.mode)?;
30        state.serialize_field("query_snippet", &self.query_snippet)?;
31        state.serialize_field("age", &format!("{:?}", self.age))?;
32        state.serialize_field("application", &self.application)?;
33        state.end()
34    }
35}
36
37impl Query for Locks {
38    fn new(row: &PgRow) -> Self {
39        Self {
40            pid: row.try_get("pid").unwrap_or_default(),
41            relname: row.try_get("relname").unwrap_or_default(),
42            transactionid: row.try_get("transactionid").unwrap_or_default(),
43            granted: row.try_get("granted").unwrap_or_default(),
44            mode: row.try_get("mode").unwrap_or_default(),
45            query_snippet: row.try_get("query_snippet").unwrap_or_default(),
46            age: row.try_get("age").unwrap_or(get_default_interval()),
47            application: row.try_get("application").unwrap_or_default(),
48        }
49    }
50
51    fn to_row(&self) -> prettytable::Row {
52        row![
53            self.pid,
54            self.relname,
55            self.transactionid,
56            self.granted,
57            self.mode,
58            self.query_snippet,
59            format!("{:?}", self.age),
60            self.application
61        ]
62    }
63
64    fn headers() -> prettytable::Row {
65        row![
66            "pid",
67            "relname",
68            "transactionid",
69            "granted",
70            "mode",
71            "query_snippet",
72            "age",
73            "application"
74        ]
75    }
76
77    fn read_file(_pg_statement_version: Option<PgStatsVersion>) -> String {
78        include_str!("../sql/locks.sql").to_string()
79    }
80}