3个版本 (破坏性)
0.3.0 | 2023年10月20日 |
---|---|
0.2.0 | 2023年9月14日 |
0.1.0 | 2023年5月31日 |
#1929 in 数据库接口
每月 159 次下载
在 14 个Crates中使用(通过 sov-db)
32KB
479 行
Schema DB
此包是一个将RocksDB从字节导向的键值存储转换为面向类型的存储的低级别包装器。它是从Aptos-Core中的类似包改编而来的。
Schema DB暴露的最重要概念是 Schema
,它将列族名称编解码器映射到键和值。
pub trait Schema {
/// The column family name associated with this struct.
/// Note: all schemas within the same SchemaDB must have distinct column family names.
const COLUMN_FAMILY_NAME: &'static str;
/// Type of the key.
type Key: KeyCodec<Self>;
/// Type of the value.
type Value: ValueCodec<Self>;
}
使用此模式,我们可以编写用于存储和检索类型数据的通用函数,并确保它们始终以我们期望的方式编码/解码。
impl SchemaDB {
pub fn put<S: Schema>(&self, key: &impl KeyCodec<S>, value: &impl ValueCodec<S>) -> Result<()> {
let key_bytes = key.encode_key()?;
let value_bytes = value.encode_value()?;
self.rocks_db_handle.put(S::COLUMN_FAMILY_NAME, key_bytes, value_bytes)
}
}
要实际存储和检索数据,我们只需要实现一个Schema
pub struct AccountBalanceSchema;
impl Schema for AccountBalanceSchema {
const COLUMN_FAMILY_NAME: &str = "account_balances";
type Key = Account;
type Value = u64;
}
impl KeyCodec<AccountBalanceSchema> for Account {
fn encode_key(&self) -> Vec<u8> {
bincode::to_vec(self)
}
fn decode_key(key: Vec<u8>) -> Self {
// elided
}
}
impl ValueCode<AccountBlanceSchema> for u64 {
// elided
}
依赖关系
~33MB
~567K SLoC