4.2 KiB
4.2 KiB
原子状态补丁模块
脚本入口: eve.StatePatch()
StatePatch 是以 (subject, key) 为地址的 JSON 值仓库。修改先写入 batch,再一次性
commit;任一操作无效或 expected value 冲突时整个批次不产生可见修改。它适合
权威玩法状态、编辑器事务和需要确定性快照的轻量事实表。
原子写入和冲突检测
local storeResult = eve.StatePatch().newStore();
if (!storeResult.ok) throw storeResult.status.summary;
local store = storeResult.value;
local batchResult = store.newBatch();
if (!batchResult.ok) throw batchResult.status.summary;
local batch = batchResult.value;
batch.set("actor:1", "rank", "3");
batch.set("actor:1", "alive", "true");
if (!store.commit(batch)) {
local r = batch.result();
for (local i = 0; i < r.errorCount(); ++i)
print(r.errorAt(i).getMessage() + "\n");
}
set 的值必须是完整 JSON 文本,字符串要写成 "\"mage\""。用
setExpected(subject, key, newJson, expectedJson) 或 removeExpected(...) 做乐观
并发控制;expected 不匹配时 commit 返回 false,仓库保持不变。
查询、同步和快照
local n = store.queryDirty();
for (local i = 0; i < n; ++i)
sendPatch(store.dirtySubjectAt(i), store.dirtyKeyAt(i));
store.clearDirty();
local snapshot = store.snapshotJson();
local copyResult = eve.StatePatch().newStore();
local restored = copyResult.value.restoreJson(snapshot);
if (!restored.ok) print(restored.status.summary + "\n");
restoreJson 先完整解析和校验,再替换可观察状态;失败不会留下部分恢复结果。
恢复成功会使旧 batch 句柄失效,恢复后必须重新调用 newBatch()。
API 快查
模块、Store 与 Batch
| API | 说明 |
|---|---|
getName() / newStore() |
返回模块名或创建模块拥有的 Store Result。 |
ownership() / ownerEpoch() / handle() / isStale() / release() |
查询拥有型 Store/Batch 的身份、世代和生命周期。 |
newBatch() |
创建当前 Store 拥有的空批次,返回 Result。 |
set(subject,key,json) / remove(subject,key) |
追加无条件操作,返回 Result。 |
setExpected(subject,key,json,expected) / removeExpected(subject,key,expected) |
追加带前置值检查的操作。 |
size() / clear() / result() |
查询/清空批次,或读取最近提交结果。 |
commit(batch) |
原子校验并提交;成功后 revision 至多推进一次。 |
has(subject,key) / get(subject,key) / valueRevision(subject,key) |
查询值和最后修改 revision。缺失值的 get 返回空串。 |
revision() |
当前仓库全局 revision。 |
querySubjects() / queryKeys(subject) / queryAt(i) |
以词典序建立查询结果并按索引读取。后一次 query 会覆盖前一次结果。 |
queryDirty() / dirtySubjectAt(i) / dirtyKeyAt(i) / clearDirty() |
枚举和确认脏键。 |
eventCount() / eventAt(i) / clearEvents() |
枚举和清空已提交的 change event。 |
snapshotJson() / restoreJson(json) |
导出确定性快照,或事务性恢复;恢复返回 Result。 |
Result、错误和事件
| API | 说明 |
|---|---|
isSuccess() / getChangedCount() |
最近 commit 是否成功以及实际变化数。 |
getRevisionBefore() / getRevisionAfter() |
commit 前后的全局 revision。 |
errorCount() / errorAt(i) |
枚举提交错误。 |
getOperationIndex() / getSubject() / getKey() |
错误对应的操作和地址。 |
getCode() / getMessage() |
稳定错误码和诊断文本。 |
getSequence() / getRevision() |
ChangeEvent 的单调序号与 commit revision。 |
getOldJson() / getNewJson() / isRemoved() |
变化前后 JSON,以及是否为删除。 |
生命周期与一致性
- Store 由 StatePatch 模块拥有;Batch 由 Store 拥有,二者都不是脚本自行删除的裸指针。
Effect等其他领域对象不会自动镜像到 Store;每个事实仍应只有一个权威 owner。queryAt、eventAt、result返回的对象只用于即时观察,不跨恢复、释放或下一次结构修改保存。- 快照包含 schema/version;只把
snapshotJson()产物交给restoreJson(),不要手工拼接持久化格式。