From 1561771deb0940fb0bb2a184ab3d93adc2f16ddd Mon Sep 17 00:00:00 2001 From: Dastan-glitch Date: Tue, 18 Jul 2023 02:08:39 +0300 Subject: [PATCH] event_graph: introduce save/load tree methods --- Cargo.toml | 2 ++ src/event_graph/model.rs | 43 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 81bdf2dc5..e319e6281 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -189,6 +189,8 @@ event-graph = [ "rand", "async-runtime", + "darkfi-serial", + "darkfi-serial/collections", "darkfi-serial/hash", "net", ] diff --git a/src/event_graph/model.rs b/src/event_graph/model.rs index 5bbb786f1..cc2c09c1b 100644 --- a/src/event_graph/model.rs +++ b/src/event_graph/model.rs @@ -16,14 +16,22 @@ * along with this program. If not, see . */ -use std::{cmp::Ordering, collections::HashMap, fmt::Debug}; +use std::{cmp::Ordering, collections::HashMap, fmt::Debug, path::Path}; use async_std::sync::{Arc, Mutex}; use blake3; -use darkfi_serial::{serialize, Decodable, Encodable, SerialDecodable, SerialEncodable}; +use darkfi_serial::{ + deserialize, serialize, Decodable, Encodable, SerialDecodable, SerialEncodable, +}; use log::{error, info}; -use crate::{event_graph::events_queue::EventsQueuePtr, util::time::Timestamp}; +use crate::{ + event_graph::events_queue::EventsQueuePtr, + util::{ + file::{load_json_file, save_json_file}, + time::Timestamp, + }, +}; use super::EventMsg; @@ -49,7 +57,7 @@ where } } -#[derive(Debug, Clone)] +#[derive(SerialEncodable, SerialDecodable, Clone, Debug)] struct EventNode { // Only current root has this set to None parent: Option, @@ -90,6 +98,33 @@ where Self { current_root: root_node_id, orphans: HashMap::new(), event_map, events_queue } } + pub fn save_tree(&self, path: &Path) -> crate::Result<()> { + let path = path.join("tree"); + let tree = self.event_map.clone(); + let ser_tree = serialize(&tree); + + save_json_file(&path, &ser_tree)?; + + info!("Tree is saved to disk"); + + Ok(()) + } + + pub fn load_tree(&mut self, path: &Path) -> crate::Result<()> { + let path = path.join("tree"); + if !path.exists() { + return Ok(()) + } + + let loaded_tree = load_json_file::>(&path)?; + let dser_tree: HashMap> = deserialize(&loaded_tree)?; + self.event_map = dser_tree; + + info!("Tree is loaded from disk"); + + Ok(()) + } + pub fn reset_root(&mut self, timestamp: Timestamp) { let root_node = EventNode { parent: None,