in lang/c/src/datum.c [1046:1157]
static void avro_datum_free(avro_datum_t datum)
{
if (is_avro_datum(datum)) {
switch (avro_typeof(datum)) {
case AVRO_STRING:{
struct avro_string_datum_t *string;
string = avro_datum_to_string(datum);
if (string->free) {
string->free(string->s, string->size);
}
avro_freet(struct avro_string_datum_t, string);
}
break;
case AVRO_BYTES:{
struct avro_bytes_datum_t *bytes;
bytes = avro_datum_to_bytes(datum);
if (bytes->free) {
bytes->free(bytes->bytes, bytes->size);
}
avro_freet(struct avro_bytes_datum_t, bytes);
}
break;
case AVRO_INT32:{
avro_freet(struct avro_int32_datum_t, datum);
}
break;
case AVRO_INT64:{
avro_freet(struct avro_int64_datum_t, datum);
}
break;
case AVRO_FLOAT:{
avro_freet(struct avro_float_datum_t, datum);
}
break;
case AVRO_DOUBLE:{
avro_freet(struct avro_double_datum_t, datum);
}
break;
case AVRO_BOOLEAN:{
avro_freet(struct avro_boolean_datum_t, datum);
}
break;
case AVRO_NULL:
case AVRO_INVALID:
/* Nothing allocated */
break;
case AVRO_RECORD:{
struct avro_record_datum_t *record;
record = avro_datum_to_record(datum);
avro_schema_decref(record->schema);
st_foreach(record->fields_byname,
(hash_function_foreach) char_datum_free_foreach, 0);
st_free_table(record->field_order);
st_free_table(record->fields_byname);
avro_freet(struct avro_record_datum_t, record);
}
break;
case AVRO_ENUM:{
struct avro_enum_datum_t *enump;
enump = avro_datum_to_enum(datum);
avro_schema_decref(enump->schema);
avro_freet(struct avro_enum_datum_t, enump);
}
break;
case AVRO_FIXED:{
struct avro_fixed_datum_t *fixed;
fixed = avro_datum_to_fixed(datum);
avro_schema_decref(fixed->schema);
if (fixed->free) {
fixed->free((void *)fixed->bytes,
fixed->size);
}
avro_freet(struct avro_fixed_datum_t, fixed);
}
break;
case AVRO_MAP:{
struct avro_map_datum_t *map;
map = avro_datum_to_map(datum);
avro_schema_decref(map->schema);
st_foreach(map->map, (hash_function_foreach) char_datum_free_foreach,
0);
st_free_table(map->map);
st_free_table(map->indices_by_key);
st_free_table(map->keys_by_index);
avro_freet(struct avro_map_datum_t, map);
}
break;
case AVRO_ARRAY:{
struct avro_array_datum_t *array;
array = avro_datum_to_array(datum);
avro_schema_decref(array->schema);
st_foreach(array->els, (hash_function_foreach) array_free_foreach, 0);
st_free_table(array->els);
avro_freet(struct avro_array_datum_t, array);
}
break;
case AVRO_UNION:{
struct avro_union_datum_t *unionp;
unionp = avro_datum_to_union(datum);
avro_schema_decref(unionp->schema);
avro_datum_decref(unionp->value);
avro_freet(struct avro_union_datum_t, unionp);
}
break;
case AVRO_LINK:{
/* TODO */
}
break;
}
}
}