pub struct SqliteEventStore { /* private fields */ }Expand description
EventStore 的 SQLite 具体实现。
Implementations§
Source§impl SqliteEventStore
impl SqliteEventStore
Sourcepub fn open(
db_path: impl Into<PathBuf>,
commit_mode: CommitMode,
) -> Result<Arc<Self>>
pub fn open( db_path: impl Into<PathBuf>, commit_mode: CommitMode, ) -> Result<Arc<Self>>
打开(或创建)数据库并初始化表结构与 PRAGMA。
Examples found in repository?
examples/01_runtime_with_persistence.rs (lines 18-21)
16async fn main() -> ForgeResult<()> {
17 // 1) 构造事件存储(SQLite WAL)
18 let store = SqliteEventStore::open(
19 "./data/persistence_demo.sqlite",
20 CommitMode::AsyncDurable { group_window_ms: 8 },
21 )?;
22
23 // 2) 配置持久化选项(定期快照)
24 let persist_opts = PersistOptions {
25 commit_mode: CommitMode::AsyncDurable { group_window_ms: 8 },
26 snapshot_every_n_events: 1000,
27 snapshot_every_bytes: 8 * 1024 * 1024,
28 snapshot_every_ms: 5 * 60 * 1000,
29 compression: true,
30 };
31
32 // 3) 注入持久化订阅者(由事件驱动持久化与快照)
33 let subscriber = Arc::new(SnapshotSubscriber::new(
34 store.clone(),
35 persist_opts.clone(),
36 "default_doc",
37 ));
38
39 let options =
40 EditorOptionsBuilder::new().add_event_handler(subscriber).build();
41
42 // 4) 从 XML schema 加载运行时(注意路径相对于工作目录,必要时调整为 "../../schema/main.xml")
43 let xml_path = "schema/main.xml";
44 let mut editor =
45 ForgeAsyncRuntime::from_xml_schema_path(xml_path, Some(options), None)
46 .await?;
47
48 // 5) 构造一个新增节点事务(dwgc)并分发
49 let doc = editor.doc();
50 let mut tr = editor.get_tr();
51 let schema = &tr.schema;
52 // 依赖 main.xml 中定义的 <node name="dwgc" ...>
53 let factory = schema.factory();
54 let dw_node = factory.create_tree("dwgc", None, None, vec![], None)?;
55 tr.add_node(doc.root_id().clone(), vec![dw_node])?;
56 editor.dispatch(tr).await?;
57 // 睡眠五秒,等待持久化与快照
58 tokio::time::sleep(std::time::Duration::from_secs(5)).await;
59 let state = editor.get_state();
60 println!("事务已分发并持久化,当前版本: {}", state.version);
61
62 // 如需导出/导入演示,请运行:
63 // cargo run -p moduforge-persistence --example export_doc
64 // cargo run -p moduforge-persistence --example export_zip
65 Ok(())
66}Trait Implementations§
Source§impl EventStore for SqliteEventStore
impl EventStore for SqliteEventStore
Source§fn append<'life0, 'async_trait>(
&'life0 self,
ev: PersistedEvent,
) -> Pin<Box<dyn Future<Output = Result<i64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn append<'life0, 'async_trait>(
&'life0 self,
ev: PersistedEvent,
) -> Pin<Box<dyn Future<Output = Result<i64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
以独立事务追加一条事件记录。
Source§fn append_batch<'life0, 'async_trait>(
&'life0 self,
evs: Vec<PersistedEvent>,
) -> Pin<Box<dyn Future<Output = Result<i64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn append_batch<'life0, 'async_trait>(
&'life0 self,
evs: Vec<PersistedEvent>,
) -> Pin<Box<dyn Future<Output = Result<i64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
在单事务内批量追加多条事件以提升吞吐。
Source§fn load_since<'life0, 'life1, 'async_trait>(
&'life0 self,
doc_id: &'life1 str,
from_lsn: i64,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<Vec<PersistedEvent>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn load_since<'life0, 'life1, 'async_trait>(
&'life0 self,
doc_id: &'life1 str,
from_lsn: i64,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<Vec<PersistedEvent>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
读取指定文档在 from_lsn 之后的有序事件流。
Source§fn latest_snapshot<'life0, 'life1, 'async_trait>(
&'life0 self,
doc_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Snapshot>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn latest_snapshot<'life0, 'life1, 'async_trait>(
&'life0 self,
doc_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Snapshot>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
返回该文档的最新快照(若存在)。
Auto Trait Implementations§
impl Freeze for SqliteEventStore
impl !RefUnwindSafe for SqliteEventStore
impl Send for SqliteEventStore
impl Sync for SqliteEventStore
impl Unpin for SqliteEventStore
impl !UnwindSafe for SqliteEventStore
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Message for T
impl<T> Message for T
Source§fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
Convert a BoxedMessage to this concrete type
Source§fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
Convert this message to a BoxedMessage