diff options
Diffstat (limited to 'examples/write.c')
-rw-r--r-- | examples/write.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/examples/write.c b/examples/write.c new file mode 100644 index 0000000..456fb8e --- /dev/null +++ b/examples/write.c @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include <hkvs.h> +#include <string.h> +#include <stdio.h> +#include <fcntl.h> + +int main(int argc, char **argv) { + argc--; + argv++; + if(argc % 2 != 0) { + return 1; + } + + (void)argc; + (void)argv; + + int dfd = open("dbdir", O_RDONLY | O_DIRECTORY | O_CLOEXEC); + if(dfd < 0) { + fprintf(stderr, "Failed to open dbdir: %s\n", strerror(errno)); + return 1; + } + + hkvs_io *io = hkvs_io_new_unsafe_dirfd(dfd); + if(!io) { + fprintf(stderr, "Failed to create hkvs_io\n"); + return 1; + } + + hkvs *c; + int r = hkvs_new(&c, io); + if(r < 0) { + fprintf(stderr, "Failed to open database: %s\n", strerror(-r)); + return 1; + } + + hkvs_table *t; + r = hkvs_table_create(c, &t, 42, 4, 1); + if(r < 0) { + fprintf(stderr, "Failed to open table: %s\n", strerror(-r)); + return 1; + } + if(r) { + printf("Created table\n"); + } + + while(argc) { + const char *key = *argv++; + const char *val = *argv++; + argc -= 2; + if(strlen(key) != 4) { + fprintf(stderr, "Bad arg length\n"); + return 1; + } + + hkvs_rid id = hkvs_record_find(c, t, key); + if(hkvs_rid_ok(id)) { + char *cur_val; + size_t cur_len; + r = hkvs_record_value(c, t, id, &cur_val, &cur_len); + if(r < 0) { + fprintf(stderr, "Failed to get record value: %s\n", strerror(-r)); + return 1; + } + printf("%s: id=%llu [%zu] %.*s\n", key, (unsigned long long)id.id, cur_len, (int)cur_len, (const char*)cur_val); + } else { + printf("%s: not found\n", key); + } + + if(!!strcmp(val, "-")) { + r = hkvs_record_update(c, t, &id, key, val, strlen(val)); + if(r < 0) { + fprintf(stderr, "Failed to update record: %s\n", strerror(-r)); + return 1; + } + printf("%s: wrote id=%llu\n", key, (unsigned long long)id.id); + } else if(hkvs_rid_ok(id)) { + hkvs_record_delete(c, t, id); + printf("%s: deleted\n", key); + } + } + + hkvs_free(c); +} |