mcpr_integrations/store/query/
slow.rs1use rusqlite::params;
4
5use super::QueryEngine;
6use super::logs::{LOG_COLUMNS, LogRow, map_log_row};
7
8pub struct SlowParams {
10 pub proxy: Option<String>,
12 pub threshold_us: i64,
14 pub since_ts: i64,
16 pub tool: Option<String>,
18 pub limit: i64,
20}
21
22impl QueryEngine {
23 pub fn slow(&self, params: &SlowParams) -> Result<Vec<LogRow>, rusqlite::Error> {
25 let sql = format!(
26 "SELECT {LOG_COLUMNS}
27 FROM requests
28 WHERE (?1 IS NULL OR proxy = ?1)
29 AND latency_us >= ?2
30 AND (?3 IS NULL OR tool = ?3)
31 AND ts >= ?4
32 ORDER BY latency_us DESC
33 LIMIT ?5"
34 );
35
36 let mut stmt = self.conn().prepare(&sql)?;
37 let rows = stmt.query_map(
38 params![
39 params.proxy,
40 params.threshold_us,
41 params.tool,
42 params.since_ts,
43 params.limit,
44 ],
45 map_log_row,
46 )?;
47
48 rows.collect()
49 }
50
51 pub fn slow_since(
53 &self,
54 params: &SlowParams,
55 after_ts: i64,
56 ) -> Result<Vec<LogRow>, rusqlite::Error> {
57 let sql = format!(
58 "SELECT {LOG_COLUMNS}
59 FROM requests
60 WHERE (?1 IS NULL OR proxy = ?1)
61 AND latency_us >= ?2
62 AND (?3 IS NULL OR tool = ?3)
63 AND ts > ?4
64 ORDER BY ts ASC"
65 );
66
67 let mut stmt = self.conn().prepare(&sql)?;
68 let rows = stmt.query_map(
69 params![params.proxy, params.threshold_us, params.tool, after_ts],
70 map_log_row,
71 )?;
72
73 rows.collect()
74 }
75}