19 using System.Collections.Generic;
51 return new GenericArrayAccess();
56 return new GenericEnumAccess(readerSchema);
61 return new GenericMapAccess();
66 return new GenericRecordAccess(readerSchema);
71 return new GenericFixedAccess(readerSchema);
74 class GenericEnumAccess : EnumAccess
83 public object CreateEnum(
object reuse,
int ordinal)
85 if (reuse is GenericEnum)
87 var ge = (GenericEnum) reuse;
88 if (ge.Schema.Equals(
this.schema))
90 ge.Value = this.schema[ordinal];
94 return new GenericEnum(this.schema, this.schema[ordinal]);
98 internal class GenericRecordAccess : RecordAccess
100 private RecordSchema schema;
102 public GenericRecordAccess(RecordSchema schema)
104 this.schema = schema;
107 public object CreateRecord(
object reuse)
109 GenericRecord ru = (reuse ==
null || !(reuse is GenericRecord) || !(reuse as GenericRecord).Schema.Equals(this.schema)) ?
110 new GenericRecord(this.schema) :
111 reuse as GenericRecord;
115 public object GetField(
object record,
string fieldName,
int fieldPos)
118 if(!((GenericRecord)record).TryGetValue(fieldName, out result))
125 public void AddField(
object record,
string fieldName,
int fieldPos,
object fieldValue)
127 ((GenericRecord)record).Add(fieldName, fieldValue);
131 class GenericFixedAccess : FixedAccess
133 private FixedSchema schema;
135 public GenericFixedAccess(FixedSchema schema)
137 this.schema = schema;
140 public object CreateFixed(
object reuse)
142 return (reuse is GenericFixed && (reuse as GenericFixed).Schema.Equals(
this.schema)) ?
143 reuse :
new GenericFixed(this.schema);
146 public byte[] GetFixedBuffer(
object f )
148 return ((GenericFixed)f).Value;
152 class GenericArrayAccess : ArrayAccess
154 public object Create(
object reuse)
156 return (reuse is
object[]) ? reuse :
new object[0];
159 public void EnsureSize(ref
object array,
int targetSize)
161 if (((
object[])array).Length < targetSize)
162 SizeTo(ref array, targetSize);
165 public void Resize(ref
object array,
int targetSize)
167 SizeTo(ref array, targetSize);
170 public void AddElements(
object arrayObj,
int elements,
int index,
ReadItem itemReader,
Decoder decoder,
bool reuse )
172 var array = (
object[]) arrayObj;
173 for (
int i = index; i < index + elements; i++)
175 array[i] = reuse ? itemReader(array[i], decoder) : itemReader(null, decoder);
179 private static void SizeTo(ref
object array,
int targetSize)
181 var o = (
object[]) array;
182 Array.Resize(ref o, targetSize);
187 class GenericMapAccess : MapAccess
189 public object Create(
object reuse)
191 if (reuse is IDictionary<string, object>)
193 var result = (IDictionary<string, object>)reuse;
197 return new Dictionary<string, object>();
200 public void AddElements(
object mapObj,
int elements,
ReadItem itemReader,
Decoder decoder,
bool reuse)
202 var map = ((IDictionary<string, object>)mapObj);
203 for (
int i = 0; i < elements; i++)
206 map[key] = itemReader(
null, decoder);
override bool IsReusable(Schema.Type tag)
Indicates if it's possible to reuse an object of the specified type.
PreresolvingDatumReader for reading data to GenericRecord classes or primitives.
string ReadString()
Reads a string Avro type
Class for enum type schemas
Base class for all schema types
Type
Enum for schema types
override EnumAccess GetEnumAccess(EnumSchema readerSchema)
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
override RecordAccess GetRecordAccess(RecordSchema readerSchema)
A general purpose reader of data from avro streams.
Decoder is used to decode Avro data on a stream.
override FixedAccess GetFixedAccess(FixedSchema readerSchema)
Class for array type schemas
override ArrayAccess GetArrayAccess(ArraySchema readerSchema)
GenericDatumReader(Schema writerSchema, Schema readerSchema)
delegate object ReadItem(object reuse, Decoder dec)
override MapAccess GetMapAccess(MapSchema readerSchema)