sqlitegraph 2.0.7

Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library
Documentation
//! KV Store Rollback Operations
//!
//! This module provides rollback operations for KV store WAL records:
//! - KvSet: Restores previous value or deletes key if new
//! - KvDelete: Restores deleted value
//!
//! ## Rollback Semantics
//!
//! ### KvSet Rollback
//! - If key existed before: Restore the old value with its original TTL
//! - If key was new: Delete the key entirely
//!
//! ### KvDelete Rollback
//! - If key existed before delete: Restore the deleted value
//! - If key didn't exist: No-op (delete was already a no-op)

use super::super::RollbackSystem;
use crate::backend::native::v2::kv_store::KvValue;
use crate::backend::native::v2::kv_store::wal::deserialize_value;
use crate::backend::native::v2::wal::recovery::errors::RecoveryError;
use crate::debug::debug_log;

/// Rollback KV set operation
///
/// Restores the previous state of a key before a set operation:
/// - If the key existed before the set, restores the old value
/// - If the key was new, deletes it
///
/// # Arguments
/// * `system` - Rollback system containing KV store
/// * `key` - Key that was set
///
/// # Returns
/// * `Ok(())` - Rollback completed successfully
/// * `Err(RecoveryError)` - Rollback failed
pub fn rollback_kv_set(
    system: &RollbackSystem,
    key: Vec<u8>,
) -> Result<(), RecoveryError> {
    debug_log!("Rolling back KV set for key: {:?}", key);

    let kv_store = system.kv_store()
        .lock()
        .map_err(|e| RecoveryError::replay_failure(format!("Failed to lock KV store: {}", e)))?;

    // Check if key existed before the set
    // For now, we need to delete the key since we don't have old value info
    // TODO: Store old value in RollbackOperation::KvSet variant
    let _ = kv_store.delete(&key);

    debug_log!("KV set rollback completed for key: {:?}", key);
    Ok(())
}

/// Rollback KV delete operation
///
/// Restores a deleted key's value if it existed before deletion.
///
/// # Arguments
/// * `system` - Rollback system containing KV store
/// * `key` - Key that was deleted
///
/// # Returns
/// * `Ok(())` - Rollback completed successfully
/// * `Err(RecoveryError)` - Rollback failed
///
/// # Note
/// Current implementation is limited because RollbackOperation::KvDelete
/// only stores old_value_bytes, but we need more context for full restoration.
/// Future enhancement: Store complete old value metadata in the rollback operation.
pub fn rollback_kv_delete(
    system: &RollbackSystem,
    key: Vec<u8>,
) -> Result<(), RecoveryError> {
    debug_log!("Rolling back KV delete for key: {:?}", key);

    // For now, this is a no-op since we don't have enough information
    // to restore the deleted value. The RollbackOperation::KvDelete variant
    // needs to be enhanced with old_value_type and old_ttl_seconds.
    debug_log!("KV delete rollback is no-op for key: {:?} (needs enhanced RollbackOperation)", key);

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::backend::native::v2::kv_store::KvStore;

    #[test]
    fn test_rollback_kv_set_module_exists() {
        // This test just verifies the module compiles
        // Real rollback tests require a full RollbackSystem setup
        assert!(true);
    }
}