avro 1.7.4 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +4 -0
- data/avro.gemspec +4 -4
- data/interop/test_interop.rb +1 -1
- data/lib/avro.rb +1 -0
- data/lib/avro/data_file.rb +90 -25
- data/lib/avro/io.rb +78 -86
- data/lib/avro/protocol.rb +24 -28
- data/lib/avro/schema.rb +132 -151
- data/test/random_data.rb +16 -16
- data/test/test_datafile.rb +31 -0
- data/test/test_protocol.rb +7 -0
- data/test/test_schema.rb +134 -0
- metadata +6 -4
data/Rakefile
CHANGED
data/avro.gemspec
CHANGED
@@ -2,22 +2,22 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "avro"
|
5
|
-
s.version = "1.7.
|
5
|
+
s.version = "1.7.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Apache Software Foundation"]
|
9
|
-
s.date = "2013-
|
9
|
+
s.date = "2013-08-19"
|
10
10
|
s.description = "Avro is a data serialization and RPC format"
|
11
11
|
s.email = "avro-dev@hadoop.apache.org"
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "lib/avro.rb", "lib/avro/collect_hash.rb", "lib/avro/data_file.rb", "lib/avro/io.rb", "lib/avro/ipc.rb", "lib/avro/protocol.rb", "lib/avro/schema.rb"]
|
13
|
-
s.files = ["CHANGELOG", "Manifest", "Rakefile", "avro.gemspec", "interop/test_interop.rb", "lib/avro.rb", "lib/avro/collect_hash.rb", "lib/avro/data_file.rb", "lib/avro/io.rb", "lib/avro/ipc.rb", "lib/avro/protocol.rb", "lib/avro/schema.rb", "test/random_data.rb", "test/sample_ipc_client.rb", "test/sample_ipc_http_client.rb", "test/sample_ipc_http_server.rb", "test/sample_ipc_server.rb", "test/test_datafile.rb", "test/test_help.rb", "test/test_io.rb", "test/test_protocol.rb", "test/test_socket_transport.rb", "test/tool.rb"]
|
13
|
+
s.files = ["CHANGELOG", "Manifest", "Rakefile", "avro.gemspec", "interop/test_interop.rb", "lib/avro.rb", "lib/avro/collect_hash.rb", "lib/avro/data_file.rb", "lib/avro/io.rb", "lib/avro/ipc.rb", "lib/avro/protocol.rb", "lib/avro/schema.rb", "test/random_data.rb", "test/sample_ipc_client.rb", "test/sample_ipc_http_client.rb", "test/sample_ipc_http_server.rb", "test/sample_ipc_server.rb", "test/test_datafile.rb", "test/test_help.rb", "test/test_io.rb", "test/test_protocol.rb", "test/test_socket_transport.rb", "test/tool.rb", "test/test_schema.rb"]
|
14
14
|
s.homepage = "http://hadoop.apache.org/avro/"
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Avro"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = "avro"
|
18
18
|
s.rubygems_version = "1.8.15"
|
19
19
|
s.summary = "Apache Avro for Ruby"
|
20
|
-
s.test_files = ["test/test_datafile.rb", "test/test_help.rb", "test/test_protocol.rb", "test/test_socket_transport.rb", "test/test_io.rb"]
|
20
|
+
s.test_files = ["test/test_datafile.rb", "test/test_help.rb", "test/test_protocol.rb", "test/test_socket_transport.rb", "test/test_schema.rb", "test/test_io.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
s.specification_version = 3
|
data/interop/test_interop.rb
CHANGED
@@ -23,7 +23,7 @@ class TestInterop < Test::Unit::TestCase
|
|
23
23
|
HERE = File.expand_path(File.dirname(__FILE__))
|
24
24
|
SHARE = HERE + '/../../../share'
|
25
25
|
SCHEMAS = SHARE + '/test/schemas'
|
26
|
-
Dir[HERE + '/../../../build/interop/data/*'].each do |fn|
|
26
|
+
Dir[HERE + '/../../../build/interop/data/*'].each do |fn|
|
27
27
|
define_method("test_read_#{File.basename(fn, 'avro')}") do
|
28
28
|
projection = Avro::Schema.parse(File.read(SCHEMAS+'/interop.avsc'))
|
29
29
|
|
data/lib/avro.rb
CHANGED
data/lib/avro/data_file.rb
CHANGED
@@ -24,19 +24,18 @@ module Avro
|
|
24
24
|
SYNC_SIZE = 16
|
25
25
|
SYNC_INTERVAL = 1000 * SYNC_SIZE
|
26
26
|
META_SCHEMA = Schema.parse('{"type": "map", "values": "bytes"}')
|
27
|
-
VALID_CODECS = ['null']
|
28
27
|
VALID_ENCODINGS = ['binary'] # not used yet
|
29
28
|
|
30
29
|
class DataFileError < AvroError; end
|
31
30
|
|
32
|
-
def self.open(file_path, mode='r', schema=nil)
|
31
|
+
def self.open(file_path, mode='r', schema=nil, codec=nil)
|
33
32
|
schema = Avro::Schema.parse(schema) if schema
|
34
33
|
case mode
|
35
34
|
when 'w'
|
36
35
|
unless schema
|
37
36
|
raise DataFileError, "Writing an Avro file requires a schema."
|
38
37
|
end
|
39
|
-
io = open_writer(File.open(file_path, 'wb'), schema)
|
38
|
+
io = open_writer(File.open(file_path, 'wb'), schema, codec)
|
40
39
|
when 'r'
|
41
40
|
io = open_reader(File.open(file_path, 'rb'), schema)
|
42
41
|
else
|
@@ -49,11 +48,34 @@ module Avro
|
|
49
48
|
io.close if block_given? && io
|
50
49
|
end
|
51
50
|
|
51
|
+
def self.codecs
|
52
|
+
@codecs
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.register_codec(codec)
|
56
|
+
@codecs ||= {}
|
57
|
+
codec = codec.new if !codec.respond_to?(:codec_name) && codec.is_a?(Class)
|
58
|
+
@codecs[codec.codec_name.to_s] = codec
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.get_codec(codec)
|
62
|
+
codec ||= 'null'
|
63
|
+
if codec.respond_to?(:compress) && codec.respond_to?(:decompress)
|
64
|
+
codec # it's a codec instance
|
65
|
+
elsif codec.is_a?(Class)
|
66
|
+
codec.new # it's a codec class
|
67
|
+
elsif @codecs.include?(codec.to_s)
|
68
|
+
@codecs[codec.to_s] # it's a string or symbol (codec name)
|
69
|
+
else
|
70
|
+
raise DataFileError, "Unknown codec: #{codec.inspect}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
52
74
|
class << self
|
53
75
|
private
|
54
|
-
def open_writer(file, schema)
|
76
|
+
def open_writer(file, schema, codec=nil)
|
55
77
|
writer = Avro::IO::DatumWriter.new(schema)
|
56
|
-
Avro::DataFile::Writer.new(file, writer, schema)
|
78
|
+
Avro::DataFile::Writer.new(file, writer, schema, codec)
|
57
79
|
end
|
58
80
|
|
59
81
|
def open_reader(file, schema)
|
@@ -67,10 +89,10 @@ module Avro
|
|
67
89
|
OpenSSL::Random.random_bytes(16)
|
68
90
|
end
|
69
91
|
|
70
|
-
attr_reader :writer, :encoder, :datum_writer, :buffer_writer, :buffer_encoder, :sync_marker, :meta
|
92
|
+
attr_reader :writer, :encoder, :datum_writer, :buffer_writer, :buffer_encoder, :sync_marker, :meta, :codec
|
71
93
|
attr_accessor :block_count
|
72
94
|
|
73
|
-
def initialize(writer, datum_writer, writers_schema=nil)
|
95
|
+
def initialize(writer, datum_writer, writers_schema=nil, codec=nil)
|
74
96
|
# If writers_schema is not present, presume we're appending
|
75
97
|
@writer = writer
|
76
98
|
@encoder = IO::BinaryEncoder.new(@writer)
|
@@ -83,7 +105,8 @@ module Avro
|
|
83
105
|
|
84
106
|
if writers_schema
|
85
107
|
@sync_marker = Writer.generate_sync_marker
|
86
|
-
|
108
|
+
@codec = DataFile.get_codec(codec)
|
109
|
+
meta['avro.codec'] = @codec.codec_name.to_s
|
87
110
|
meta['avro.schema'] = writers_schema.to_s
|
88
111
|
datum_writer.writers_schema = writers_schema
|
89
112
|
write_header
|
@@ -95,6 +118,7 @@ module Avro
|
|
95
118
|
# collect metadata
|
96
119
|
@sync_marker = dfr.sync_marker
|
97
120
|
meta['avro.codec'] = dfr.meta['avro.codec']
|
121
|
+
@codec = DataFile.get_codec(meta['avro.codec'])
|
98
122
|
|
99
123
|
# get schema used to write existing file
|
100
124
|
schema_from_file = dfr.meta['avro.schema']
|
@@ -152,21 +176,15 @@ module Avro
|
|
152
176
|
|
153
177
|
# TODO(jmhodges): make a schema for blocks and use datum_writer
|
154
178
|
# TODO(jmhodges): do we really need the number of items in the block?
|
155
|
-
# TODO(jmhodges): use codec when writing the block contents
|
156
179
|
def write_block
|
157
180
|
if block_count > 0
|
158
181
|
# write number of items in block and block size in bytes
|
159
182
|
encoder.write_long(block_count)
|
160
|
-
to_write = buffer_writer.string
|
183
|
+
to_write = codec.compress(buffer_writer.string)
|
161
184
|
encoder.write_long(to_write.size)
|
162
185
|
|
163
186
|
# write block contents
|
164
|
-
|
165
|
-
writer.write(to_write)
|
166
|
-
else
|
167
|
-
msg = "#{meta['avro.codec'].inspect} coded is not supported"
|
168
|
-
raise DataFileError, msg
|
169
|
-
end
|
187
|
+
writer.write(to_write)
|
170
188
|
|
171
189
|
# write sync marker
|
172
190
|
writer.write(sync_marker)
|
@@ -183,8 +201,14 @@ module Avro
|
|
183
201
|
class Reader
|
184
202
|
include ::Enumerable
|
185
203
|
|
186
|
-
|
187
|
-
|
204
|
+
# The reader and binary decoder for the raw file stream
|
205
|
+
attr_reader :reader, :decoder
|
206
|
+
|
207
|
+
# The binary decoder for the contents of a block (after codec decompression)
|
208
|
+
attr_reader :block_decoder
|
209
|
+
|
210
|
+
attr_reader :datum_reader, :sync_marker, :meta, :file_length, :codec
|
211
|
+
attr_accessor :block_count # records remaining in current block
|
188
212
|
|
189
213
|
def initialize(reader, datum_reader)
|
190
214
|
@reader = reader
|
@@ -194,11 +218,7 @@ module Avro
|
|
194
218
|
# read the header: magic, meta, sync
|
195
219
|
read_header
|
196
220
|
|
197
|
-
|
198
|
-
codec_from_file = meta['avro.codec']
|
199
|
-
if codec_from_file && ! VALID_CODECS.include?(codec_from_file)
|
200
|
-
raise DataFileError, "Unknown codec: #{codec_from_file}"
|
201
|
-
end
|
221
|
+
@codec = DataFile.get_codec(meta['avro.codec'])
|
202
222
|
|
203
223
|
# get ready to read
|
204
224
|
@block_count = 0
|
@@ -220,7 +240,7 @@ module Avro
|
|
220
240
|
end
|
221
241
|
end
|
222
242
|
|
223
|
-
datum = datum_reader.read(
|
243
|
+
datum = datum_reader.read(block_decoder)
|
224
244
|
self.block_count -= 1
|
225
245
|
yield(datum)
|
226
246
|
end
|
@@ -257,7 +277,9 @@ module Avro
|
|
257
277
|
|
258
278
|
def read_block_header
|
259
279
|
self.block_count = decoder.read_long
|
260
|
-
decoder.read_long
|
280
|
+
block_bytes = decoder.read_long
|
281
|
+
data = codec.decompress(reader.read(block_bytes))
|
282
|
+
@block_decoder = IO::BinaryDecoder.new(StringIO.new(data))
|
261
283
|
end
|
262
284
|
|
263
285
|
# read the length of the sync marker; if it matches the sync
|
@@ -273,5 +295,48 @@ module Avro
|
|
273
295
|
end
|
274
296
|
end
|
275
297
|
end
|
298
|
+
|
299
|
+
|
300
|
+
class NullCodec
|
301
|
+
def codec_name; 'null'; end
|
302
|
+
def decompress(data); data; end
|
303
|
+
def compress(data); data; end
|
304
|
+
end
|
305
|
+
|
306
|
+
class DeflateCodec
|
307
|
+
attr_reader :level
|
308
|
+
|
309
|
+
def initialize(level=Zlib::DEFAULT_COMPRESSION)
|
310
|
+
@level = level
|
311
|
+
end
|
312
|
+
|
313
|
+
def codec_name; 'deflate'; end
|
314
|
+
|
315
|
+
def decompress(compressed)
|
316
|
+
# Passing a negative number to Inflate puts it into "raw" RFC1951 mode
|
317
|
+
# (without the RFC1950 header & checksum). See the docs for
|
318
|
+
# inflateInit2 in http://www.zlib.net/manual.html
|
319
|
+
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
|
320
|
+
data = zstream.inflate(compressed)
|
321
|
+
data << zstream.finish
|
322
|
+
ensure
|
323
|
+
zstream.close
|
324
|
+
end
|
325
|
+
|
326
|
+
def compress(data)
|
327
|
+
zstream = Zlib::Deflate.new(level, -Zlib::MAX_WBITS)
|
328
|
+
compressed = zstream.deflate(data)
|
329
|
+
compressed << zstream.finish
|
330
|
+
ensure
|
331
|
+
zstream.close
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
DataFile.register_codec NullCodec
|
336
|
+
DataFile.register_codec DeflateCodec
|
337
|
+
|
338
|
+
# TODO this constant won't be updated if you register another codec.
|
339
|
+
# Deprecated in favor of Avro::DataFile::codecs
|
340
|
+
VALID_CODECS = DataFile.codecs.keys
|
276
341
|
end
|
277
342
|
end
|
data/lib/avro/io.rb
CHANGED
@@ -220,51 +220,43 @@ module Avro
|
|
220
220
|
end
|
221
221
|
|
222
222
|
class DatumReader
|
223
|
-
def self.check_props(schema_one, schema_two, prop_list)
|
224
|
-
prop_list.all? do |prop|
|
225
|
-
schema_one.send(prop) == schema_two.send(prop)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
223
|
def self.match_schemas(writers_schema, readers_schema)
|
230
|
-
w_type = writers_schema.
|
231
|
-
r_type = readers_schema.
|
224
|
+
w_type = writers_schema.type_sym
|
225
|
+
r_type = readers_schema.type_sym
|
232
226
|
|
233
227
|
# This conditional is begging for some OO love.
|
234
|
-
if w_type ==
|
228
|
+
if w_type == :union || r_type == :union
|
235
229
|
return true
|
236
230
|
end
|
237
231
|
|
238
232
|
if w_type == r_type
|
239
|
-
if Schema::
|
240
|
-
Schema::PRIMITIVE_TYPES.include?(r_type)
|
241
|
-
return true
|
242
|
-
end
|
233
|
+
return true if Schema::PRIMITIVE_TYPES_SYM.include?(r_type)
|
243
234
|
|
244
235
|
case r_type
|
245
|
-
when
|
246
|
-
return
|
247
|
-
when
|
248
|
-
return
|
249
|
-
when
|
236
|
+
when :record
|
237
|
+
return writers_schema.fullname == readers_schema.fullname
|
238
|
+
when :error
|
239
|
+
return writers_schema.fullname == readers_schema.fullname
|
240
|
+
when :request
|
250
241
|
return true
|
251
|
-
when
|
252
|
-
return
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
242
|
+
when :fixed
|
243
|
+
return writers_schema.fullname == readers_schema.fullname &&
|
244
|
+
writers_schema.size == readers_schema.size
|
245
|
+
when :enum
|
246
|
+
return writers_schema.fullname == readers_schema.fullname
|
247
|
+
when :map
|
248
|
+
return writers_schema.values.type == readers_schema.values.type
|
249
|
+
when :array
|
250
|
+
return writers_schema.items.type == readers_schema.items.type
|
259
251
|
end
|
260
252
|
end
|
261
253
|
|
262
254
|
# Handle schema promotion
|
263
|
-
if w_type ==
|
255
|
+
if w_type == :int && [:long, :float, :double].include?(r_type)
|
264
256
|
return true
|
265
|
-
elsif w_type ==
|
257
|
+
elsif w_type == :long && [:float, :double].include?(r_type)
|
266
258
|
return true
|
267
|
-
elsif w_type ==
|
259
|
+
elsif w_type == :float && r_type == :double
|
268
260
|
return true
|
269
261
|
end
|
270
262
|
|
@@ -291,7 +283,7 @@ module Avro
|
|
291
283
|
|
292
284
|
# schema resolution: reader's schema is a union, writer's
|
293
285
|
# schema is not
|
294
|
-
if writers_schema.
|
286
|
+
if writers_schema.type_sym != :union && readers_schema.type_sym == :union
|
295
287
|
rs = readers_schema.schemas.find{|s|
|
296
288
|
self.class.match_schemas(writers_schema, s)
|
297
289
|
}
|
@@ -301,21 +293,21 @@ module Avro
|
|
301
293
|
|
302
294
|
# function dispatch for reading data based on type of writer's
|
303
295
|
# schema
|
304
|
-
case writers_schema.
|
305
|
-
when
|
306
|
-
when
|
307
|
-
when
|
308
|
-
when
|
309
|
-
when
|
310
|
-
when
|
311
|
-
when
|
312
|
-
when
|
313
|
-
when
|
314
|
-
when
|
315
|
-
when
|
316
|
-
when
|
317
|
-
when
|
318
|
-
when
|
296
|
+
case writers_schema.type_sym
|
297
|
+
when :null; decoder.read_null
|
298
|
+
when :boolean; decoder.read_boolean
|
299
|
+
when :string; decoder.read_string
|
300
|
+
when :int; decoder.read_int
|
301
|
+
when :long; decoder.read_long
|
302
|
+
when :float; decoder.read_float
|
303
|
+
when :double; decoder.read_double
|
304
|
+
when :bytes; decoder.read_bytes
|
305
|
+
when :fixed; read_fixed(writers_schema, readers_schema, decoder)
|
306
|
+
when :enum; read_enum(writers_schema, readers_schema, decoder)
|
307
|
+
when :array; read_array(writers_schema, readers_schema, decoder)
|
308
|
+
when :map; read_map(writers_schema, readers_schema, decoder)
|
309
|
+
when :union; read_union(writers_schema, readers_schema, decoder)
|
310
|
+
when :record, :error, :request; read_record(writers_schema, readers_schema, decoder)
|
319
311
|
else
|
320
312
|
raise AvroError, "Cannot read unknown schema type: #{writers_schema.type}"
|
321
313
|
end
|
@@ -416,34 +408,34 @@ module Avro
|
|
416
408
|
|
417
409
|
def read_default_value(field_schema, default_value)
|
418
410
|
# Basically a JSON Decoder?
|
419
|
-
case field_schema.
|
420
|
-
when
|
411
|
+
case field_schema.type_sym
|
412
|
+
when :null
|
421
413
|
return nil
|
422
|
-
when
|
414
|
+
when :boolean
|
423
415
|
return default_value
|
424
|
-
when
|
416
|
+
when :int, :long
|
425
417
|
return Integer(default_value)
|
426
|
-
when
|
418
|
+
when :float, :double
|
427
419
|
return Float(default_value)
|
428
|
-
when
|
420
|
+
when :enum, :fixed, :string, :bytes
|
429
421
|
return default_value
|
430
|
-
when
|
422
|
+
when :array
|
431
423
|
read_array = []
|
432
424
|
default_value.each do |json_val|
|
433
425
|
item_val = read_default_value(field_schema.items, json_val)
|
434
426
|
read_array << item_val
|
435
427
|
end
|
436
428
|
return read_array
|
437
|
-
when
|
429
|
+
when :map
|
438
430
|
read_map = {}
|
439
431
|
default_value.each do |key, json_val|
|
440
432
|
map_val = read_default_value(field_schema.values, json_val)
|
441
433
|
read_map[key] = map_val
|
442
434
|
end
|
443
435
|
return read_map
|
444
|
-
when
|
436
|
+
when :union
|
445
437
|
return read_default_value(field_schema.schemas[0], default_value)
|
446
|
-
when
|
438
|
+
when :record, :error
|
447
439
|
read_record = {}
|
448
440
|
field_schema.fields.each do |field|
|
449
441
|
json_val = default_value[field.name]
|
@@ -459,37 +451,37 @@ module Avro
|
|
459
451
|
end
|
460
452
|
|
461
453
|
def skip_data(writers_schema, decoder)
|
462
|
-
case writers_schema.
|
463
|
-
when
|
454
|
+
case writers_schema.type_sym
|
455
|
+
when :null
|
464
456
|
decoder.skip_null
|
465
|
-
when
|
457
|
+
when :boolean
|
466
458
|
decoder.skip_boolean
|
467
|
-
when
|
459
|
+
when :string
|
468
460
|
decoder.skip_string
|
469
|
-
when
|
461
|
+
when :int
|
470
462
|
decoder.skip_int
|
471
|
-
when
|
463
|
+
when :long
|
472
464
|
decoder.skip_long
|
473
|
-
when
|
465
|
+
when :float
|
474
466
|
decoder.skip_float
|
475
|
-
when
|
467
|
+
when :double
|
476
468
|
decoder.skip_double
|
477
|
-
when
|
469
|
+
when :bytes
|
478
470
|
decoder.skip_bytes
|
479
|
-
when
|
471
|
+
when :fixed
|
480
472
|
skip_fixed(writers_schema, decoder)
|
481
|
-
when
|
473
|
+
when :enum
|
482
474
|
skip_enum(writers_schema, decoder)
|
483
|
-
when
|
475
|
+
when :array
|
484
476
|
skip_array(writers_schema, decoder)
|
485
|
-
when
|
477
|
+
when :map
|
486
478
|
skip_map(writers_schema, decoder)
|
487
|
-
when
|
479
|
+
when :union
|
488
480
|
skip_union(writers_schema, decoder)
|
489
|
-
when
|
481
|
+
when :record, :error, :request
|
490
482
|
skip_record(writers_schema, decoder)
|
491
483
|
else
|
492
|
-
raise AvroError, "Unknown schema type: #{
|
484
|
+
raise AvroError, "Unknown schema type: #{writers_schema.type}"
|
493
485
|
end
|
494
486
|
end
|
495
487
|
|
@@ -552,21 +544,21 @@ module Avro
|
|
552
544
|
end
|
553
545
|
|
554
546
|
# function dispatch to write datum
|
555
|
-
case writers_schema.
|
556
|
-
when
|
557
|
-
when
|
558
|
-
when
|
559
|
-
when
|
560
|
-
when
|
561
|
-
when
|
562
|
-
when
|
563
|
-
when
|
564
|
-
when
|
565
|
-
when
|
566
|
-
when
|
567
|
-
when
|
568
|
-
when
|
569
|
-
when
|
547
|
+
case writers_schema.type_sym
|
548
|
+
when :null; encoder.write_null(datum)
|
549
|
+
when :boolean; encoder.write_boolean(datum)
|
550
|
+
when :string; encoder.write_string(datum)
|
551
|
+
when :int; encoder.write_int(datum)
|
552
|
+
when :long; encoder.write_long(datum)
|
553
|
+
when :float; encoder.write_float(datum)
|
554
|
+
when :double; encoder.write_double(datum)
|
555
|
+
when :bytes; encoder.write_bytes(datum)
|
556
|
+
when :fixed; write_fixed(writers_schema, datum, encoder)
|
557
|
+
when :enum; write_enum(writers_schema, datum, encoder)
|
558
|
+
when :array; write_array(writers_schema, datum, encoder)
|
559
|
+
when :map; write_map(writers_schema, datum, encoder)
|
560
|
+
when :union; write_union(writers_schema, datum, encoder)
|
561
|
+
when :record, :error, :request; write_record(writers_schema, datum, encoder)
|
570
562
|
else
|
571
563
|
raise AvroError.new("Unknown type: #{writers_schema.type}")
|
572
564
|
end
|