Skip to main content

assay_core/storage/
judge_cache.rs

1use crate::storage::Store;
2use rusqlite::params;
3
4#[derive(Clone)]
5pub struct JudgeCache {
6    store: Store,
7}
8
9impl JudgeCache {
10    pub fn new(store: Store) -> Self {
11        Self { store }
12    }
13
14    pub fn get(&self, key: &str) -> anyhow::Result<Option<serde_json::Value>> {
15        let conn = self.store.conn.lock().unwrap();
16        let mut stmt = conn.prepare("SELECT payload_json FROM judge_cache WHERE key=?1")?;
17        let mut rows = stmt.query(params![key])?;
18        if let Some(row) = rows.next()? {
19            let s: String = row.get(0)?;
20            let val: serde_json::Value = serde_json::from_str(&s)?;
21            Ok(Some(val))
22        } else {
23            Ok(None)
24        }
25    }
26
27    pub fn put(
28        &self,
29        key: &str,
30        provider: &str,
31        model: &str,
32        rubric_id: &str,
33        rubric_version: &str,
34        payload: &serde_json::Value,
35    ) -> anyhow::Result<()> {
36        let conn = self.store.conn.lock().unwrap();
37        let payload_json = serde_json::to_string(payload)?;
38        let created_at = now_rfc3339ish();
39
40        conn.execute(
41            "INSERT INTO judge_cache(
42                key, provider, model, rubric_id, rubric_version, created_at, payload_json
43            ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
44            ON CONFLICT(key) DO UPDATE SET
45                payload_json=excluded.payload_json,
46                created_at=excluded.created_at",
47            params![
48                key,
49                provider,
50                model,
51                rubric_id,
52                rubric_version,
53                created_at,
54                payload_json
55            ],
56        )?;
57        Ok(())
58    }
59}
60
61fn now_rfc3339ish() -> String {
62    use std::time::{SystemTime, UNIX_EPOCH};
63    let secs = SystemTime::now()
64        .duration_since(UNIX_EPOCH)
65        .unwrap()
66        .as_secs();
67    format!("unix:{}", secs)
68}