Skip to main content

smriti/db/
recent_search_repo.rs

1//! Recent searches persistence (per-library history).
2
3use rusqlite::{params, Connection, Result as SqliteResult};
4
5#[allow(dead_code)]
6#[derive(Debug, Clone)]
7pub struct RecentSearch {
8    pub query: String,
9    pub last_used: String,
10    pub use_count: i64,
11}
12
13pub struct RecentSearchRepo<'a> {
14    conn: &'a Connection,
15}
16
17impl<'a> RecentSearchRepo<'a> {
18    pub fn new(conn: &'a Connection) -> Self {
19        Self { conn }
20    }
21
22    /// Record a search. Bumps use_count + last_used if it exists.
23    pub fn record(&self, query: &str) -> SqliteResult<()> {
24        let trimmed = query.trim();
25        if trimmed.is_empty() {
26            return Ok(());
27        }
28        self.conn.execute(
29            r#"
30            INSERT INTO recent_searches (query, last_used, use_count)
31            VALUES (?1, CURRENT_TIMESTAMP, 1)
32            ON CONFLICT(query) DO UPDATE SET
33                last_used = CURRENT_TIMESTAMP,
34                use_count = use_count + 1
35            "#,
36            params![trimmed],
37        )?;
38        Ok(())
39    }
40
41    /// Get the N most-recently-used searches.
42    pub fn get_recent(&self, limit: i64) -> SqliteResult<Vec<RecentSearch>> {
43        let mut stmt = self.conn.prepare(
44            "SELECT query, last_used, use_count FROM recent_searches
45             ORDER BY last_used DESC LIMIT ?1",
46        )?;
47        let rows = stmt.query_map(params![limit], |row| {
48            Ok(RecentSearch {
49                query: row.get(0)?,
50                last_used: row.get(1)?,
51                use_count: row.get(2)?,
52            })
53        })?;
54        rows.collect()
55    }
56
57    /// Remove a single recent search.
58    pub fn remove(&self, query: &str) -> SqliteResult<()> {
59        self.conn.execute(
60            "DELETE FROM recent_searches WHERE query = ?1",
61            params![query],
62        )?;
63        Ok(())
64    }
65
66    /// Clear all recent searches.
67    pub fn clear(&self) -> SqliteResult<()> {
68        self.conn.execute("DELETE FROM recent_searches", [])?;
69        Ok(())
70    }
71}