From 314bca18a43e22368a87fcad53d91190fe101b60 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 7 Feb 2025 16:10:29 +0100 Subject: nodes modified since endpoint --- base/src/database.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'base/src') diff --git a/base/src/database.rs b/base/src/database.rs index c0699f0..54ead92 100644 --- a/base/src/database.rs +++ b/base/src/database.rs @@ -4,7 +4,7 @@ Copyright (C) 2025 metamuffin */ use anyhow::{anyhow, bail, Context, Result}; -use bincode::{Decode, Encode}; +use bincode::{config::standard, Decode, Encode}; use jellycommon::{ user::{NodeUserData, User}, Node, NodeID, @@ -13,6 +13,7 @@ use log::info; use redb::{Durability, ReadableTable, StorageError, TableDefinition}; use std::{ fs::create_dir_all, + hash::{DefaultHasher, Hasher}, path::Path, sync::{Arc, RwLock}, time::SystemTime, @@ -164,7 +165,17 @@ impl Database { 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_node.get(id.0)?.map(|v| v.value().0).unwrap_or_default(); + + let mut dh_before = HashWriter(DefaultHasher::new()); + bincode::encode_into_writer(&node, &mut dh_before, standard()).unwrap(); update(&mut node)?; + let mut dh_after = HashWriter(DefaultHasher::new()); + bincode::encode_into_writer(&node, &mut dh_after, standard()).unwrap(); + + if dh_before.0.finish() == dh_after.0.finish() { + return Ok(()); + } + for parent in &node.parents { t_node_children.insert((parent.0, id.0), ())?; } @@ -463,6 +474,14 @@ impl NodeTextSearchIndex { } } +pub struct HashWriter(DefaultHasher); +impl bincode::enc::write::Writer for HashWriter { + fn write(&mut self, bytes: &[u8]) -> std::result::Result<(), bincode::error::EncodeError> { + self.0.write(bytes); + Ok(()) + } +} + #[derive(Debug)] #[cfg(not(feature = "db_json"))] pub struct Ser(pub T); -- cgit v1.2.3-70-g09d2