use rusqlite::params;
use super::QueryEngine;
use super::logs::{LOG_COLUMNS, LogRow, map_log_row};
pub struct SlowParams {
pub proxy: Option<String>,
pub threshold_us: i64,
pub since_ts: i64,
pub tool: Option<String>,
pub limit: i64,
}
impl QueryEngine {
pub fn slow(&self, params: &SlowParams) -> Result<Vec<LogRow>, rusqlite::Error> {
let sql = format!(
"SELECT {LOG_COLUMNS}
FROM requests
WHERE (?1 IS NULL OR proxy = ?1)
AND latency_us >= ?2
AND (?3 IS NULL OR tool = ?3)
AND ts >= ?4
ORDER BY latency_us DESC
LIMIT ?5"
);
let mut stmt = self.conn().prepare(&sql)?;
let rows = stmt.query_map(
params![
params.proxy,
params.threshold_us,
params.tool,
params.since_ts,
params.limit,
],
map_log_row,
)?;
rows.collect()
}
pub fn slow_since(
&self,
params: &SlowParams,
after_ts: i64,
) -> Result<Vec<LogRow>, rusqlite::Error> {
let sql = format!(
"SELECT {LOG_COLUMNS}
FROM requests
WHERE (?1 IS NULL OR proxy = ?1)
AND latency_us >= ?2
AND (?3 IS NULL OR tool = ?3)
AND ts > ?4
ORDER BY ts ASC"
);
let mut stmt = self.conn().prepare(&sql)?;
let rows = stmt.query_map(
params![params.proxy, params.threshold_us, params.tool, after_ts],
map_log_row,
)?;
rows.collect()
}
}