Pearl
=====
[![Build Status](https://travis-ci.org/qoollo/pearl.svg?branch=master)](https://travis-ci.org/qoollo/pearl)
[![Crate Status](https://img.shields.io/crates/v/pearl.svg)](https://crates.io/crates/pearl)
[![Docs Status](https://docs.rs/pearl/badge.svg)](https://docs.rs/crate/pearl)


Append only key-value blob storage on disk

* [documentation](https://qoollo.github.io/pearl/pearl/index.html)

Table of Contents
=================

* [Overview](#overview)
    * [Storage scheme](#storage-scheme)
    * [Blob](#blob)
        * [Header](#header)
    * [Record](#record)
        * [Header](#header)
    * [Index](#index)
        * [Header](#header)
* [Rust Version](#rust-version)

# Overview
## Storage scheme
![pearl storage scheme](pearl_storage_scheme.svg)

## Blob
### Header

Structure:
```rust
struct Header {
    magic_byte: u64,
    version: u32,
    flags: u64,
}
```
Description

| Field       | Size, B | Description |
| ----------- | :----:  | :----------- |
|magic_byte   | 8       | marks `pearl` blob
|version      | any     | used to check compatibility
|flags        | 1       | additional file props

## Record
### Header

Structure:
```rust
pub struct Header {
    magic_byte: u64,
    key: Vec<u8>,
    meta_size: u64,
    data_size: u64,
    flags: u8,
    blob_offset: u64,
    created: u64,
    data_checksum: u32,
    header_checksum: u32,
}
```
Description

| Field          | Size, B | Description |
| -------------- | :----:  | :----------- |
|magic_byte      | 8       | separates records in blob
|key             | (any)   | key for record location and searching
|meta_size       | 8       | meta length
|data_size       | 8       | data length (without header)
|flags           | 1       | additional record metadata
|blob_offset     | 8       | record offset from blob start
|created         | 8       | created timestamp
|data_checksum   | 4       | data crc32 checksum (without header)
|header_checksum | 4       | header crc32 checksum (only record header)

# Rust Version
`pearl` works on stable rust and above
```
$ rustup update
$ cargo build
```
