pub(crate) mod rocks_store;
use std::path::{Path, PathBuf};
use crate::graph::Graph;
use crate::transaction::operation::Operation;
use crate::types::DbError;
pub struct StorageManager {
_dir: PathBuf,
}
impl StorageManager {
pub fn open(dir: &Path) -> Result<(Self, Graph), DbError> {
let graph = Graph::open(dir)?;
Ok((Self { _dir: dir.to_path_buf() }, graph))
}
pub fn checkpoint(&self, graph: &Graph) -> Result<(), DbError> {
graph.store.flush()
}
pub fn commit_wal_only(
&self,
_txn_id: u64,
_ops: &[Operation],
_graph: &Graph,
) -> Result<(), DbError> {
Ok(())
}
}
pub(crate) fn apply_ops(graph: &mut Graph, ops: &[Operation]) -> Result<(), DbError> {
use crate::transaction::operation::{Operation::*, PropertyTarget};
for op in ops {
match op {
CreateNode { node } => {
graph.apply_insert_node(node.clone());
}
CreateEdge { edge } => {
graph.apply_insert_edge(edge.clone());
}
SetProperty { target, key, value } => match target {
PropertyTarget::Node(id) => {
graph.apply_set_node_property(*id, key.clone(), value.clone())?;
}
PropertyTarget::Edge(id) => {
graph.apply_set_edge_property(*id, key.clone(), value.clone())?;
}
},
RemoveProperty { target, key } => match target {
PropertyTarget::Node(id) => {
graph.apply_remove_node_property(*id, key)?;
}
PropertyTarget::Edge(id) => {
graph.apply_remove_edge_property(*id, key)?;
}
},
AddLabel { node_id, label } => {
graph.apply_add_label(*node_id, label.clone())?;
}
RemoveLabel { node_id, label } => {
graph.apply_remove_label(*node_id, label)?;
}
DeleteNode { node_id } => {
graph.apply_delete_node(*node_id)?;
}
DeleteNodeDetach { node_id } => {
graph.apply_delete_node_detach(*node_id)?;
}
DeleteEdge { edge_id } => {
graph.apply_delete_edge(*edge_id)?;
}
CreateIndex { label, property } => {
graph.apply_create_index(label, property);
}
DropIndex { label, property } => {
graph.apply_drop_index(label, property);
}
}
}
Ok(())
}