Crate cdb64

Source
Expand description

§cdb64

cdb64 is a Rust implementation of D. J. Bernstein’s cdb (constant database) format, specifically designed to handle large database files efficiently using 64-bit hash values and offsets.

This library provides CdbWriter for creating cdb files and Cdb for reading existing cdb files. It also includes CdbIterator for iterating over all key-value pairs within a database.

§Features

  • CDB file creation (CdbWriter)
  • CDB file reading and key lookups (Cdb)
  • Database iteration (CdbIterator)
  • Support for custom hash functions (defaults to CDB hash)

§Usage Examples

§Creating and Reading a CDB File

use cdb64::{CdbWriter, Cdb, Error, CdbHash};
use tempfile::NamedTempFile;
use std::fs::File;

fn main() -> Result<(), Error> {
    let temp_file = NamedTempFile::new().expect("Failed to create temp file");
    let path = temp_file.path();

    // Create a CDB file
    let mut writer = CdbWriter::<File, CdbHash>::create(path)?;
    writer.put(b"hello", b"world")?;
    writer.put(b"rust", b"is awesome")?;
    writer.finalize()?; // After finalize, writer can still be used (but put is blocked by is_finalized)

    // Open the CDB file
    let cdb = Cdb::<File, CdbHash>::open(path)?;

    // Retrieve a value by key
    if let Some(value) = cdb.get(b"hello")? {
        println!("Found value: {}", String::from_utf8_lossy(&value));
    }

    // Search for a non-existent key
    assert!(cdb.get(b"nonexistent")?.is_none());

    Ok(())
}

§Using the Iterator

use cdb64::{CdbWriter, Cdb, CdbIterator, Error, CdbHash};
use tempfile::NamedTempFile;
use std::collections::HashMap;
use std::fs::File;

fn main() -> Result<(), Error> {
    let temp_file = NamedTempFile::new().expect("Failed to create temp file");
    let path = temp_file.path();

    let mut data = HashMap::new();
    data.insert(b"key1".to_vec(), b"value1".to_vec());
    data.insert(b"key2".to_vec(), b"value2".to_vec());

    let mut writer = CdbWriter::<File, CdbHash>::create(path)?;
    for (k, v) in &data {
        writer.put(k, v)?;
    }
    writer.finalize()?;

    let cdb: Cdb<_, CdbHash> = Cdb::open(path)?;
    let iter = cdb.iter();

    let mut retrieved_count = 0;
    for result in iter {
        let (key, value) = result?;
        println!("Key: {}, Value: {}",
            String::from_utf8_lossy(&key),
            String::from_utf8_lossy(&value)
        );
        assert_eq!(data.get(&key).unwrap(), &value);
        retrieved_count += 1;
    }
    assert_eq!(retrieved_count, data.len());

    Ok(())
}

Structs§

Cdb
Represents an open CDB database. It can only be used for reads.
CdbHash
Implements the CDB hash function.
CdbIterator
Represents a sequential iterator over a CDB database.
CdbWriter

Enums§

Error

Traits§

ReaderAt
A trait for objects that can be read from at a specific offset.