diff --git a/include/fluent-bit/flb_kv.h b/include/fluent-bit/flb_kv.h index 0c4ad82ce1f..17213186d51 100644 --- a/include/fluent-bit/flb_kv.h +++ b/include/fluent-bit/flb_kv.h @@ -41,5 +41,6 @@ struct flb_kv *flb_kv_item_set(struct mk_list *list, void flb_kv_item_destroy(struct flb_kv *kv); void flb_kv_release(struct mk_list *list); const char *flb_kv_get_key_value(const char *key, struct mk_list *list); +struct flb_kv **flb_kv_get_all_key_values(struct mk_list *list, int *out_count); #endif diff --git a/src/flb_kv.c b/src/flb_kv.c index fc3c3545fad..61464fed81a 100644 --- a/src/flb_kv.c +++ b/src/flb_kv.c @@ -160,3 +160,43 @@ const char *flb_kv_get_key_value(const char *key, struct mk_list *list) return NULL; } + +struct flb_kv **flb_kv_get_all_key_values(struct mk_list *list, int *out_count) +{ + int count; + int i = 0; + struct mk_list *head; + struct flb_kv *kv; + struct flb_kv **arr; + + if (out_count) { + *out_count = 0; + } + + if (!list) { + return NULL; + } + + count = mk_list_size(list); + if (count == 0) { + return NULL; + } + + arr = flb_calloc(count, sizeof(struct flb_kv *)); + if (!arr) { + flb_errno(); + return NULL; + } + + mk_list_foreach(head, list) { + kv = mk_list_entry(head, struct flb_kv, _head); + arr[i] = kv; + i++; + } + + if (out_count) { + *out_count = count; + } + + return arr; +} diff --git a/tests/internal/kv.c b/tests/internal/kv.c index e20d5184692..f630fc5dee0 100644 --- a/tests/internal/kv.c +++ b/tests/internal/kv.c @@ -1,6 +1,7 @@ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ #include +#include #include "flb_tests_internal.h" static void test_kv_item_set_duplicate() @@ -28,7 +29,46 @@ static void test_kv_item_set_duplicate() flb_kv_release(&list); } +static void test_kv_get_all_key_values() +{ + struct mk_list list; + struct flb_kv **pairs; + int count = -1; + + flb_kv_init(&list); + + pairs = flb_kv_get_all_key_values(&list, &count); + TEST_CHECK(pairs == NULL); + TEST_CHECK(count == 0); + + flb_kv_item_set(&list, "host", "localhost"); + flb_kv_item_set(&list, "port", "8080"); + flb_kv_item_set(&list, "path", "/api"); + + pairs = flb_kv_get_all_key_values(&list, &count); + TEST_CHECK(pairs != NULL); + TEST_CHECK(count == 3); + + if (pairs && count == 3) { + TEST_CHECK(pairs[0] != NULL); + TEST_CHECK(strcmp(pairs[0]->key, "host") == 0); + TEST_CHECK(strcmp(pairs[0]->val, "localhost") == 0); + + TEST_CHECK(pairs[1] != NULL); + TEST_CHECK(strcmp(pairs[1]->key, "port") == 0); + TEST_CHECK(strcmp(pairs[1]->val, "8080") == 0); + + TEST_CHECK(pairs[2] != NULL); + TEST_CHECK(strcmp(pairs[2]->key, "path") == 0); + TEST_CHECK(strcmp(pairs[2]->val, "/api") == 0); + } + + flb_kv_release(&list); + flb_free(pairs); +} + TEST_LIST = { {"kv_item_set_duplicate", test_kv_item_set_duplicate}, + {"kv_get_all_key_values", test_kv_get_all_key_values}, {0} };