Live sync KV stores over Iroh

This commit is contained in:
Eric Wendland 2026-05-18 18:36:03 +02:00
commit f85039367c
9 changed files with 473 additions and 13 deletions

View file

@ -335,6 +335,21 @@ impl Store {
}
}
pub fn list_kv_stores(&self) -> Result<Vec<StoredKvStore>, StoreError> {
let mut stmt = self
.conn
.prepare("SELECT kv_id, resource_id, name FROM kv_stores ORDER BY name")?;
let rows = stmt.query_map([], |row| {
Ok(StoredKvStore {
kv_id: row.get(0)?,
resource_id: row.get(1)?,
name: row.get(2)?,
})
})?;
rows.collect::<Result<Vec<_>, _>>()
.map_err(StoreError::from)
}
pub fn set_kv_entry(&self, entry: &StoredKvEntry) -> Result<(), StoreError> {
self.conn.execute(
r#"INSERT OR REPLACE INTO kv_entries(kv_id, key, value, updated_at_ms)
@ -366,6 +381,29 @@ impl Store {
}
}
pub fn list_kv_entries_since(
&self,
kv_id: &str,
since_ms: i64,
) -> Result<Vec<StoredKvEntry>, StoreError> {
let mut stmt = self.conn.prepare(
r#"SELECT kv_id, key, value, updated_at_ms
FROM kv_entries
WHERE kv_id = ?1 AND updated_at_ms >= ?2
ORDER BY updated_at_ms, key"#,
)?;
let rows = stmt.query_map(params![kv_id, since_ms], |row| {
Ok(StoredKvEntry {
kv_id: row.get(0)?,
key: row.get(1)?,
value: row.get(2)?,
updated_at_ms: row.get(3)?,
})
})?;
rows.collect::<Result<Vec<_>, _>>()
.map_err(StoreError::from)
}
pub fn insert_document_resource(
&self,
document: &StoredDocumentResource,
@ -1518,6 +1556,7 @@ mod tests {
store.get_kv_store_by_name("prefs").expect("get kv"),
Some(kv.clone())
);
assert_eq!(store.list_kv_stores().expect("list kv"), vec![kv.clone()]);
let entry = StoredKvEntry {
kv_id: kv.kv_id.clone(),
@ -1530,7 +1569,13 @@ mod tests {
store
.get_kv_entry("kv:prefs", "apps/foo/theme")
.expect("get entry"),
Some(entry)
Some(entry.clone())
);
assert_eq!(
store
.list_kv_entries_since("kv:prefs", 1)
.expect("list entries since"),
vec![entry]
);
}