in datahub/binaryrecord.go [233:281]
func (bRecord *binaryRecord) getField(index int) (interface{}, error) {
if err := bRecord.checkFieldIndex(index); err != nil {
return nil, err
}
if bRecord.isFieldNull(index) {
return nil, nil
}
offset := bRecord.getFieldOffset(index)
if bRecord.schema == nil {
byteData := bRecord.readByte(offset)
return byteData, nil
}
field := bRecord.schema.Fields[index]
switch field.Type {
case STRING:
str := bRecord.readStr(offset)
return str, nil
case DECIMAL:
str := bRecord.readStr(offset)
return decimal.NewFromString(str)
case FLOAT:
bits := binary.LittleEndian.Uint32(bRecord.data[offset:])
return math.Float32frombits(bits), nil
case DOUBLE:
bits := binary.LittleEndian.Uint64(bRecord.data[offset:])
return math.Float64frombits(bits), nil
case BOOLEAN:
val := binary.LittleEndian.Uint64(bRecord.data[offset:])
return val == 1, nil
case TINYINT:
val := binary.LittleEndian.Uint64(bRecord.data[offset:])
return int8(val), nil
case SMALLINT:
val := binary.LittleEndian.Uint64(bRecord.data[offset:])
return int16(val), nil
case INTEGER:
val := binary.LittleEndian.Uint64(bRecord.data[offset:])
return int32(val), nil
case BIGINT, TIMESTAMP:
val := binary.LittleEndian.Uint64(bRecord.data[offset:])
return int64(val), nil
default:
return nil, fmt.Errorf("invalid field type [%v]", field.Type)
}
}