Skip to main content

vs_store/store/
skill_cache.rs

1//! `skill_cache` table CRUD.
2
3use 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}