use crate::{SnapshotError, SnapshotMeta, SnapshotPayload};
use super::InMemoryGraph;
pub(super) const PAYLOAD_FORMAT_VERSION: u32 = 1;
impl InMemoryGraph {
pub fn snapshot_payload(&self) -> SnapshotPayload {
SnapshotPayload {
next_node_id: self.next_node_id,
next_rel_id: self.next_rel_id,
nodes: self.iter_node_records().cloned().collect(),
relationships: self.iter_rel_records().cloned().collect(),
}
}
pub fn load_snapshot_payload(
&mut self,
payload: SnapshotPayload,
) -> Result<SnapshotMeta, SnapshotError> {
let meta = SnapshotMeta {
format_version: PAYLOAD_FORMAT_VERSION,
node_count: payload.nodes.len(),
relationship_count: payload.relationships.len(),
wal_lsn: None,
};
let mut rebuilt = Self {
next_node_id: payload.next_node_id,
next_rel_id: payload.next_rel_id,
..Self::default()
};
for node in payload.nodes {
let id = node.id;
let labels = node.labels.clone();
rebuilt.put_node(id, node);
for label in &labels {
rebuilt.insert_node_label_index(id, label);
}
}
for rel in payload.relationships {
rebuilt.attach_relationship(&rel);
let id = rel.id;
rebuilt.put_rel(id, rel);
}
rebuilt.rebuild_property_indexes();
rebuilt.recorder = self.recorder.take();
*self = rebuilt;
Ok(meta)
}
}