aboutsummaryrefslogtreecommitdiffstats
path: root/prototypes/connections/store-tree.c
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-25 11:57:33 +0100
committereunhhu <[email protected]>2026-09-25 11:57:33 +0100
commit08056bb65bb9d1cfa4ccb1cd0b9cb67554d560a3 (patch)
tree4955dd22c1a1602264c1502181dd2ebd20cbec0c /prototypes/connections/store-tree.c
parentefba82d75e4357c7e82b027b04a5ec9937f8443b (diff)
downloadpure-08056bb65bb9d1cfa4ccb1cd0b9cb67554d560a3.tar.gz
pure-08056bb65bb9d1cfa4ccb1cd0b9cb67554d560a3.zip
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.
Diffstat (limited to 'prototypes/connections/store-tree.c')
-rw-r--r--prototypes/connections/store-tree.c9
1 files changed, 9 insertions, 0 deletions
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;