func()

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
}