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
}