Nut
Port of Bolt DB in Rust
-
Compatible with Bolt's database format and provides similar api.
Since Nut supports same format as Bolt there are known issues:
- Bolt uses Memmap to operate, there is no LRU or other cache, so if database doesn't fit in memory, then it's end of game, Nut will inevitably crash.
- Data structures are written directly onto disk. No serialization takes place, so Nut doesn't understand db file from computer with different Endianness, for example.
-
Transaction based. In case of error transaction will be rolled back.
-
Multiple readers, single writer. Nut works just like Bolt: you can have one writer and multiple readers at a time, just be sure they run on different threads. Making writer and reader transaction in same thread will cause deadlock. Writer can write freely if memory map is have enough free pages, in other case it will be waiting for reading transactions to close.
Usage
Package available at crates.io: https://crates.io/crates/nut
Documentation available at https://docs.rs/nut/0.1.2/nut/
Usual way is to cargo build --release
in console. Docs available via cargo doc --no-deps --open
. Api is very similar to Bolt if you are familiar with it.
Examples
Create db and put something
use DBBuilder;
let mut db = new.build.unwrap;
let mut tx = db.begin_rw_tx.unwrap;
// due to RAII tx will be automatically closed if no error occured,
// or rolled back if there was some.
// Additionally you can commit or rollback manually
tx.rollback.unwrap;
Note: All buckets obtained from transaction should be dropped before calling either rollback
or commit
.
Getting data back
use DBBuilder;
let mut db = new.build.unwrap;
// creating read only transaction
// read only ransaction will be automatically rolled back
let mut tx = db.begin_tx.unwrap;
// getting bucket
let flowers = tx.bucket.unwrap;
let data = flowers.get.unwrap;
assert_eq!;
Getting available buckets
use DBBuilder;
let mut db = new.build.unwrap;
let mut tx = db.begin_tx.unwrap;
Nut Bin
Crate also provides nut
binary which is helpful to inspect database file in various ways. It can be found after cargo build --release
in ./target/release/nut
.
Excerpt from man:
)
)
Disclaimer
I'm not planning to actively mantain this project since it just a hobby project to check out Rust, and there are better alternatives in terms of performance.
MIT License