func()

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)
	}
}