pub struct SqliteEventStore { /* private fields */ }Expand description
EventStore 的 SQLite 具体实现。
Implementations§
Source§impl SqliteEventStore
impl SqliteEventStore
Sourcepub async fn open(
db_path: impl Into<PathBuf>,
commit_mode: CommitMode,
) -> Result<Arc<Self>>
pub async 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 .await?;
23
24 // 2) 配置持久化选项(定期快照)
25 let persist_opts = PersistOptions {
26 commit_mode: CommitMode::AsyncDurable { group_window_ms: 8 },
27 snapshot_every_n_events: 1000,
28 snapshot_every_bytes: 8 * 1024 * 1024,
29 snapshot_every_ms: 5 * 60 * 1000,
30 compression: true,
31 };
32
33 // 3) 注入持久化订阅者(由事件驱动持久化与快照)
34 let subscriber = Arc::new(SnapshotSubscriber::new(
35 store.clone(),
36 persist_opts.clone(),
37 "default_doc",
38 ));
39
40 let options =
41 EditorOptionsBuilder::new().add_event_handler(subscriber).build();
42
43 // 4) 从 XML schema 加载运行时(注意路径相对于工作目录,必要时调整为 "../../schema/main.xml")
44 let xml_path = "schema/main.xml";
45 let mut editor =
46 ForgeAsyncRuntime::from_xml_schema_path(xml_path, Some(options), None)
47 .await?;
48
49 // 5) 构造一个新增节点事务(dwgc)并分发
50 let doc = editor.doc();
51 let mut tr = editor.get_tr();
52 let schema = &tr.schema;
53 // 依赖 main.xml 中定义的 <node name="dwgc" ...>
54 let factory = schema.factory();
55 let dw_node = factory.create_tree("dwgc", None, None, vec![], None)?;
56 tr.add_node(doc.root_id().clone(), vec![dw_node])?;
57 editor.dispatch(tr).await?;
58 // 睡眠五秒,等待持久化与快照
59 tokio::time::sleep(std::time::Duration::from_secs(5)).await;
60 let state = editor.get_state();
61 println!("事务已分发并持久化,当前版本: {}", state.version);
62
63 // 如需导出/导入演示,请运行:
64 // cargo run -p moduforge-persistence --example export_doc
65 // cargo run -p moduforge-persistence --example export_zip
66 Ok(())
67}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 !RefUnwindSafe for SqliteEventStore
impl !UnwindSafe for SqliteEventStore
impl Freeze for SqliteEventStore
impl Send for SqliteEventStore
impl Sync for SqliteEventStore
impl Unpin for SqliteEventStore
impl UnsafeUnpin 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
impl<T> ErasedDestructor for Twhere
T: 'static,
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