aboutsummaryrefslogtreecommitdiff
path: root/examples/write.c
blob: 456fb8ecbe64dc03ee064bfaa267442357b50b8f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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);
}