engram_storage/
consolidation.rs1use rusqlite::params;
2
3use crate::database::Database;
4use crate::error::StorageError;
5
6impl Database {
7 pub fn log_consolidation(
8 &self,
9 id: &str,
10 action: &str,
11 memory_ids: &[String],
12 reason: Option<&str>,
13 performed_by: &str,
14 timestamp: &str,
15 ) -> Result<(), StorageError> {
16 let memory_ids_json = serde_json::to_string(memory_ids)
17 .map_err(|err| StorageError::DatabaseUnavailable(err.to_string()))?;
18 self.connection().execute(
19 "INSERT INTO consolidation_log (id, action, memory_ids, reason, performed_at, performed_by)
20 VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
21 params![id, action, memory_ids_json, reason, timestamp, performed_by],
22 )?;
23 Ok(())
24 }
25
26 pub fn track_search(&self, memory_id: &str, timestamp: &str) -> Result<(), StorageError> {
27 self.connection().execute(
28 "INSERT INTO feedback_tracking (memory_id, searched_at) VALUES (?1, ?2)",
29 params![memory_id, timestamp],
30 )?;
31 Ok(())
32 }
33
34 pub fn mark_judged(&self, memory_id: &str, timestamp: &str) -> Result<(), StorageError> {
35 self.connection().execute(
36 "UPDATE feedback_tracking SET judged = TRUE, judged_at = ?1
37 WHERE memory_id = ?2 AND judged = FALSE",
38 params![timestamp, memory_id],
39 )?;
40 Ok(())
41 }
42
43 pub fn get_pending_judgments(&self, limit: usize) -> Result<Vec<String>, StorageError> {
44 let mut statement = self.connection().prepare(
45 "SELECT DISTINCT memory_id FROM feedback_tracking WHERE judged = FALSE LIMIT ?1",
46 )?;
47 let rows = statement.query_map(params![limit as i64], |row| row.get(0))?;
48 let mut results = Vec::new();
49 for row in rows {
50 results.push(row?);
51 }
52 Ok(results)
53 }
54}