Single-file page store. One writer, crash recovery from a write-ahead log.
Dependencies
import {
"Nanaloveyuki/vellum@0.2.0",
}import {
"Nanaloveyuki/vellum",
"moonbitlang/async",
}
pkgtype(kind: "executable")async fn main {
let db = @vellum.open("notes.db")
defer db.close()
let txn = db.begin()
txn.put(b"hello", b"vellum")
txn.commit()
db.close()
let again = @vellum.open("notes.db")
defer again.close()
let read = again.begin()
match read.get(b"hello") {
Some(value) => println(value.to_string())
None => println("missing")
}
read.abort()
again.close()
}| 错误 | 何时出现 |
|---|---|
| Closed | close 之后还用这个 Db 或它的 Txn |
| TxnOpen | 前一个事务没结束就 begin |
| TxnClosed | 继续使用已提交或已撤销的事务 |
| TxnBusy | 提交过程中对同一事务操作或关闭库 |
| RecoveryRequired | 提交 I/O 失败后继续操作;需要关闭并重新打开 |
| ValueTooLarge | value 超过 4000 字节,或这一页放不下 |
| Corrupt | 页文件头、页结构或完整 WAL 帧损坏;数据页本身没有 CRC |
| Io(String) | 读写失败。字符串是底层错误 |
moon run src/cmd/bench --target native --release| 512 键,约 2 MiB | 优化前 | 优化后 |
|---|---|---|
| 200 次读事务 | 10 | 1 |
| 3 次同值提交 | 75–80 | 0 |
| 4 次单键更新提交 | 104–108 | 2–3 |
moon fmt --check
moon check --target native --deny-warn
moon test --target native
moon test --target wasm-gc -p Nanaloveyuki/vellum
moon run src/cmd/main --target native --releasepub struct Db {
// private fields
}pub struct Txn {
// private fields
}Install
Download zipSingle-file page store. One writer, crash recovery from a write-ahead log.
Dependencies