vs_store/store/
skill_cache.rs1use rusqlite::params;
4
5use super::Store;
6use crate::error::Result;
7use crate::types::SkillEntry;
8
9impl Store {
10 pub fn upsert_skill(&mut self, entry: &SkillEntry) -> Result<()> {
11 self.conn().execute(
12 "INSERT INTO skill_cache(name, version, sha, manifest, last_used_at)
13 VALUES (?1, ?2, ?3, ?4, ?5)
14 ON CONFLICT(name) DO UPDATE
15 SET version=excluded.version,
16 sha=excluded.sha,
17 manifest=excluded.manifest,
18 last_used_at=excluded.last_used_at",
19 params![
20 entry.name,
21 entry.version,
22 entry.sha,
23 entry.manifest,
24 entry.last_used_at,
25 ],
26 )?;
27 Ok(())
28 }
29
30 pub fn get_skill(&self, name: &str) -> Result<Option<SkillEntry>> {
31 let mut stmt = self
32 .conn()
33 .prepare("SELECT * FROM skill_cache WHERE name=?1")?;
34 let mut rows = stmt.query([name])?;
35 if let Some(row) = rows.next()? {
36 Ok(Some(SkillEntry::from_row(row)?))
37 } else {
38 Ok(None)
39 }
40 }
41
42 pub fn list_skills(&self) -> Result<Vec<SkillEntry>> {
43 let mut stmt = self
44 .conn()
45 .prepare("SELECT * FROM skill_cache ORDER BY name ASC")?;
46 let rows = stmt.query_map([], SkillEntry::from_row)?;
47 Ok(rows.collect::<rusqlite::Result<Vec<_>>>()?)
48 }
49}