assay_core/storage/
judge_cache.rs1use 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}