static int write_link(avro_writer_t out, const struct avro_link_schema_t *link) { int rval; check(rval, avro_write_str(out, "\"")); check(rval, avro_write_str(out, avro_schema_name(link->to))); return avro_write_str(out, "\""); }
static int schema_link_equal(struct avro_link_schema_t *a, struct avro_link_schema_t *b) { /* * NOTE: links can only be used for named types. They are used in * recursive schemas so we just check the name of the schema pointed * to instead of a deep check. Otherwise, we recurse forever... */ if (is_avro_record(a->to)) { if (!is_avro_record(b->to)) { return 0; } if (nullstrcmp(avro_schema_to_record(a->to)->space, avro_schema_to_record(b->to)->space)) { return 0; } } return (strcmp(avro_schema_name(a->to), avro_schema_name(b->to)) == 0); }
PyObject * declare_types(ConvertInfo *info, avro_schema_t schema) { avro_type_t type = schema->type; switch (type) { case AVRO_NULL: /* PyNone_Type is not publicly visible */ return (PyObject *)Py_TYPE(Py_None); case AVRO_BOOLEAN: return (PyObject *)&PyBool_Type; case AVRO_BYTES: case AVRO_STRING: case AVRO_FIXED: return (PyObject *)&PyString_Type; case AVRO_DOUBLE: case AVRO_FLOAT: return (PyObject *)&PyFloat_Type; case AVRO_INT32: return (PyObject *)&PyInt_Type; case AVRO_ENUM: return get_python_enum_type(info->types, schema); case AVRO_INT64: return (PyObject *)&PyLong_Type; case AVRO_ARRAY: declare_types(info, avro_schema_array_items(schema)); return (PyObject *)&PyList_Type; case AVRO_MAP: declare_types(info, avro_schema_map_values(schema)); return (PyObject *)&PyDict_Type; case AVRO_UNION: { size_t union_size = avro_schema_union_size(schema); size_t i; for (i = 0; i < union_size; i++) { declare_types(info, avro_schema_union_branch(schema, i)); } } return (PyObject *)&PyBaseObject_Type; /* XXX list of types might be better */ case AVRO_RECORD: { size_t field_count = avro_schema_record_size(schema); size_t i; const char *record_name = avro_schema_name(schema); PyObject *record_type = PyObject_GetAttrString(info->types, record_name); PyObject *field_types; if (record_type != NULL) { /* already declared this record type */ Py_DECREF(record_type); return record_type; } /* create the Python type for this schema */ record_type = get_python_obj_type(info->types, schema); field_types = PyObject_GetAttrString(record_type, "_fieldtypes"); for (i = 0; i < field_count; i++) { PyObject *field_type = declare_types(info, avro_schema_record_field_get_by_index(schema, i)); /* this will INCREF, so takes hold of the object */ PyMapping_SetItemString(field_types, (char*)avro_schema_record_field_name(schema, i), field_type); } Py_DECREF(field_types); return record_type; } case AVRO_LINK: return declare_types(info, avro_schema_link_target(schema)); default: /* other types don't hold records */ break; } return NULL; }