commit
bc5fbd6ba9
180 files changed
+63750
No files matched your search
@@ -0,0 +1,78 @@
|
||||
use rusqlite::{params, Connection};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub struct SavedSearch {
|
||||
pub id: i64,
|
||||
pub name: String,
|
||||
pub query_string: String,
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
}
|
||||
|
||||
fn row_to_saved(row: &rusqlite::Row<'_>) -> rusqlite::Result<SavedSearch> {
|
||||
Ok(SavedSearch {
|
||||
id: row.get(0)?,
|
||||
name: row.get(1)?,
|
||||
query_string: row.get(2)?,
|
||||
created_at: row.get(3)?,
|
||||
updated_at: row.get(4)?,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn list(conn: &Connection) -> Result<Vec<SavedSearch>, String> {
|
||||
let mut stmt = conn
|
||||
.prepare("SELECT id,name,query_string,created_at,updated_at FROM saved_searches ORDER BY name COLLATE NOCASE")
|
||||
.map_err(|e| format!("Failed to prepare saved searches: {e}"))?;
|
||||
let rows = stmt
|
||||
.query_map([], row_to_saved)
|
||||
.map_err(|e| format!("Failed to query saved searches: {e}"))?;
|
||||
rows.map(|row| row.map_err(|e| format!("Failed to read saved search: {e}")))
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn create(conn: &Connection, name: &str, query_string: &str) -> Result<SavedSearch, String> {
|
||||
let name = name.trim();
|
||||
let query_string = query_string.trim();
|
||||
if name.is_empty() || query_string.is_empty() {
|
||||
return Err("Saved search name and query are required".to_string());
|
||||
}
|
||||
conn.execute(
|
||||
"INSERT INTO saved_searches(name,query_string) VALUES (?1,?2)",
|
||||
params![name, query_string],
|
||||
)
|
||||
.map_err(|e| format!("Failed to save search: {e}"))?;
|
||||
let id = conn.last_insert_rowid();
|
||||
get(conn, id)?.ok_or_else(|| "Failed to read saved search".to_string())
|
||||
}
|
||||
|
||||
pub fn update(conn: &Connection, id: i64, name: &str, query_string: &str) -> Result<Option<SavedSearch>, String> {
|
||||
let name = name.trim();
|
||||
let query_string = query_string.trim();
|
||||
if name.is_empty() || query_string.is_empty() {
|
||||
return Err("Saved search name and query are required".to_string());
|
||||
}
|
||||
let changed = conn.execute(
|
||||
"UPDATE saved_searches SET name=?1,query_string=?2,updated_at=datetime('now') WHERE id=?3",
|
||||
params![name, query_string, id],
|
||||
).map_err(|e| format!("Failed to update saved search: {e}"))?;
|
||||
if changed == 0 { return Ok(None); }
|
||||
get(conn, id)
|
||||
}
|
||||
|
||||
pub fn get(conn: &Connection, id: i64) -> Result<Option<SavedSearch>, String> {
|
||||
match conn.query_row(
|
||||
"SELECT id,name,query_string,created_at,updated_at FROM saved_searches WHERE id=?1",
|
||||
params![id],
|
||||
row_to_saved,
|
||||
) {
|
||||
Ok(value) => Ok(Some(value)),
|
||||
Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None),
|
||||
Err(e) => Err(format!("Failed to get saved search: {e}")),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn delete(conn: &Connection, id: i64) -> Result<bool, String> {
|
||||
Ok(conn.execute("DELETE FROM saved_searches WHERE id=?1", params![id])
|
||||
.map_err(|e| format!("Failed to delete saved search: {e}"))? > 0)
|
||||
}
|
||||
Reference in new issue
Block a user