func()

in memstore/vector_party.go [508:620]


func (vp *cVectorParty) Read(reader io.Reader, s common.VectorPartySerializer) error {
	dataReader := utils.NewStreamDataReader(reader)
	magicNumber, err := dataReader.ReadUint32()
	if err != nil {
		return err
	}

	if magicNumber != common.VectorPartyHeader {
		return utils.StackError(nil, "Magic number does not match, vector party file may be corrupted")
	}

	rawLength, err := dataReader.ReadInt32()
	if err != nil {
		return err
	}
	length := int(rawLength)

	rawDataType, err := dataReader.ReadUint32()
	if err != nil {
		return err
	}

	dataType, err := common.NewDataType(rawDataType)
	if err != nil {
		return err
	}

	nonDefaultValueCount, err := dataReader.ReadInt32()
	if err != nil {
		return err
	}

	m, err := dataReader.ReadUint16()
	if err != nil {
		return err
	}

	columnMode := common.ColumnMode(m)
	if columnMode >= common.MaxColumnMode {
		return utils.StackError(nil, "Invalid mode %d", columnMode)
	}

	// Read unused bytes
	err = dataReader.SkipBytes(6)
	if err != nil {
		return err
	}

	vp.length = length
	vp.nonDefaultValueCount = int(nonDefaultValueCount)
	vp.dataType = dataType
	vp.columnMode = columnMode

	if err = s.CheckVectorPartySerializable(vp); err != nil {
		return err
	}

	bytes := vectors.CalculateVectorPartyBytes(vp.GetDataType(), vp.GetLength(),
		columnMode == common.HasNullVector || columnMode == common.HasCountVector, columnMode == common.HasCountVector)
	s.ReportVectorPartyMemoryUsage(int64(bytes))

	// Stop reading since there are no vectors in this vp.
	if columnMode <= common.AllValuesDefault {
		return nil
	}

	// Read value vector.
	valueVector := vectors.NewVector(dataType, length)
	// Here we directly read from reader into the c allocated bytes.
	if err = dataReader.Read(
		cgoutils.MakeSliceFromCPtr(uintptr(valueVector.Buffer()), valueVector.Bytes),
	); err != nil {
		valueVector.SafeDestruct()
		return err
	}
	vp.values = valueVector

	// Stop reading since there are no more vectors in this vp.
	if columnMode <= common.AllValuesPresent {
		return nil
	}

	// Read null vector.
	nullVector := vectors.NewVector(common.Bool, length)
	// Here we directly read from reader into the c allocated bytes.
	if err = dataReader.Read(
		cgoutils.MakeSliceFromCPtr(uintptr(nullVector.Buffer()), nullVector.Bytes),
	); err != nil {
		valueVector.SafeDestruct()
		nullVector.SafeDestruct()
		return err
	}
	vp.nulls = nullVector

	// Stop reading since there are no more vectors in this vp.
	if columnMode <= common.HasNullVector {
		return nil
	}

	// Read count vector.
	countVector := vectors.NewVector(common.Uint32, length+1)
	// Here we directly read from reader into the c allocated bytes.
	if err = dataReader.Read(
		cgoutils.MakeSliceFromCPtr(uintptr(countVector.Buffer()), countVector.Bytes),
	); err != nil {
		valueVector.SafeDestruct()
		nullVector.SafeDestruct()
		countVector.SafeDestruct()
		return err
	}
	vp.counts = countVector
	return nil
}