From 32a05b5ec244d4d8143993b082f8d3f86a0a4ecd Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 30 Jan 2025 15:47:16 +0100 Subject: external ids --- base/src/database.rs | 96 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 40 deletions(-) (limited to 'base/src/database.rs') diff --git a/base/src/database.rs b/base/src/database.rs index bec630a..cd8b2bc 100644 --- a/base/src/database.rs +++ b/base/src/database.rs @@ -31,6 +31,8 @@ const T_INVITE: TableDefinition<&str, ()> = TableDefinition::new("invite"); const T_NODE: TableDefinition<[u8; 32], Ser> = TableDefinition::new("node"); const T_NODE_CHILDREN: TableDefinition<([u8; 32], [u8; 32]), ()> = TableDefinition::new("node_children"); +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"); #[derive(Clone)] @@ -65,9 +67,11 @@ impl Database { info!("ready"); Ok(r) } + pub fn get_node_slug(&self, slug: &str) -> Result>> { self.get_node(NodeID::from_slug(slug)) } + pub fn get_node(&self, id: NodeID) -> Result>> { let txn = self.inner.begin_read()?; let t_node = txn.open_table(T_NODE)?; @@ -77,6 +81,7 @@ impl Database { Ok(None) } } + pub fn get_node_children(&self, id: NodeID) -> Result> { let txn = self.inner.begin_read()?; let t_node_children = txn.open_table(T_NODE_CHILDREN)?; @@ -85,16 +90,20 @@ impl Database { .map(|r| r.map(|r| NodeID(r.0.value().1))) .collect::, StorageError>>()?) } + pub fn clear_nodes(&self) -> Result<()> { let txn = self.inner.begin_write()?; let mut t_node = txn.open_table(T_NODE)?; let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?; + let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?; t_node.retain(|_, _| false)?; t_node_children.retain(|_, _| false)?; - drop((t_node, t_node_children)); + t_node_external_id.retain(|_, _| false)?; + drop((t_node, t_node_children, t_node_external_id)); txn.commit()?; Ok(()) } + pub fn get_node_udata(&self, id: NodeID, username: &str) -> Result> { let txn = self.inner.begin_read()?; let t_node = txn.open_table(T_USER_NODE)?; @@ -104,6 +113,52 @@ impl Database { Ok(None) } } + + pub fn update_node_init( + &self, + id: NodeID, + update: impl FnOnce(&mut Node) -> Result<()>, + ) -> Result<()> { + let txn = self.inner.begin_write()?; + let mut t_nodes = txn.open_table(T_NODE)?; + 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(); + update(&mut node)?; + for parent in &node.parents { + t_node_children.insert((parent.0, id.0), ())?; + } + 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)); + txn.commit()?; + Ok(()) + } + + pub fn update_node_udata( + &self, + node: NodeID, + username: &str, + update: impl FnOnce(&mut NodeUserData) -> Result<()>, + ) -> Result<()> { + let txn = self.inner.begin_write()?; + let mut user_nodes = txn.open_table(T_USER_NODE)?; + + let mut udata = user_nodes + .get((username, node.0))? + .map(|x| x.value().0) + .unwrap_or_default(); + + update(&mut udata)?; + + user_nodes.insert((username, node.0), Ser(udata))?; + drop(user_nodes); + txn.commit()?; + Ok(()) + } + pub fn get_user(&self, username: &str) -> Result> { let txn = self.inner.begin_read()?; let t_user = txn.open_table(T_USER)?; @@ -132,27 +187,6 @@ impl Database { Ok(()) } - pub fn update_node_udata( - &self, - node: NodeID, - username: &str, - update: impl FnOnce(&mut NodeUserData) -> Result<()>, - ) -> Result<()> { - let txn = self.inner.begin_write()?; - let mut user_nodes = txn.open_table(T_USER_NODE)?; - - let mut udata = user_nodes - .get((username, node.0))? - .map(|x| x.value().0) - .unwrap_or_default(); - - update(&mut udata)?; - - user_nodes.insert((username, node.0), Ser(udata))?; - drop(user_nodes); - txn.commit()?; - Ok(()) - } pub fn delete_user(&self, username: &str) -> Result { let txn = self.inner.begin_write()?; let mut table = txn.open_table(T_USER)?; @@ -290,24 +324,6 @@ impl Database { txn.commit().unwrap(); Ok(()) } - pub fn update_node_init( - &self, - id: NodeID, - update: impl FnOnce(&mut Node) -> Result<()>, - ) -> Result<()> { - let txn = self.inner.begin_write()?; - let mut t_nodes = txn.open_table(T_NODE)?; - let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?; - let mut node = t_nodes.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), ())?; - } - t_nodes.insert(&id.0, Ser(node))?; - drop((t_nodes, t_node_children)); - txn.commit()?; - Ok(()) - } pub fn get_import_file_mtime(&self, path: &Path) -> Result> { let bytes = path.as_os_str().as_encoded_bytes(); let txn = self.inner.begin_read()?; -- cgit v1.2.3-70-g09d2