pg_extras/queries/
blocking.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 Blocking {
8 pub blocked_pid: i32,
9 pub blocking_statement: String,
10 pub blocking_duration: PgInterval,
11 pub blocking_pid: i32,
12 pub blocked_statement: String,
13 pub blocked_duration: PgInterval,
14 pub blocked_sql_app: String,
15 pub blocking_sql_app: String,
16}
17
18impl serde::Serialize for Blocking {
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("Blocking", 8)?;
25 state.serialize_field("blocked_pid", &self.blocked_pid)?;
26 state.serialize_field("blocking_statement", &self.blocking_statement)?;
27 state.serialize_field(
28 "blocking_duration",
29 &format!("{:?}", self.blocking_duration),
30 )?;
31 state.serialize_field("blocking_pid", &self.blocking_pid)?;
32 state.serialize_field("blocked_statement", &self.blocked_statement)?;
33 state.serialize_field("blocked_duration", &format!("{:?}", self.blocked_duration))?;
34 state.serialize_field("blocked_sql_app", &self.blocked_sql_app)?;
35 state.serialize_field("blocking_sql_app", &self.blocking_sql_app)?;
36 state.end()
37 }
38}
39
40impl Query for Blocking {
41 fn new(row: &PgRow) -> Self {
42 Self {
43 blocked_pid: row.try_get("blocked_pid").unwrap_or_default(),
44 blocking_statement: row.try_get("blocking_statement").unwrap_or_default(),
45 blocking_duration: row
46 .try_get("blocking_duration")
47 .unwrap_or(get_default_interval()),
48 blocking_pid: row.try_get("blocking_pid").unwrap_or_default(),
49 blocked_statement: row.try_get("blocked_statement").unwrap_or_default(),
50 blocked_duration: row
51 .try_get("blocked_duration")
52 .unwrap_or(get_default_interval()),
53 blocked_sql_app: row.try_get("blocked_sql_app").unwrap_or_default(),
54 blocking_sql_app: row.try_get("blocking_sql_app").unwrap_or_default(),
55 }
56 }
57
58 fn to_row(&self) -> prettytable::Row {
59 row![
60 self.blocked_pid,
61 self.blocking_statement,
62 format!("{:?}", self.blocking_duration),
63 self.blocking_pid,
64 self.blocked_statement,
65 format!("{:?}", self.blocked_duration),
66 self.blocked_sql_app,
67 self.blocking_sql_app
68 ]
69 }
70
71 fn headers() -> prettytable::Row {
72 row![
73 "blocked_pid",
74 "blocking_statement",
75 "blocking_duration",
76 "blocking_pid",
77 "blocked_statement",
78 "blocked_duration",
79 "blocked_sql_app",
80 "blocking_sql_app"
81 ]
82 }
83
84 fn read_file(_pg_statement_version: Option<PgStatsVersion>) -> String {
85 include_str!("../sql/blocking.sql").to_string()
86 }
87}