int avro_datum_as_value(avro_value_t *value, avro_datum_t src) { value->iface = &AVRO_DATUM_VALUE_CLASS; value->self = avro_datum_incref(src); return 0; }
avro_schema_t avro_schema_copy(avro_schema_t schema) { long i; avro_schema_t new_schema = NULL; if (!schema) { return NULL; } switch (avro_typeof(schema)) { case AVRO_STRING: case AVRO_BYTES: case AVRO_INT32: case AVRO_INT64: case AVRO_FLOAT: case AVRO_DOUBLE: case AVRO_BOOLEAN: case AVRO_NULL: /* * No need to copy primitives since they're static */ new_schema = schema; break; case AVRO_RECORD: { struct avro_record_schema_t *record_schema = avro_schema_to_record(schema); new_schema = avro_schema_record(record_schema->name, record_schema->space); for (i = 0; i < record_schema->fields->num_entries; i++) { union { st_data_t data; struct avro_record_field_t *field; } val; st_lookup(record_schema->fields, i, &val.data); avro_schema_t type_copy = avro_schema_copy(val.field->type); avro_datum_incref(val.field->default_value); avro_schema_record_field_append(new_schema, val.field->name, type_copy, val.field->default_value); } } break; case AVRO_ENUM: { struct avro_enum_schema_t *enum_schema = avro_schema_to_enum(schema); new_schema = avro_schema_enum(enum_schema->name); for (i = 0; i < enum_schema->symbols->num_entries; i++) { union { st_data_t data; char *sym; } val; st_lookup(enum_schema->symbols, i, &val.data); avro_schema_enum_symbol_append(new_schema, val.sym); } } break; case AVRO_FIXED: { struct avro_fixed_schema_t *fixed_schema = avro_schema_to_fixed(schema); new_schema = avro_schema_fixed(fixed_schema->name, fixed_schema->size); } break; case AVRO_MAP: { struct avro_map_schema_t *map_schema = avro_schema_to_map(schema); avro_schema_t values_copy = avro_schema_copy(map_schema->values); if (!values_copy) { return NULL; } new_schema = avro_schema_map(values_copy); } break; case AVRO_ARRAY: { struct avro_array_schema_t *array_schema = avro_schema_to_array(schema); avro_schema_t items_copy = avro_schema_copy(array_schema->items); if (!items_copy) { return NULL; } new_schema = avro_schema_array(items_copy); } break; case AVRO_UNION: { struct avro_union_schema_t *union_schema = avro_schema_to_union(schema); new_schema = avro_schema_union(); for (i = 0; i < union_schema->branches->num_entries; i++) { avro_schema_t schema_copy; union { st_data_t data; avro_schema_t schema; } val; st_lookup(union_schema->branches, i, &val.data); schema_copy = avro_schema_copy(val.schema); if (avro_schema_union_append (new_schema, schema_copy)) { avro_schema_decref(new_schema); return NULL; } } } break; case AVRO_LINK: { struct avro_link_schema_t *link_schema = avro_schema_to_link(schema); /* * TODO: use an avro_schema_copy of to instead of pointing to * the same reference */ avro_schema_incref(link_schema->to); new_schema = avro_schema_link(link_schema->to); } break; default: return NULL; } return new_schema; }
static void avro_datum_value_incref(avro_value_t *value) { avro_datum_t self = (avro_datum_t) value->self; avro_datum_incref(self); }