aboutsummaryrefslogtreecommitdiff
path: root/lib/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/util.c')
-rw-r--r--lib/util.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/util.c b/lib/util.c
new file mode 100644
index 0000000..560671c
--- /dev/null
+++ b/lib/util.c
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+
+#include "impl.h"
+
+int hkvs_record_set(hkvs *c, hkvs_table *t, hkvs_rid rid, const char *value, size_t size) {
+ char *ptr;
+ int r = hkvs_record_resize(c, t, rid, &ptr, size, 0);
+ if(r < 0) return r;
+ memcpy(ptr, value, size);
+ hkvs_put_records(c);
+ return 0;
+}
+
+int hkvs_record_update(hkvs *c, hkvs_table *t, hkvs_rid *prid, const char *key, const char *value, size_t size) {
+ hkvs_rid rid = hkvs_record_find(c, t, key);
+ if(hkvs_rid_ok(rid)) {
+ int r = hkvs_record_set(c, t, rid, value, size);
+ if(r < 0) return 0;
+ *prid = rid;
+ return 0;
+ } else {
+ char *ptr;
+ int r = hkvs_record_append(c, t, &rid, key, &ptr, size);
+ if(r < 0) return r;
+ memcpy(ptr, value, size);
+ hkvs_put_records(c);
+ *prid = rid;
+ return 1;
+ }
+}