use std::sync::Arc;
use mf_core::{EditorOptionsBuilder, ForgeAsyncRuntime, ForgeResult};
use mf_persistence::api::{CommitMode, PersistOptions};
use mf_persistence::subscriber::SnapshotSubscriber;
use mf_persistence::sqlite::SqliteEventStore;
#[tokio::main]
async fn main() -> ForgeResult<()> {
let store = SqliteEventStore::open(
"./data/persistence_demo.sqlite",
CommitMode::AsyncDurable { group_window_ms: 8 },
)?;
let persist_opts = PersistOptions {
commit_mode: CommitMode::AsyncDurable { group_window_ms: 8 },
snapshot_every_n_events: 1000,
snapshot_every_bytes: 8 * 1024 * 1024,
snapshot_every_ms: 5 * 60 * 1000,
compression: true,
};
let subscriber = Arc::new(SnapshotSubscriber::new(
store.clone(),
persist_opts.clone(),
"default_doc",
));
let options =
EditorOptionsBuilder::new().add_event_handler(subscriber).build();
let xml_path = "schema/main.xml";
let mut editor =
ForgeAsyncRuntime::from_xml_schema_path(xml_path, Some(options), None)
.await?;
let doc = editor.doc();
let mut tr = editor.get_tr();
let schema = &tr.schema;
let factory = schema.factory();
let dw_node = factory.create_tree("dwgc", None, None, vec![], None)?;
tr.add_node(doc.root_id().clone(), vec![dw_node])?;
editor.dispatch(tr).await?;
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
let state = editor.get_state();
println!("事务已分发并持久化,当前版本: {}", state.version);
Ok(())
}