nodedb 0.0.0-beta.1

Local-first, real-time, edge-to-cloud hybrid database for multi-modal workloads
Documentation
//! Blacklist catalog operations (redb persistence).

use super::types::{BLACKLIST, StoredBlacklistEntry, SystemCatalog, catalog_err};

impl SystemCatalog {
    /// Insert or update a blacklist entry.
    pub fn put_blacklist_entry(&self, entry: &StoredBlacklistEntry) -> crate::Result<()> {
        let bytes =
            rmp_serde::to_vec(entry).map_err(|e| catalog_err("serialize blacklist entry", e))?;
        let write_txn = self
            .db
            .begin_write()
            .map_err(|e| catalog_err("blacklist write txn", e))?;
        {
            let mut table = write_txn
                .open_table(BLACKLIST)
                .map_err(|e| catalog_err("open blacklist", e))?;
            table
                .insert(entry.key.as_str(), bytes.as_slice())
                .map_err(|e| catalog_err("insert blacklist entry", e))?;
        }
        write_txn
            .commit()
            .map_err(|e| catalog_err("blacklist commit", e))?;
        Ok(())
    }

    /// Remove a blacklist entry by key.
    pub fn delete_blacklist_entry(&self, key: &str) -> crate::Result<bool> {
        let write_txn = self
            .db
            .begin_write()
            .map_err(|e| catalog_err("blacklist write txn", e))?;
        let removed = {
            let mut table = write_txn
                .open_table(BLACKLIST)
                .map_err(|e| catalog_err("open blacklist", e))?;
            table
                .remove(key)
                .map_err(|e| catalog_err("remove blacklist entry", e))?
                .is_some()
        };
        write_txn
            .commit()
            .map_err(|e| catalog_err("blacklist commit", e))?;
        Ok(removed)
    }

    /// Load all blacklist entries.
    pub fn load_all_blacklist_entries(&self) -> crate::Result<Vec<StoredBlacklistEntry>> {
        let read_txn = self
            .db
            .begin_read()
            .map_err(|e| catalog_err("blacklist read txn", e))?;
        let table = read_txn
            .open_table(BLACKLIST)
            .map_err(|e| catalog_err("open blacklist", e))?;
        let mut entries = Vec::new();
        let range = table
            .range::<&str>(..)
            .map_err(|e| catalog_err("range blacklist", e))?;
        for item in range {
            let (_, value) = item.map_err(|e| catalog_err("read blacklist entry", e))?;
            if let Ok(entry) = rmp_serde::from_slice::<StoredBlacklistEntry>(value.value()) {
                entries.push(entry);
            }
        }
        Ok(entries)
    }
}