in memstore/list/archive_vector_party.go [252:343]
func (vp *ArchiveVectorParty) Read(reader io.Reader, s common.VectorPartySerializer) error {
dataReader := utils.NewStreamDataReader(reader)
magicNumber, err := dataReader.ReadUint32()
defer func() {
if err != nil {
if vp.offsets != nil {
vp.offsets.SafeDestruct()
}
if vp.values != nil {
vp.values.SafeDestruct()
}
}
}()
if err != nil {
return err
}
if magicNumber != ListVectorPartyHeader {
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
}
// non default value count
_, err = dataReader.ReadInt32()
if err != nil {
return err
}
// column mode
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.dataType = dataType
vp.offsets = vectors.NewVector(common.Uint32, vp.length*2)
if err = dataReader.Read(cgoutils.MakeSliceFromCPtr(uintptr(vp.offsets.Buffer()), vp.offsets.Bytes)); err != nil {
return err
}
// Read value bytes
bytes, err := dataReader.ReadUint64()
if err != nil {
return err
}
vp.totalValueBytes = int64(bytes)
// Read value vector.
vp.values = vectors.NewVector(common.Uint8, int(vp.totalValueBytes))
// Here we directly read from reader into the c allocated bytes.
if err = dataReader.Read(cgoutils.MakeSliceFromCPtr(uintptr(vp.values.Buffer()), vp.values.Bytes)); err != nil {
return err
}
vp.bytesWritten = vp.totalValueBytes
vp.lengthFilled = vp.length
if s != nil {
// memory usage:
// 1. offset vector party: (4 bytes offset + 4 bytes length) * length
// 2. value vector is totalValueBytes of uint8
s.ReportVectorPartyMemoryUsage(int64(vp.length*4*2) + vp.totalValueBytes)
}
return nil
}