From 08056bb65bb9d1cfa4ccb1cd0b9cb67554d560a3 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Fri, 25 Sep 2026 11:57:33 +0100 Subject: Allow drafts without a stored base Runtime-owned values such as an app's text need the same extent tree as stored documents without a store file. pure_draft_new creates such a draft; it edits, lends versions and reclaims like any draft but refuses to commit. pure_draft_restore returns a held draft to an earlier version, so a failed event can abandon its edits. A test runs 4,000 random edits with a fifth abandoned against a flat oracle under ASan/UBSan. --- prototypes/connections/store-tree.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'prototypes/connections/store-tree.c') diff --git a/prototypes/connections/store-tree.c b/prototypes/connections/store-tree.c index 74763ca..414c8ce 100644 --- a/prototypes/connections/store-tree.c +++ b/prototypes/connections/store-tree.c @@ -987,6 +987,10 @@ PureResult pure_draft_open(const char *path, const char *key, PureDraft **out) { return PURE_OK; } +PureDraft *pure_draft_new(void) { + return calloc(1, sizeof(PureDraft)); /* no path: nothing mapped, nothing to commit */ +} + void pure_draft_close(PureDraft *draft) { if (!draft) return; release_tree(&draft->tree); @@ -1066,6 +1070,10 @@ PureResult pure_draft_read(const PureDraft *draft, size_t offset, size_t length, return pure_draft_read_version(draft, pure_draft_version(draft), offset, length, visit, context); } +void pure_draft_restore(PureDraft *draft, PureVersion version) { + draft->root = (Entry){version.ref, version.bytes}; +} + void pure_draft_hold(PureDraft *draft, bool held) { draft->held = held; if (!held) collect(draft); @@ -1073,6 +1081,7 @@ void pure_draft_hold(PureDraft *draft, bool held) { PureResult pure_draft_commit(PureDraft *draft, int64_t *revision) { *revision = draft->revision; + if (!draft->path) return PURE_INVALID; Session session; Writer *writer = NULL; Entry current, root = draft->root; -- cgit v1.2.3