avro_schema_t avro_schema_link_target(avro_schema_t schema) { check_param(NULL, is_avro_schema(schema), "schema"); check_param(NULL, is_avro_link(schema), "schema"); struct avro_link_schema_t *link = avro_schema_to_link(schema); return link->to; }
int avro_schema_equal(avro_schema_t a, avro_schema_t b) { if (!a || !b) { /* * this is an error. protecting from segfault. */ return 0; } else if (a == b) { /* * an object is equal to itself */ return 1; } else if (avro_typeof(a) != avro_typeof(b)) { return 0; } else if (is_avro_record(a)) { return schema_record_equal(avro_schema_to_record(a), avro_schema_to_record(b)); } else if (is_avro_enum(a)) { return schema_enum_equal(avro_schema_to_enum(a), avro_schema_to_enum(b)); } else if (is_avro_fixed(a)) { return schema_fixed_equal(avro_schema_to_fixed(a), avro_schema_to_fixed(b)); } else if (is_avro_map(a)) { return schema_map_equal(avro_schema_to_map(a), avro_schema_to_map(b)); } else if (is_avro_array(a)) { return schema_array_equal(avro_schema_to_array(a), avro_schema_to_array(b)); } else if (is_avro_union(a)) { return schema_union_equal(avro_schema_to_union(a), avro_schema_to_union(b)); } else if (is_avro_link(a)) { return schema_link_equal(avro_schema_to_link(a), avro_schema_to_link(b)); } return 1; }
const char *avro_schema_type_name(const avro_schema_t schema) { if (is_avro_record(schema)) { return (avro_schema_to_record(schema))->name; } else if (is_avro_enum(schema)) { return (avro_schema_to_enum(schema))->name; } else if (is_avro_fixed(schema)) { return (avro_schema_to_fixed(schema))->name; } else if (is_avro_union(schema)) { return "union"; } else if (is_avro_array(schema)) { return "array"; } else if (is_avro_map(schema)) { return "map"; } else if (is_avro_int32(schema)) { return "int"; } else if (is_avro_int64(schema)) { return "long"; } else if (is_avro_float(schema)) { return "float"; } else if (is_avro_double(schema)) { return "double"; } else if (is_avro_boolean(schema)) { return "boolean"; } else if (is_avro_null(schema)) { return "null"; } else if (is_avro_string(schema)) { return "string"; } else if (is_avro_bytes(schema)) { return "bytes"; } else if (is_avro_link(schema)) { avro_schema_t target = avro_schema_link_target(schema); return avro_schema_type_name(target); } avro_set_error("Unknown schema type"); return NULL; }
static int write_datum(avro_writer_t writer, const avro_encoding_t * enc, avro_schema_t writers_schema, avro_datum_t datum) { if (is_avro_schema(writers_schema) && is_avro_link(writers_schema)) { return write_datum(writer, enc, (avro_schema_to_link(writers_schema))->to, datum); } switch (avro_typeof(datum)) { case AVRO_NULL: return enc->write_null(writer); case AVRO_BOOLEAN: return enc->write_boolean(writer, avro_datum_to_boolean(datum)->i); case AVRO_STRING: return enc->write_string(writer, avro_datum_to_string(datum)->s); case AVRO_BYTES: return enc->write_bytes(writer, avro_datum_to_bytes(datum)->bytes, avro_datum_to_bytes(datum)->size); case AVRO_INT32: case AVRO_INT64:{ int64_t val = avro_typeof(datum) == AVRO_INT32 ? avro_datum_to_int32(datum)->i32 : avro_datum_to_int64(datum)->i64; if (is_avro_schema(writers_schema)) { /* handle promotion */ if (is_avro_float(writers_schema)) { return enc->write_float(writer, (float)val); } else if (is_avro_double(writers_schema)) { return enc->write_double(writer, (double)val); } } return enc->write_long(writer, val); } case AVRO_FLOAT:{ float val = avro_datum_to_float(datum)->f; if (is_avro_schema(writers_schema) && is_avro_double(writers_schema)) { /* handle promotion */ return enc->write_double(writer, (double)val); } return enc->write_float(writer, val); } case AVRO_DOUBLE: return enc->write_double(writer, avro_datum_to_double(datum)->d); case AVRO_RECORD: return write_record(writer, enc, avro_schema_to_record(writers_schema), datum); case AVRO_ENUM: return write_enum(writer, enc, avro_schema_to_enum(writers_schema), avro_datum_to_enum(datum)); case AVRO_FIXED: return avro_write(writer, avro_datum_to_fixed(datum)->bytes, avro_datum_to_fixed(datum)->size); case AVRO_MAP: return write_map(writer, enc, avro_schema_to_map(writers_schema), avro_datum_to_map(datum)); case AVRO_ARRAY: return write_array(writer, enc, avro_schema_to_array(writers_schema), avro_datum_to_array(datum)); case AVRO_UNION: return write_union(writer, enc, avro_schema_to_union(writers_schema), avro_datum_to_union(datum)); case AVRO_LINK: break; } return 0; }