Rust分布式应用数据存储库holochain_state的使用:高效管理Holochain生态链状态与持久化数据
Rust分布式应用数据存储库holochain_state的使用:高效管理Holochain生态链状态与持久化数据
holochain_state crate提供了与holochain_sqlite crate协同工作的辅助工具和抽象层。
读取操作
创建数据读取查询的主要抽象是Query
trait。这个trait可以用于简化复杂查询的构建。
source_chain
模块提供了SourceChain
类型,这是用于处理操作链的抽象层。
host_fn_workspace
模块提供了在工作流期间读取数据的抽象。
写入操作
mutations
模块是用于将数据写入sqlite的完整函数集。
内存操作
scratch
模块提供了Scratch
类型,用于读取和写入内存中不可见的数据。
SourceChain类型使用Scratch进行内存操作,这些操作可以刷新到数据库。
Query trait允许将任意数据库SQL查询与暂存空间结合,因此读取可以跨越数据库和内存数据。
完整示例代码
use holochain_state::{prelude::*, source_chain::SourceChain};
// 示例1: 使用Query trait进行复杂查询
struct MyQuery;
impl Query for MyQuery {
type Output = Vec<ActionHash>;
fn query(&self, db: &DbRead) -> StateQueryResult<Self::Output> {
// 实现自定义查询逻辑
Ok(vec![])
}
}
// 示例2: 使用SourceChain管理链状态
async fn manage_source_chain() -> StateMutationResult<()> {
let env = holochain_state::test_utils::test_environments();
let db = env.guard();
let mut source_chain = SourceChain::new(db.clone())?;
// 添加新操作到链中
let action_hash = source_chain.put_action(Action::Dna(DnaDef::default()))?;
// 从链中读取操作
let action = source_chain.get_action(&action_hash)?;
Ok(())
}
// 示例3: 使用Scratch进行内存操作
async fn use_scratch() -> StateMutationResult<()> {
let env = holochain_state::test_utils::test_environments();
let db = env.guard();
let scratch = Scratch::new();
// 在scratch中写入数据
scratch.insert_hash("key".into(), "value".into());
// 从scratch读取数据
let value = scratch.get_hash("key")?;
// 将scratch数据写入数据库
scratch.flush(&db)?;
Ok(())
}
扩展完整示例
以下是一个结合了所有主要功能的完整示例:
use holochain_state::{
prelude::*,
source_chain::SourceChain,
scratch::Scratch,
mutations,
};
// 自定义查询结构体
struct RecentActionsQuery {
limit: usize,
}
impl Query for RecentActionsQuery {
type Output = Vec<Action>;
fn query(&self, db: &DbRead) -> StateQueryResult<Self::Output> {
// 查询最近的操作
let actions = db.prepare("SELECT * FROM Action ORDER BY timestamp DESC LIMIT ?")?
.query_map([self.limit], |row| {
Ok(Action::from_row(row)?)
})?
.collect::<Result<Vec<_>, _>>()?;
Ok(actions)
}
}
async fn comprehensive_example() -> StateMutationResult<()> {
// 初始化测试环境
let env = holochain_state::test_utils::test_environments();
let db = env.guard();
// 1. 使用SourceChain管理链状态
let mut source_chain = SourceChain::new(db.clone())?;
let scratch = Scratch::new();
// 2. 添加操作到链中
let action1 = Action::Dna(DnaDef::default());
let hash1 = source_chain.put_action(action1.clone())?;
// 3. 使用scratch进行内存操作
scratch.insert_hash(hash1.clone(), "metadata1".into());
// 4. 查询操作
let recent_actions = RecentActionsQuery { limit: 10 }.query(&db)?;
// 5. 将scratch数据写入数据库
scratch.flush(&db)?;
// 6. 使用mutations进行直接写入
mutations::insert_action(&db, Action::Dna(DnaDef::default()))?;
Ok(())
}
#[tokio::main]
async fn main() {
comprehensive_example().await.expect("示例运行失败");
}
许可证
CAL-1.0许可证
版权所有 © 2019 - 2024, Holochain Foundation
本程序是自由软件:您可以在LICENSE文件(CAL-1.0)提供的许可条款下重新分发和/或修改它。本程序分发时希望它会有用,但没有任何担保;甚至没有适销性或特定用途适用性的暗示担保。
1 回复