linkrs-storage 0.1.0

Storage engine with CSR and memory-mapped containers
Documentation
use super::SyncWrapper;
use crate::StorageClient;
use linkrs_core::types::VertexId;
use linkrs_core::{Edge, EdgeDeleteKey, StorageError, Value};

impl<S: StorageClient + 'static> SyncWrapper<S> {
    pub(super) fn sync_insert_edge(
        &mut self,
        space: &str,
        edge: &Edge,
    ) -> Result<(), StorageError> {
        if !self.enabled {
            return Ok(());
        }

        let Some(sync_manager) = self.get_sync_manager() else {
            return Ok(());
        };

        let space_id = self.inner.get_space_id(space)?;
        let txn_id = self.get_current_txn_id();

        if let Some(txn_id) = txn_id {
            sync_manager
                .on_edge_insert(txn_id, space_id, edge)
                .map_err(|e| StorageError::db_error(format!("Failed to sync edge insert: {}", e)))
        } else {
            Err(StorageError::db_error(
                "Synchronized writes require an operation transaction context".to_string(),
            ))
        }
    }

    pub(super) fn sync_delete_edge(
        &mut self,
        space: &str,
        src: &VertexId,
        dst: &VertexId,
        edge_type: &str,
        ranking: i64,
    ) -> Result<(), StorageError> {
        if !self.enabled {
            return Ok(());
        }

        let Some(sync_manager) = self.get_sync_manager() else {
            return Ok(());
        };

        let space_id = self.inner.get_space_id(space)?;
        let txn_id = self.get_current_txn_id();
        let src_value = Value::from(*src);
        let dst_value = Value::from(*dst);

        if let Some(txn_id) = txn_id {
            sync_manager
                .on_edge_delete(txn_id, space_id, &src_value, &dst_value, edge_type, ranking)
                .map_err(|e| StorageError::db_error(format!("Failed to sync edge delete: {}", e)))
        } else {
            Err(StorageError::db_error(
                "Synchronized writes require an operation transaction context".to_string(),
            ))
        }
    }

    pub(super) fn sync_batch_insert_edges(
        &mut self,
        space: &str,
        edges: &[Edge],
    ) -> Result<(), StorageError> {
        if !self.enabled {
            return Ok(());
        }

        let Some(sync_manager) = self.get_sync_manager() else {
            return Ok(());
        };

        let space_id = self.inner.get_space_id(space)?;
        let txn_id = self.get_current_txn_id();

        for edge in edges {
            if let Some(txn_id) = txn_id {
                sync_manager
                    .on_edge_insert(txn_id, space_id, edge)
                    .map_err(|e| {
                        StorageError::db_error(format!("Failed to sync edge insert: {}", e))
                    })?;
            } else {
                return Err(StorageError::db_error(
                    "Synchronized writes require an operation transaction context".to_string(),
                ));
            }
        }

        Ok(())
    }

    pub(super) fn sync_batch_delete_edges(
        &mut self,
        space: &str,
        deletes: &[EdgeDeleteKey],
    ) -> Result<(), StorageError> {
        if !self.enabled {
            return Ok(());
        }

        let Some(sync_manager) = self.get_sync_manager() else {
            return Ok(());
        };

        let space_id = self.inner.get_space_id(space)?;
        let txn_id = self.get_current_txn_id();

        for key in deletes {
            if let Some(txn_id) = txn_id {
                let src_value = Value::from(key.src);
                let dst_value = Value::from(key.dst);
                sync_manager
                    .on_edge_delete(
                        txn_id,
                        space_id,
                        &src_value,
                        &dst_value,
                        &key.edge_type,
                        key.ranking,
                    )
                    .map_err(|e| {
                        StorageError::db_error(format!("Failed to sync edge delete: {}", e))
                    })?;
            } else {
                return Err(StorageError::db_error(
                    "Synchronized writes require an operation transaction context".to_string(),
                ));
            }
        }

        Ok(())
    }
}