summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/avro/src/datum_skip.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/avro/src/datum_skip.c')
-rw-r--r--fluent-bit/lib/avro/src/datum_skip.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/fluent-bit/lib/avro/src/datum_skip.c b/fluent-bit/lib/avro/src/datum_skip.c
new file mode 100644
index 000000000..aa51d7934
--- /dev/null
+++ b/fluent-bit/lib/avro/src/datum_skip.c
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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
+ *
+ * https://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.
+ */
+
+#include "avro_private.h"
+#include "avro/errors.h"
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include "encoding.h"
+#include "schema.h"
+
+static int skip_array(avro_reader_t reader, const avro_encoding_t * enc,
+ struct avro_array_schema_t *writers_schema)
+{
+ int rval;
+ int64_t i;
+ int64_t block_count;
+ int64_t block_size;
+
+ check_prefix(rval, enc->read_long(reader, &block_count),
+ "Cannot read array block count: ");
+
+ while (block_count != 0) {
+ if (block_count < 0) {
+ block_count = block_count * -1;
+ check_prefix(rval, enc->read_long(reader, &block_size),
+ "Cannot read array block size: ");
+ }
+
+ for (i = 0; i < block_count; i++) {
+ check_prefix(rval, avro_skip_data(reader, writers_schema->items),
+ "Cannot skip array element: ");
+ }
+
+ check_prefix(rval, enc->read_long(reader, &block_count),
+ "Cannot read array block count: ");
+ }
+ return 0;
+}
+
+static int skip_map(avro_reader_t reader, const avro_encoding_t * enc,
+ struct avro_map_schema_t *writers_schema)
+{
+ int rval;
+ int64_t i, block_count;
+
+ check_prefix(rval, enc->read_long(reader, &block_count),
+ "Cannot read map block count: ");
+ while (block_count != 0) {
+ int64_t block_size;
+ if (block_count < 0) {
+ block_count = block_count * -1;
+ check_prefix(rval, enc->read_long(reader, &block_size),
+ "Cannot read map block size: ");
+ }
+ for (i = 0; i < block_count; i++) {
+ check_prefix(rval, enc->skip_string(reader),
+ "Cannot skip map key: ");
+ check_prefix(rval,
+ avro_skip_data(reader,
+ avro_schema_to_map(writers_schema)->
+ values),
+ "Cannot skip map value: ");
+ }
+ check_prefix(rval, enc->read_long(reader, &block_count),
+ "Cannot read map block count: ");
+ }
+ return 0;
+}
+
+static int skip_union(avro_reader_t reader, const avro_encoding_t * enc,
+ struct avro_union_schema_t *writers_schema)
+{
+ int rval;
+ int64_t index;
+ avro_schema_t branch_schema;
+
+ check_prefix(rval, enc->read_long(reader, &index),
+ "Cannot read union discriminant: ");
+ branch_schema = avro_schema_union_branch(&writers_schema->obj, index);
+ if (!branch_schema) {
+ return EILSEQ;
+ }
+ return avro_skip_data(reader, branch_schema);
+}
+
+static int skip_record(avro_reader_t reader, const avro_encoding_t * enc,
+ struct avro_record_schema_t *writers_schema)
+{
+ int rval;
+ long i;
+
+ AVRO_UNUSED(enc);
+
+ for (i = 0; i < writers_schema->fields->num_entries; i++) {
+ avro_schema_t field_schema;
+
+ field_schema = avro_schema_record_field_get_by_index
+ (&writers_schema->obj, i);
+ check_prefix(rval, avro_skip_data(reader, field_schema),
+ "Cannot skip record field: ");
+ }
+ return 0;
+}
+
+int avro_skip_data(avro_reader_t reader, avro_schema_t writers_schema)
+{
+ check_param(EINVAL, reader, "reader");
+ check_param(EINVAL, is_avro_schema(writers_schema), "writer schema");
+
+ int rval = EINVAL;
+ const avro_encoding_t *enc = &avro_binary_encoding;
+
+ switch (avro_typeof(writers_schema)) {
+ case AVRO_NULL:
+ rval = enc->skip_null(reader);
+ break;
+
+ case AVRO_BOOLEAN:
+ rval = enc->skip_boolean(reader);
+ break;
+
+ case AVRO_STRING:
+ rval = enc->skip_string(reader);
+ break;
+
+ case AVRO_INT32:
+ rval = enc->skip_int(reader);
+ break;
+
+ case AVRO_INT64:
+ rval = enc->skip_long(reader);
+ break;
+
+ case AVRO_FLOAT:
+ rval = enc->skip_float(reader);
+ break;
+
+ case AVRO_DOUBLE:
+ rval = enc->skip_double(reader);
+ break;
+
+ case AVRO_BYTES:
+ rval = enc->skip_bytes(reader);
+ break;
+
+ case AVRO_FIXED:
+ rval =
+ avro_skip(reader,
+ avro_schema_to_fixed(writers_schema)->size);
+ break;
+
+ case AVRO_ENUM:
+ rval = enc->skip_long(reader);
+ break;
+
+ case AVRO_ARRAY:
+ rval =
+ skip_array(reader, enc,
+ avro_schema_to_array(writers_schema));
+ break;
+
+ case AVRO_MAP:
+ rval =
+ skip_map(reader, enc, avro_schema_to_map(writers_schema));
+ break;
+
+ case AVRO_UNION:
+ rval =
+ skip_union(reader, enc,
+ avro_schema_to_union(writers_schema));
+ break;
+
+ case AVRO_RECORD:
+ rval =
+ skip_record(reader, enc,
+ avro_schema_to_record(writers_schema));
+ break;
+
+ case AVRO_LINK:
+ rval =
+ avro_skip_data(reader,
+ (avro_schema_to_link(writers_schema))->to);
+ break;
+ }
+
+ return rval;
+}