def self.decode(data)
table = Hash.new
table_length = data.unpack(PACK_UINT32).first
return table if table_length.zero?
offset = 4
while offset <= table_length
key, offset = decode_table_key(data, offset)
type, offset = TableValueDecoder.decode_value_type(data, offset)
table[key] = case type
when TYPE_STRING
v, offset = TableValueDecoder.decode_string(data, offset)
v
when TYPE_INTEGER
v, offset = TableValueDecoder.decode_integer(data, offset)
v
when TYPE_DECIMAL
v, offset = TableValueDecoder.decode_big_decimal(data, offset)
v
when TYPE_TIME
v, offset = TableValueDecoder.decode_time(data, offset)
v
when TYPE_HASH
v, offset = TableValueDecoder.decode_hash(data, offset)
v
when TYPE_BOOLEAN
v, offset = TableValueDecoder.decode_boolean(data, offset)
v
when TYPE_SIGNED_8BIT then
raise NotImplementedError.new
when TYPE_SIGNED_16BIT then
raise NotImplementedError.new
when TYPE_SIGNED_64BIT then
v, offset = TableValueDecoder.decode_long(data, offset)
v
when TYPE_32BIT_FLOAT then
v, offset = TableValueDecoder.decode_32bit_float(data, offset)
v
when TYPE_64BIT_FLOAT then
v, offset = TableValueDecoder.decode_64bit_float(data, offset)
v
when TYPE_VOID
nil
when TYPE_ARRAY
v, offset = TableValueDecoder.decode_array(data, offset)
v
else
raise ArgumentError, "Not a valid type: #{type.inspect}\nData: #{data.inspect}\nUnprocessed data: #{data[offset..-1].inspect}\nOffset: #{offset}\nTotal size: #{table_length}\nProcessed data: #{table.inspect}"
end
end
table
end