3个版本 (破坏性)

0.3.0 2023年10月20日
0.2.0 2023年9月14日
0.1.0 2023年5月31日

#1929 in 数据库接口

Download history 37/week @ 2024-04-14 43/week @ 2024-04-21 44/week @ 2024-04-28 34/week @ 2024-05-05 38/week @ 2024-05-12 35/week @ 2024-05-19 47/week @ 2024-05-26 30/week @ 2024-06-02 23/week @ 2024-06-09 32/week @ 2024-06-16 38/week @ 2024-06-23 9/week @ 2024-06-30 18/week @ 2024-07-07 46/week @ 2024-07-14 32/week @ 2024-07-21 63/week @ 2024-07-28

每月 159 次下载
14 个Crates中使用(通过 sov-db

Apache-2.0

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