libqaeda

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | README | LICENSE

commit 00aee106279ae3d7461361f70576e44e551f0634
parent 7ad7b4d02b6dde9542d3707bdffb15a16b61b34f
Author: lash <dev@holbrook.no>
Date:   Wed,  7 May 2025 08:59:59 +0100

Add query getters for key and value

Diffstat:
Msrc/lq/query.h | 6++++++
Msrc/store/file.c | 41+++++++++++++++++++++++++++++++++++------
Msrc/test/Makefile | 4++--
Msrc/test/test_query.c | 16++++++++++++++--
4 files changed, 57 insertions(+), 10 deletions(-)

diff --git a/src/lq/query.h b/src/lq/query.h @@ -16,12 +16,18 @@ struct lq_query_t { char **files; size_t files_len; size_t files_cur; + char *key; + size_t key_len; char *value; size_t value_len; }; LQQuery* lq_query_new(enum payload_e typ, LQStore *store, const char *key, size_t key_len); int lq_query_next(LQQuery *query); +char* lq_query_get_key(LQQuery *query); +int lq_query_get_key_len(LQQuery *query); +char* lq_query_get_val(LQQuery *query); +int lq_query_get_val_len(LQQuery *query); void lq_query_free(LQQuery *query); #endif // LIBQAEDA_QUERY_H_ diff --git a/src/store/file.c b/src/store/file.c @@ -177,7 +177,7 @@ LQQuery* lq_query_new(enum payload_e typ, LQStore *store, const char *key, size_ return NULL; } query->value = lq_alloc(LQ_STORE_VAL_MAX); - query->value = lq_alloc(LQ_STORE_VAL_MAX); + query->key = lq_alloc(LQ_STORE_KEY_MAX); query->store = store; query->state = LQ_QUERY_READY; @@ -189,30 +189,58 @@ LQQuery* lq_query_new(enum payload_e typ, LQStore *store, const char *key, size_ int lq_query_next(LQQuery *query) { int r; char *p; - char b[LQ_STORE_KEY_MAX]; + //char b[LQ_STORE_KEY_MAX]; if (query->state & LQ_QUERY_EOF) { return ERR_EOF; } p = *(query->files + query->files_cur) + 1; - r = h2b(p, (char*)b); - if (r == 0) { + query->key_len = h2b(p, (char*)query->key); + if (query->key_len == 0) { query->state = LQ_QUERY_GONER; return ERR_ENCODING; } query->value_len = LQ_STORE_VAL_MAX; - r = query->store->get(query->typ, query->store, b, r, query->value, &query->value_len); + r = query->store->get(query->typ, query->store, query->key, query->key_len, query->value, &query->value_len); if (r != ERR_OK) { query->value_len = 0; query->state = LQ_QUERY_GONER; return ERR_FAIL; } if (++query->files_cur == query->files_len) { - query->state = LQ_QUERY_EOF; + query->state |= LQ_QUERY_EOF; } return ERR_OK; } +int lq_query_get_val_len(LQQuery *query) { + if (!(query->state & LQ_QUERY_READY)) { + return -1; + } + return query->value_len; +} + +char* lq_query_get_val(LQQuery *query) { + if (!(query->state & LQ_QUERY_READY)) { + return NULL; + } + return query->value; +} + +int lq_query_get_key_len(LQQuery *query) { + if (!(query->state & LQ_QUERY_READY)) { + return -1; + } + return query->key_len; +} + +char* lq_query_get_key(LQQuery *query) { + if (!(query->state & LQ_QUERY_READY)) { + return NULL; + } + return query->key; +} + void lq_query_free(LQQuery *query) { char *p; int i; @@ -227,6 +255,7 @@ void lq_query_free(LQQuery *query) { i++; } lq_free(query->files); + lq_free(query->key); lq_free(query->value); lq_free(query); } diff --git a/src/test/Makefile b/src/test/Makefile @@ -7,8 +7,8 @@ LIBS := ../asn1/defs_asn1_tab.o `pkg-config --libs libtasn1 libgcrypt` -L.. -L.. LDFLAGS := -lcheck $(LIBS) COMMONOBJS = ../mem/std.o ../lq/config.o ../lq/err.o ../lq/base.o ../debug.o -#all: build all-tests -all: build one-test +all: build all-tests +#all: build one-test all-tests: cK_FORK=no LD_LIBRARY_PATH=`realpath ../aux/lib` ./test_test_bin diff --git a/src/test/test_query.c b/src/test/test_query.c @@ -79,7 +79,8 @@ START_TEST(check_query_full) { r = lq_query_next(query); ck_assert_int_eq(r, ERR_OK); r = lq_query_next(query); - ck_assert_int_eq(r, ERR_EOF); + ck_assert_int_eq(r, ERR_OK | ERR_EOF); + lq_query_free(query); query = lq_query_new(LQ_CONTENT_MSG, &store, "aa", 2); ck_assert_ptr_nonnull(query); @@ -91,8 +92,19 @@ START_TEST(check_query_full) { r = lq_query_next(query); ck_assert_int_eq(r, ERR_OK); r = lq_query_next(query); - ck_assert_int_eq(r, ERR_EOF); + ck_assert_int_eq(r, ERR_OK | ERR_EOF); + k = lq_query_get_key(query); + kl = lq_query_get_key_len(query); + ck_assert_int_eq(kl, 3); + ck_assert_mem_eq(k, "aac", kl); + + v = lq_query_get_val(query); + vl = lq_query_get_val_len(query); + ck_assert_int_eq(vl, 6); + ck_assert_mem_eq(v, "blinky", vl); + + lq_query_free(query); } END_TEST