#serialization #database #storage #break #content-addressable #derive #casserole

casserole-derive

将值断开并序列化到内容寻址存储

2个不稳定版本

0.2.0 2021年8月4日
0.1.0 2021年7月20日

#28 in #内容寻址

Download history 121/week @ 2024-03-31 72/week @ 2024-04-07 49/week @ 2024-04-14 115/week @ 2024-04-21 162/week @ 2024-04-28 88/week @ 2024-05-05 88/week @ 2024-05-12 204/week @ 2024-05-19 48/week @ 2024-05-26 114/week @ 2024-06-02 51/week @ 2024-06-09 38/week @ 2024-06-16 99/week @ 2024-06-23 51/week @ 2024-06-30 60/week @ 2024-07-07 114/week @ 2024-07-14

每月328次下载
用于 casserole

MIT/Apache

25KB
564

casserole 包提供自定义 derive 和一个 trait 来执行 Rust 类型到存储的分解序列化和反序列化。

最常见的用例是将大对象分解以存储在内容寻址存储中,例如 Git 数据库。因此得名 'CAS-ser-role'。

Casserole 自动 derive 的 trait 生成包含键引用而不是原始数据的较小类型。例如,HashMap<String, BigValue> 被替换为 HashMap<String, S::Key>,其中 S 是用户提供的存储引擎的类型参数。此外,带有 store 属性的字段,例如 #[casserole(store)],也替换为 S::Key

例如

/// Example Tree to be stored in the database
#[derive(Casserole)]
struct Node {
    header: String,

    // Tells that 'map' is replaced by a database key in the type returned from
    // the 'casserole' trait method. The 'decasserole' trait method will do the
    // reverse, restoring it from the database.
    #[casserole(store)]
    map: BTreeMap<String, Node>,
}

基本使用演示(给定 big_value 作为要处理的大值)

// Create a our serde-ready type for the root. `stored_root` is our unique
// representation for `big_value`, but it is very small, like a Git hash.
let stored_root = big_value.casserole(&mut store).unwrap();

// <...do other stuff...>

// Restore the origin value from the database
let restored_big_value = Casserole::decasserole(&stored, &mut store).unwrap();
assert_eq!(restored_big_value, big_value);

依赖关系

~1.5MB
~36K SLoC