pg_extras/queries/
shared.rs

1use sqlx::postgres::{types::PgInterval, PgRow};
2use std::env;
3
4use crate::PgStatsVersion;
5
6pub trait Query: serde::Serialize {
7    fn new(row: &PgRow) -> Self;
8    fn to_row(&self) -> prettytable::Row;
9    fn headers() -> prettytable::Row;
10    fn read_file(pg_statement_version: Option<PgStatsVersion>) -> String;
11    fn description() -> String {
12        let file_content = Self::read_file(None);
13        let desc = file_content.lines().take(1).next().unwrap_or_default();
14        extract_desc(desc)
15    }
16
17    fn to_json(&self) -> serde_json::Value {
18        serde_json::to_value(self).unwrap_or_default()
19    }
20}
21
22fn extract_desc(desc: &str) -> String {
23    if let (Some(start), Some(end)) = (desc.find("/*"), desc.find("*/")) {
24        let extracted = &desc[start + 2..end];
25        let mut trimmed = extracted.trim().to_string();
26        if trimmed.ends_with('.') {
27            trimmed.pop();
28        }
29        trimmed
30    } else {
31        desc.to_string()
32    }
33}
34
35pub fn get_default_interval() -> PgInterval {
36    PgInterval {
37        microseconds: 0,
38        days: 0,
39        months: 0,
40    }
41}
42
43pub fn get_default_schema() -> String {
44    env::var("PG_EXTRAS_SCHEMA").unwrap_or("public".to_string())
45}