smriti/db/
recent_search_repo.rs1use 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 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 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 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 pub fn clear(&self) -> SqliteResult<()> {
68 self.conn.execute("DELETE FROM recent_searches", [])?;
69 Ok(())
70 }
71}