diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-07 14:08:20 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-07 14:08:20 +0100 |
commit | 346095d20e3d817d150cbea49e87a49fbcaa2304 (patch) | |
tree | 1fc3868fa68287e916e511c8f5b43b62087f0ff9 /base | |
parent | 976bdd8e2d14049c766a654a7575f9f5109c7395 (diff) | |
download | jellything-346095d20e3d817d150cbea49e87a49fbcaa2304.tar jellything-346095d20e3d817d150cbea49e87a49fbcaa2304.tar.bz2 jellything-346095d20e3d817d150cbea49e87a49fbcaa2304.tar.zst |
nodeid guard
Diffstat (limited to 'base')
-rw-r--r-- | base/src/database.rs | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/base/src/database.rs b/base/src/database.rs index f1e023c..c0699f0 100644 --- a/base/src/database.rs +++ b/base/src/database.rs @@ -15,6 +15,7 @@ use std::{ fs::create_dir_all, path::Path, sync::{Arc, RwLock}, + time::SystemTime, }; use tantivy::{ collector::{Count, TopDocs}, @@ -35,6 +36,7 @@ const T_NODE_CHILDREN: TableDefinition<([u8; 32], [u8; 32]), ()> = const T_NODE_EXTERNAL_ID: TableDefinition<(&str, &str), [u8; 32]> = TableDefinition::new("node_external_id"); const T_IMPORT_FILE_MTIME: TableDefinition<&[u8], u64> = TableDefinition::new("import_file_mtime"); +const T_NODE_MTIME: TableDefinition<[u8; 32], u64> = TableDefinition::new("node_mtime"); #[derive(Clone)] pub struct Database { @@ -61,6 +63,7 @@ impl Database { txn.open_table(T_USER)?; txn.open_table(T_USER_NODE)?; txn.open_table(T_NODE)?; + txn.open_table(T_NODE_MTIME)?; txn.open_table(T_NODE_CHILDREN)?; txn.open_table(T_NODE_EXTERNAL_ID)?; txn.open_table(T_IMPORT_FILE_MTIME)?; @@ -101,19 +104,32 @@ impl Database { .map(|r| r.map(|r| NodeID(r.0.value().1))) .collect::<Result<Vec<_>, StorageError>>()?) } + pub fn get_nodes_modified_since(&self, since: u64) -> Result<Vec<NodeID>> { + let txn = self.inner.begin_read()?; + let t_node_mtime = txn.open_table(T_NODE_MTIME)?; + Ok(t_node_mtime + .iter()? + .flat_map(|r| r.map(|r| (NodeID(r.0.value()), r.1.value()))) + .filter(|(_, mtime)| *mtime >= since) + .map(|(id, _)| id) + .collect()) + } pub fn clear_nodes(&self) -> Result<()> { let mut txn = self.inner.begin_write()?; let mut t_node = txn.open_table(T_NODE)?; + let mut t_node_mtime = txn.open_table(T_NODE_MTIME)?; let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?; let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?; let mut t_import_file_mtime = txn.open_table(T_IMPORT_FILE_MTIME)?; t_node.retain(|_, _| false)?; + t_node_mtime.retain(|_, _| false)?; t_node_children.retain(|_, _| false)?; t_node_external_id.retain(|_, _| false)?; t_import_file_mtime.retain(|_, _| false)?; drop(( t_node, + t_node_mtime, t_node_children, t_node_external_id, t_import_file_mtime, @@ -138,11 +154,16 @@ impl Database { id: NodeID, update: impl FnOnce(&mut Node) -> Result<()>, ) -> Result<()> { + let time = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(); let mut txn = self.inner.begin_write()?; - let mut t_nodes = txn.open_table(T_NODE)?; + let mut t_node = txn.open_table(T_NODE)?; + let mut t_node_mtime = txn.open_table(T_NODE_MTIME)?; let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?; let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?; - let mut node = t_nodes.get(id.0)?.map(|v| v.value().0).unwrap_or_default(); + let mut node = t_node.get(id.0)?.map(|v| v.value().0).unwrap_or_default(); update(&mut node)?; for parent in &node.parents { t_node_children.insert((parent.0, id.0), ())?; @@ -150,8 +171,9 @@ impl Database { for (pl, eid) in &node.external_ids { t_node_external_id.insert((pl.as_str(), eid.as_str()), id.0)?; } - t_nodes.insert(&id.0, Ser(node))?; - drop((t_nodes, t_node_children, t_node_external_id)); + t_node.insert(&id.0, Ser(node))?; + t_node_mtime.insert(&id.0, time)?; + drop((t_node, t_node_mtime, t_node_children, t_node_external_id)); txn.set_durability(Durability::Eventual); txn.commit()?; Ok(()) |