diff options
Diffstat (limited to 'src/fluent-bit/plugins/processor_attributes/variant_utils.h')
-rw-r--r-- | src/fluent-bit/plugins/processor_attributes/variant_utils.h | 626 |
1 files changed, 0 insertions, 626 deletions
diff --git a/src/fluent-bit/plugins/processor_attributes/variant_utils.h b/src/fluent-bit/plugins/processor_attributes/variant_utils.h deleted file mode 100644 index 7ba376273..000000000 --- a/src/fluent-bit/plugins/processor_attributes/variant_utils.h +++ /dev/null @@ -1,626 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - -/* CMetrics - * ======== - * Copyright 2021-2022 The CMetrics Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef VARIANT_UTILS_H -#define VARIANT_UTILS_H - -#include <mpack/mpack.h> - -/* These are the only functions meant for general use, - * the reason why the kvlist packing and unpacking - * functions are exposed is the internal and external - * metadata kvlists in the cmetrics context are not - * contained by a variant instance. - * - * Result : - * Upon success all of these return 0, otherwise they will - * raise the innermost error code which should be treated - * as an opaque value. - * - * Notes : - * When decoding -1 means the check after mpack_read_tag - * failed and -2 means the type was not the one expected - */ - -static inline int pack_cfl_variant(mpack_writer_t *writer, - struct cfl_variant *value); - -static inline int pack_cfl_variant_kvlist(mpack_writer_t *writer, - struct cfl_kvlist *kvlist); - -static inline int unpack_cfl_variant(mpack_reader_t *reader, - struct cfl_variant **value); - -static inline int unpack_cfl_kvlist(mpack_reader_t *reader, - struct cfl_kvlist **result_kvlist); - -/* Packers */ -static inline int pack_cfl_variant_string(mpack_writer_t *writer, - char *value) -{ - mpack_write_cstr(writer, value); - - return 0; -} - -static inline int pack_cfl_variant_binary(mpack_writer_t *writer, - char *value, - size_t length) -{ - mpack_write_bin(writer, value, length); - - return 0; -} - -static inline int pack_cfl_variant_boolean(mpack_writer_t *writer, - unsigned int value) -{ - mpack_write_bool(writer, value); - - return 0; -} - -static inline int pack_cfl_variant_int64(mpack_writer_t *writer, - int64_t value) -{ - mpack_write_int(writer, value); - - return 0; -} - -static inline int pack_cfl_variant_double(mpack_writer_t *writer, - double value) -{ - mpack_write_double(writer, value); - - return 0; -} - -static inline int pack_cfl_variant_array(mpack_writer_t *writer, - struct cfl_array *array) -{ - size_t entry_count; - struct cfl_variant *entry_value; - int result; - size_t index; - - entry_count = array->entry_count; - - mpack_start_array(writer, entry_count); - - for (index = 0 ; index < entry_count ; index++) { - entry_value = cfl_array_fetch_by_index(array, index); - - if (entry_value == NULL) { - return -1; - } - - result = pack_cfl_variant(writer, entry_value); - - if (result != 0) { - return result; - } - } - - mpack_finish_array(writer); - - return 0; -} - -static inline int pack_cfl_variant_kvlist(mpack_writer_t *writer, - struct cfl_kvlist *kvlist) { - size_t entry_count; - struct cfl_list *iterator; - struct cfl_kvpair *kvpair; - int result; - - entry_count = cfl_kvlist_count(kvlist); - - mpack_start_map(writer, entry_count); - - cfl_list_foreach(iterator, &kvlist->list) { - kvpair = cfl_list_entry(iterator, struct cfl_kvpair, _head); - - mpack_write_cstr(writer, kvpair->key); - - result = pack_cfl_variant(writer, kvpair->val); - - if (result != 0) { - return result; - } - } - - mpack_finish_map(writer); - - return 0; -} - -static inline int pack_cfl_variant(mpack_writer_t *writer, - struct cfl_variant *value) -{ - int result; - - if (value->type == CFL_VARIANT_STRING) { - result = pack_cfl_variant_string(writer, value->data.as_string); - } - else if (value->type == CFL_VARIANT_BOOL) { - result = pack_cfl_variant_boolean(writer, value->data.as_bool); - } - else if (value->type == CFL_VARIANT_INT) { - result = pack_cfl_variant_int64(writer, value->data.as_int64); - } - else if (value->type == CFL_VARIANT_DOUBLE) { - result = pack_cfl_variant_double(writer, value->data.as_double); - } - else if (value->type == CFL_VARIANT_ARRAY) { - result = pack_cfl_variant_array(writer, value->data.as_array); - } - else if (value->type == CFL_VARIANT_KVLIST) { - result = pack_cfl_variant_kvlist(writer, value->data.as_kvlist); - } - else if (value->type == CFL_VARIANT_BYTES) { - result = pack_cfl_variant_binary(writer, - value->data.as_bytes, - cfl_sds_len(value->data.as_bytes)); - } - else if (value->type == CFL_VARIANT_REFERENCE) { - result = pack_cfl_variant_string(writer, value->data.as_string); - } - else { - result = -1; - } - - return result; -} - -/* Unpackers */ - -static inline int unpack_cfl_variant_read_tag(mpack_reader_t *reader, - mpack_tag_t *tag, - mpack_type_t expected_type) -{ - *tag = mpack_read_tag(reader); - - if (mpack_ok != mpack_reader_error(reader)) { - return -1; - } - - if (mpack_tag_type(tag) != expected_type) { - return -2; - } - - return 0; -} - -static inline int unpack_cfl_array(mpack_reader_t *reader, - struct cfl_array **result_array) -{ - struct cfl_array *internal_array; - size_t entry_count; - struct cfl_variant *entry_value; - int result; - size_t index; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_array); - - if (result != 0) { - return result; - } - - entry_count = mpack_tag_array_count(&tag); - - internal_array = cfl_array_create(entry_count); - - if (internal_array == NULL) { - return -3; - } - - for (index = 0 ; index < entry_count ; index++) { - result = unpack_cfl_variant(reader, &entry_value); - - if (result != 0) { - cfl_array_destroy(internal_array); - - return -4; - } - - result = cfl_array_append(internal_array, entry_value); - - if (result != 0) { - cfl_array_destroy(internal_array); - - return -5; - } - } - - mpack_done_array(reader); - - if (mpack_reader_error(reader) != mpack_ok) { - cfl_array_destroy(internal_array); - - return -6; - } - - *result_array = internal_array; - - return 0; -} - -static inline int unpack_cfl_kvlist(mpack_reader_t *reader, - struct cfl_kvlist **result_kvlist) -{ - struct cfl_kvlist *internal_kvlist; - char key_name[256]; - size_t entry_count; - size_t key_length; - struct cfl_variant *key_value; - mpack_tag_t key_tag; - int result; - size_t index; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_map); - - if (result != 0) { - return result; - } - - entry_count = mpack_tag_map_count(&tag); - - internal_kvlist = cfl_kvlist_create(); - - if (internal_kvlist == NULL) { - return -3; - } - - result = 0; - key_value = NULL; - - for (index = 0 ; index < entry_count ; index++) { - result = unpack_cfl_variant_read_tag(reader, &key_tag, mpack_type_str); - - if (result != 0) { - result = -4; - - break; - } - - key_length = mpack_tag_str_length(&key_tag); - - if (key_length >= sizeof(key_name)) { - result = -5; - - break; - } - - mpack_read_cstr(reader, key_name, sizeof(key_name), key_length); - - key_name[key_length] = '\0'; - - mpack_done_str(reader); - - if (mpack_ok != mpack_reader_error(reader)) { - result = -6; - - break; - } - - result = unpack_cfl_variant(reader, &key_value); - - if (result != 0) { - result = -7; - - break; - } - - result = cfl_kvlist_insert(internal_kvlist, key_name, key_value); - - if (result != 0) { - result = -8; - - break; - } - - key_value = NULL; - } - - mpack_done_map(reader); - - if (mpack_reader_error(reader) != mpack_ok) { - result = -9; - } - - if (result != 0) { - cfl_kvlist_destroy(internal_kvlist); - - if (key_value != NULL) { - cfl_variant_destroy(key_value); - } - } - else { - *result_kvlist = internal_kvlist; - } - - return result; -} - -static inline int unpack_cfl_variant_string(mpack_reader_t *reader, - struct cfl_variant **value) -{ - size_t value_length; - char *value_data; - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_str); - - if (result != 0) { - return result; - } - - value_length = mpack_tag_str_length(&tag); - - value_data = cfl_sds_create_size(value_length + 1); - - if (value_data == NULL) { - return -3; - } - - cfl_sds_set_len(value_data, value_length); - - mpack_read_cstr(reader, value_data, value_length + 1, value_length); - - mpack_done_str(reader); - - if (mpack_reader_error(reader) != mpack_ok) { - cfl_sds_destroy(value_data); - - return -4; - } - - *value = cfl_variant_create_from_reference(value_data); - - if (*value == NULL) { - return -5; - } - - (*value)->type = CFL_VARIANT_STRING; - - return 0; -} - -static inline int unpack_cfl_variant_binary(mpack_reader_t *reader, - struct cfl_variant **value) -{ - size_t value_length; - char *value_data; - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_bin); - - if (result != 0) { - return result; - } - - value_length = mpack_tag_bin_length(&tag); - - value_data = cfl_sds_create_size(value_length); - - if (value_data == NULL) { - return -3; - } - - cfl_sds_set_len(value_data, value_length); - - mpack_read_bytes(reader, value_data, value_length); - - mpack_done_bin(reader); - - if (mpack_reader_error(reader) != mpack_ok) { - cfl_sds_destroy(value_data); - - return -4; - } - - *value = cfl_variant_create_from_reference(value_data); - - if (*value == NULL) { - return -5; - } - - (*value)->type = CFL_VARIANT_BYTES; - - return 0; -} - -static inline int unpack_cfl_variant_boolean(mpack_reader_t *reader, - struct cfl_variant **value) -{ - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_bool); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_bool((unsigned int) mpack_tag_bool_value(&tag)); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant_uint64(mpack_reader_t *reader, - struct cfl_variant **value) -{ - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_uint); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_int64((int64_t) mpack_tag_uint_value(&tag)); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant_int64(mpack_reader_t *reader, - struct cfl_variant **value) -{ - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_int); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_int64((int64_t) mpack_tag_int_value(&tag)); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant_double(mpack_reader_t *reader, - struct cfl_variant **value) -{ - int result; - mpack_tag_t tag; - - result = unpack_cfl_variant_read_tag(reader, &tag, mpack_type_double); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_double(mpack_tag_double_value(&tag)); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant_array(mpack_reader_t *reader, - struct cfl_variant **value) -{ - struct cfl_array *unpacked_array; - int result; - - result = unpack_cfl_array(reader, &unpacked_array); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_array(unpacked_array); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant_kvlist(mpack_reader_t *reader, - struct cfl_variant **value) -{ - struct cfl_kvlist *unpacked_kvlist; - int result; - - result = unpack_cfl_kvlist(reader, &unpacked_kvlist); - - if (result != 0) { - return result; - } - - *value = cfl_variant_create_from_kvlist(unpacked_kvlist); - - if (*value == NULL) { - return -3; - } - - return 0; -} - -static inline int unpack_cfl_variant(mpack_reader_t *reader, - struct cfl_variant **value) -{ - mpack_type_t value_type; - int result; - mpack_tag_t tag; - - tag = mpack_peek_tag(reader); - - if (mpack_ok != mpack_reader_error(reader)) { - return -1; - } - - value_type = mpack_tag_type(&tag); - - if (value_type == mpack_type_str) { - result = unpack_cfl_variant_string(reader, value); - } - else if (value_type == mpack_type_str) { - result = unpack_cfl_variant_boolean(reader, value); - } - else if (value_type == mpack_type_int) { - result = unpack_cfl_variant_int64(reader, value); - } - else if (value_type == mpack_type_uint) { - result = unpack_cfl_variant_uint64(reader, value); - } - else if (value_type == mpack_type_double) { - result = unpack_cfl_variant_double(reader, value); - } - else if (value_type == mpack_type_array) { - result = unpack_cfl_variant_array(reader, value); - } - else if (value_type == mpack_type_map) { - result = unpack_cfl_variant_kvlist(reader, value); - } - else if (value_type == mpack_type_bin) { - result = unpack_cfl_variant_binary(reader, value); - } - else { - result = -1; - } - - return result; -} - -#endif |