<p align="center">
<img src="docs/grumpy-logo.png" alt="GrumpyDB logo" width="200">
</p>
# GrumpyDB
A disk-based object storage engine written in Rust. GrumpyDB stores schema-less documents (JSON-like) with B+Tree indexing, page-based storage, WAL for durability, and SWMR concurrency.
## Features
| Page-based storage (8 KiB pages, slotted layout, overflow) | β
Implemented |
| B+Tree index (search, insert, delete, range scan) | β
Implemented |
| Document model (JSON-like Value type, binary codec) | β
Implemented |
| Storage engine (CRUD API) | β
Implemented |
| Write-Ahead Log (crash recovery) | π² Phase 5 |
| Buffer pool (LRU cache) | π² Phase 6 |
| SWMR concurrency | π² Phase 7 |
## Getting started
### Prerequisites
- Rust (edition 2024)
### Build
```bash
cargo build
```
### Test
```bash
cargo test
```
### Lint
```bash
cargo clippy -- -D warnings
```
## Usage
```rust
use grumpydb::{GrumpyDb, Value};
use uuid::Uuid;
use std::collections::BTreeMap;
let mut db = GrumpyDb::open(std::path::Path::new("./my_database")).unwrap();
let key = Uuid::new_v4();
let value = Value::Object(BTreeMap::from([
("name".into(), Value::String("GrumpyDB".into())),
("version".into(), Value::Integer(1)),
]));
db.insert(key, value).unwrap();
let doc = db.get(&key).unwrap();
assert!(doc.is_some());
db.close().unwrap();
```
> **Note**: The full CRUD API (`insert`, `get`, `update`, `delete`, `scan`) is now wired and functional. WAL durability is coming in Phase 5.
## Architecture
```
ββββββββββββββββββββββββββββββββββββββββ
β API publique (lib.rs) β
ββββββββββββββββββββββββββββββββββββββββ€
β Engine (engine.rs) β
ββββββββββββββ¬ββββββββββββββ¬ββββββββββββ€
β Document β Concurrencyβ Buffer β
β Model β (SWMR) β Pool β
ββββββββββββββΌββββββββββββββΌββββββββββββ€
β B+Tree β WAL β Page β
β Index β β Manager β
β (index.db) β (wal.log) β (data.db) β
ββββββββββββββ΄ββββββββββββββ΄ββββββββββββ
```
Voir [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) pour les dΓ©tails techniques.
## Project structure
```
src/
βββ lib.rs # Public API, re-exports
βββ error.rs # GrumpyError, Result type
βββ engine.rs # GrumpyDb β CRUD orchestrator
βββ page/ # 8 KiB page management
β βββ mod.rs # Constants, PageHeader, PageType
β βββ manager.rs # PageManager (I/O, free-list)
β βββ slotted.rs # SlottedPage (variable-length tuples)
β βββ overflow.rs # Overflow page chains
βββ btree/ # B+Tree index
β βββ mod.rs # BTree struct, metadata
β βββ node.rs # InternalNode, LeafNode
β βββ ops.rs # search, insert, delete
β βββ cursor.rs # BTreeCursor, range scans
βββ document/ # Document model
β βββ mod.rs # Document struct
β βββ value.rs # Value enum (JSON-like)
β βββ codec.rs # Binary encode/decode
βββ wal/ # Write-Ahead Log (Phase 5)
βββ buffer/ # Buffer pool LRU (Phase 6)
βββ concurrency/ # SWMR locks (Phase 7)
```
## License
MIT