From 680a0e1ce28b786970ebfd805660dee3425173b6 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Tue, 13 Dec 2022 01:40:13 +0800 Subject: [PATCH] refactor: add import batch interface --- .../loro-core/src/log_store/encode_updates.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/crates/loro-core/src/log_store/encode_updates.rs b/crates/loro-core/src/log_store/encode_updates.rs index d0df3378..364dece8 100644 --- a/crates/loro-core/src/log_store/encode_updates.rs +++ b/crates/loro-core/src/log_store/encode_updates.rs @@ -74,6 +74,25 @@ impl LogStore { Ok(self.import(changes)) } + + #[instrument(skip_all)] + pub fn import_updates_batch( + &mut self, + batch: &[Vec], + ) -> Result, postcard::Error> { + let mut changes: RemoteClientChanges = Default::default(); + for input in batch { + let updates: Updates = postcard::from_bytes(input)?; + for encoded in updates.changes { + changes + .entry(encoded.meta.client) + .or_default() + .append(&mut convert_encoded_to_changes(encoded)); + } + } + + Ok(self.import(changes)) + } } fn convert_changes_to_encoded(mut changes: I) -> EncodedClientChanges @@ -207,4 +226,19 @@ impl LoroCore { debug_log::group_end!(); ans } + + #[instrument(skip_all)] + pub fn import_updates_batch(&mut self, input: &[Vec]) -> Result<(), LoroError> { + debug_log::group!("Import updates at {}", self.client_id()); + let ans = self.log_store.write().unwrap().import_updates_batch(input); + let ans = match ans { + Ok(events) => { + self.notify(events); + Ok(()) + } + Err(err) => Err(LoroError::DecodeError(err.to_string().into_boxed_str())), + }; + debug_log::group_end!(); + ans + } }