From b3e9f3fa6692dacbfefe6e8892ffc48edefd854d Mon Sep 17 00:00:00 2001 From: AmuroEita <1071307515@qq.com> Date: Thu, 8 Oct 2026 12:39:40 +0800 Subject: [PATCH 1/2] feat: optimize released frontend builds --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f5a872..3183d48 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: 构建 - run: cmake -B build && cmake --build build + run: cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build - name: 构建 CLI(cli/ 独立 Cargo 项目,走 dispatch 前端 C ABI) run: | # CLI 用 #[link(name = "kvspace")] 链本仓刚构建的前端 → 把 build/ 交给链接器 From 2426a4e59b6de98184d9b9d7bf2c735c749bb157 Mon Sep 17 00:00:00 2001 From: AmuroEita <1071307515@qq.com> Date: Thu, 8 Oct 2026 18:05:37 +0800 Subject: [PATCH 2/2] feat: dispatch optional value writes by key reference --- include/kvspace/kvspace.h | 5 +++++ src/frontend.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/kvspace/kvspace.h b/include/kvspace/kvspace.h index cb9f070..ba98485 100644 --- a/include/kvspace/kvspace.h +++ b/include/kvspace/kvspace.h @@ -79,6 +79,11 @@ typedef struct { int kvspaceResolveRef(void *h, const char *key, kvspaceRef_t *ref); int kvspaceGetByRef(void *h, kvspaceRef_t *ref, const char *key_fallback, uint8_t **out, uint32_t *out_len); +/* Same semantics as SetValue. ref must belong to key; unsupported backends + * use SetValue. The reference stores an address, never a value snapshot. */ +int kvspaceSetValueByRef(void *h, kvspaceRef_t *ref, const char *key, + const uint8_t *value, uint32_t value_len, + uint8_t ro, uint32_t vid, char *err, uint32_t err_cap); int kvspaceSetPartByRef(void *h, kvspaceRef_t *ref, const char *key_fallback, uint32_t offset, const uint8_t *buf, uint32_t buf_len, char *err, uint32_t err_cap); diff --git a/src/frontend.c b/src/frontend.c index 88a5e6e..1c3fbea 100644 --- a/src/frontend.c +++ b/src/frontend.c @@ -55,6 +55,9 @@ typedef struct { int (*resolveref)(void *h, const char *key, kvspaceRef_t *ref); int (*getbyref)(void *h, kvspaceRef_t *ref, const char *key_fallback, uint8_t **out, uint32_t *out_len); + int (*setvaluebyref)(void *h, kvspaceRef_t *ref, const char *key, + const uint8_t *value, uint32_t value_len, + uint8_t ro, uint32_t vid, char *err, uint32_t err_cap); int (*setpartbyref)(void *h, kvspaceRef_t *ref, const char *key_fallback, uint32_t offset, const uint8_t *buf, uint32_t buf_len, char *err, uint32_t err_cap); @@ -186,6 +189,7 @@ void *kvspaceConnect(const char *dsn) { LOAD(watch, "kvspaceWatch"); #undef LOAD *(void **)&vt->resolveref = dlsym(dl, "kvspaceResolveRef"); + *(void **)&vt->setvaluebyref = dlsym(dl, "kvspaceSetValueByRef"); *(void **)&vt->getbyref = dlsym(dl, "kvspaceGetByRef"); *(void **)&vt->setpartbyref = dlsym(dl, "kvspaceSetPartByRef"); @@ -241,6 +245,17 @@ int kvspaceGetByRef(void *h, kvspaceRef_t *ref, const char *key_fallback, return x->vt->get(x->backend, key_fallback, 0, out, out_len); } +int kvspaceSetValueByRef(void *h, kvspaceRef_t *ref, const char *key, + const uint8_t *value, uint32_t value_len, + uint8_t ro, uint32_t vid, char *err, uint32_t err_cap) { + kvspace_handle *x = H(h); + if (x->vt->setvaluebyref) + return x->vt->setvaluebyref(x->backend, ref, key, value, value_len, + ro, vid, err, err_cap); + return x->vt->setvalue(x->backend, key, value, value_len, ro, vid, + err, err_cap); +} + int kvspaceSetPartByRef(void *h, kvspaceRef_t *ref, const char *key_fallback, uint32_t offset, const uint8_t *buf, uint32_t buf_len, char *err, uint32_t err_cap) {