/* * 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.h" #include "avro_private.h" #include #include static const char *schema_json = "{" " \"type\": \"record\"," " \"name\": \"test\"," " \"fields\": [" " { \"name\": \"i\", \"type\": \"int\" }," " { \"name\": \"l\", \"type\": \"long\" }," " { \"name\": \"s\", \"type\": \"string\" }," " {" " \"name\": \"subrec\"," " \"type\": {" " \"type\": \"record\"," " \"name\": \"sub\"," " \"fields\": [" " { \"name\": \"f\", \"type\": \"float\" }," " { \"name\": \"d\", \"type\": \"double\" }" " ]" " }" " }" " ]" "}"; static void populate_complex_record(avro_value_t *p_val) { avro_value_t field; avro_value_get_by_index(p_val, 0, &field, NULL); avro_value_set_int(&field, 42); avro_value_get_by_index(p_val, 1, &field, NULL); avro_value_set_long(&field, 4242); avro_wrapped_buffer_t wbuf; avro_wrapped_buffer_new_string(&wbuf, "Follow your bliss."); avro_value_get_by_index(p_val, 2, &field, NULL); avro_value_give_string_len(&field, &wbuf); avro_value_t subrec; avro_value_get_by_index(p_val, 3, &subrec, NULL); avro_value_get_by_index(&subrec, 0, &field, NULL); avro_value_set_float(&field, 3.14159265); avro_value_get_by_index(&subrec, 1, &field, NULL); avro_value_set_double(&field, 2.71828183); } int main(void) { int rval = 0; size_t len; static char buf[4096]; avro_writer_t writer; avro_file_writer_t file_writer; avro_file_reader_t file_reader; const char *outpath = "test-1379.avro"; avro_schema_t schema = NULL; avro_schema_error_t error = NULL; check(rval, avro_schema_from_json(schema_json, strlen(schema_json), &schema, &error)); avro_value_iface_t *iface = avro_generic_class_from_schema(schema); avro_value_t val; avro_generic_value_new(iface, &val); avro_value_t out; avro_generic_value_new(iface, &out); /* create the val */ avro_value_reset(&val); populate_complex_record(&val); /* create the writers */ writer = avro_writer_memory(buf, sizeof(buf)); check(rval, avro_file_writer_create(outpath, schema, &file_writer)); fprintf(stderr, "Writing to buffer\n"); check(rval, avro_value_write(writer, &val)); fprintf(stderr, "Writing buffer to %s " "using avro_file_writer_append_encoded()\n", outpath); len = avro_writer_tell(writer); check(rval, avro_file_writer_append_encoded(file_writer, buf, len)); check(rval, avro_file_writer_close(file_writer)); check(rval, avro_file_reader(outpath, &file_reader)); fprintf(stderr, "Re-reading value to verify\n"); check(rval, avro_file_reader_read_value(file_reader, &out)); fprintf(stderr, "Verifying value..."); if (!avro_value_equal(&val, &out)) { fprintf(stderr, "fail!\n"); exit(EXIT_FAILURE); } fprintf(stderr, "ok\n"); check(rval, avro_file_reader_close(file_reader)); remove(outpath); avro_writer_free(writer); avro_value_decref(&out); avro_value_decref(&val); avro_value_iface_decref(iface); avro_schema_decref(schema); exit(EXIT_SUCCESS); }