[][src]Crate acid_store

acid-store is a library for secure, deduplicated, transactional, and verifiable data storage.

This crate provides high-level abstractions for data storage over a number of storage backends. Storage backends are easy to implement, and this library builds on top of them to provide the following features:

  • Content-defined block-level deduplication
  • Transparent encryption
  • Transparent compression
  • Integrity checking of data and metadata
  • Atomicity, consistency, isolation, and durability (ACID)

This library currently provides the following abstractions for data storage:

  • ObjectRepository is an object store which maps keys to binary blobs.
  • FileRepository is a file archive like ZIP or TAR which can store files from the file system.
  • ValueRepository is a persistent, heterogeneous, map-like collection.
  • VersionRepository is an object store with support for versioning.

A repository stores its data in a DataStore, which is a small trait that can be implemented to create new storage backends. The following data stores are provided out of the box:

  • DirectoryStore stores data in a directory in the local file system.
  • SqliteStore stores data in a SQLite database.
  • RedisStore stores data on a Redis server.
  • S3Store stores data in an Amazon S3 bucket.
  • MemoryStore stores data in memory.

The function init is used to initialize the environment and should be called before any other functions in this crate.

Examples

use std::io::{Read, Seek, Write, SeekFrom};
use acid_store::store::{MemoryStore, Open, OpenOption};
use acid_store::repo::{ObjectRepository, RepositoryConfig};
use acid_store::init;

fn main() -> acid_store::Result<()> {
    // Initialize the environment for this crate.
    init();

    // Create a repository with the default configuration that stores data in memory.
    let mut repository = ObjectRepository::create_repo(
        MemoryStore::new(),
        RepositoryConfig::default(),
        None
    )?;

    // Insert a key into the repository and get an object which can be used to read/write data.
    let mut object = repository.insert(String::from("Key"));

    // Write data to the repository via `std::io::Write`.
    object.write_all(b"Data")?;
    object.flush();

    // Read data from the repository via `std::io::Read`.
    object.seek(SeekFrom::Start(0))?;
    let mut data = Vec::new();
    object.read_to_end(&mut data)?;

    assert_eq!(data, b"Data");

    // Commit changes to the repository.
    drop(object);
    repository.commit()?;

    Ok(())
}

Features

Some functionality is gated behind cargo features:

TypeCargo Feature
FileRepositoryrepo-file
ValueRepositoryrepo-value
VersionRepositoryrepo-version
DirectoryStorestore-directory
SqliteStorestore-sqlite
RedisStorestore-redis
S3Storestore-s3

To use one of these types, you must enable the corresponding feature in your Cargo.toml.

Re-exports

pub use uuid;

Modules

repo

High-level abstractions for data storage.

store

Low-level backends for data storage.

Enums

Error

The error type for operations with a repository.

Functions

init

Initialize the environment for this crate.

Type Definitions

Result

The result type for operations with a repository.