mod async_sled_backend;
mod cache;
mod pooled_backend;
mod serialization;
mod sled_backend;
pub use async_sled_backend::AsyncSledBackend;
pub use cache::{CacheStats, StorageCache};
pub use pooled_backend::{PoolConfig, PoolMetrics, PoolMetricsSnapshot, PooledAsyncBackend};
pub use serialization::{SerializationFormat, Serializer};
pub use sled_backend::SledBackend;
use crate::error::Result;
use crate::types::{Edge, EdgeId, Node, NodeId, SessionId};
use async_trait::async_trait;
pub trait StorageBackend: Send + Sync {
fn store_node(&self, node: &Node) -> Result<()>;
fn get_node(&self, id: &NodeId) -> Result<Option<Node>>;
fn delete_node(&self, id: &NodeId) -> Result<()>;
fn store_edge(&self, edge: &Edge) -> Result<()>;
fn get_edge(&self, id: &EdgeId) -> Result<Option<Edge>>;
fn delete_edge(&self, id: &EdgeId) -> Result<()>;
fn get_session_nodes(&self, session_id: &SessionId) -> Result<Vec<Node>>;
fn get_outgoing_edges(&self, node_id: &NodeId) -> Result<Vec<Edge>>;
fn get_incoming_edges(&self, node_id: &NodeId) -> Result<Vec<Edge>>;
fn flush(&self) -> Result<()>;
fn stats(&self) -> Result<StorageStats>;
}
#[derive(Debug, Clone)]
pub struct StorageStats {
pub node_count: u64,
pub edge_count: u64,
pub storage_bytes: u64,
pub session_count: u64,
}
#[async_trait]
pub trait AsyncStorageBackend: Send + Sync {
async fn store_node(&self, node: &Node) -> Result<()>;
async fn get_node(&self, id: &NodeId) -> Result<Option<Node>>;
async fn delete_node(&self, id: &NodeId) -> Result<()>;
async fn store_edge(&self, edge: &Edge) -> Result<()>;
async fn get_edge(&self, id: &EdgeId) -> Result<Option<Edge>>;
async fn delete_edge(&self, id: &EdgeId) -> Result<()>;
async fn get_session_nodes(&self, session_id: &SessionId) -> Result<Vec<Node>>;
async fn get_outgoing_edges(&self, node_id: &NodeId) -> Result<Vec<Edge>>;
async fn get_incoming_edges(&self, node_id: &NodeId) -> Result<Vec<Edge>>;
async fn flush(&self) -> Result<()>;
async fn stats(&self) -> Result<StorageStats>;
async fn store_nodes_batch(&self, nodes: &[Node]) -> Result<Vec<NodeId>> {
let mut ids = Vec::with_capacity(nodes.len());
for node in nodes {
self.store_node(node).await?;
ids.push(node.id());
}
Ok(ids)
}
async fn store_edges_batch(&self, edges: &[Edge]) -> Result<Vec<EdgeId>> {
let mut ids = Vec::with_capacity(edges.len());
for edge in edges {
self.store_edge(edge).await?;
ids.push(edge.id);
}
Ok(ids)
}
fn get_session_nodes_stream(
&self,
session_id: &SessionId,
) -> std::pin::Pin<Box<dyn futures::stream::Stream<Item = Result<Node>> + Send + '_>> {
let session_id = *session_id;
Box::pin(async_stream::stream! {
match self.get_session_nodes(&session_id).await {
Ok(nodes) => {
for node in nodes {
yield Ok(node);
}
}
Err(e) => yield Err(e),
}
})
}
async fn count_session_nodes(&self, session_id: &SessionId) -> Result<usize> {
let nodes = self.get_session_nodes(session_id).await?;
Ok(nodes.len())
}
}