in oss/api_op_select_object.go [384:463]
func (rw *ReaderWrapper) readFrames(p []byte) (int, error) {
var nn int
var err error
var checkValid bool
if rw.OutputRawData == true {
nn, err = rw.Body.Read(p)
return nn, err
}
if rw.Finish {
return 0, io.EOF
}
for {
// if this Frame is Read, then not reading Header
if rw.OpenLine != true {
err = rw.analysisHeader()
if err != nil {
return nn, err
}
}
if rw.FrameType == DataFrameType {
n, err := rw.analysisData(p[nn:])
if err != nil {
return nn, err
}
nn += n
// if this Frame is read all data, then empty the Frame to read it with next frame
if rw.ConsumedBytesLength == rw.PayloadLength-8 {
checkValid, err = rw.checkPayloadSum()
if err != nil || !checkValid {
return nn, fmt.Errorf("%s", err.Error())
}
rw.emptyFrame()
}
if nn == len(p) {
return nn, nil
}
} else if rw.FrameType == ContinuousFrameType {
checkValid, err = rw.checkPayloadSum()
if err != nil || !checkValid {
return nn, fmt.Errorf("%s", err.Error())
}
rw.OpenLine = false
} else if rw.FrameType == EndFrameType {
err = rw.analysisEndFrame()
if err != nil {
return nn, err
}
checkValid, err = rw.checkPayloadSum()
if checkValid {
rw.Finish = true
}
return nn, err
} else if rw.FrameType == MetaEndFrameCSVType {
err = rw.analysisMetaEndFrameCSV()
if err != nil {
return nn, err
}
checkValid, err = rw.checkPayloadSum()
if checkValid {
rw.Finish = true
}
return nn, err
} else if rw.FrameType == MetaEndFrameJSONType {
err = rw.analysisMetaEndFrameJSON()
if err != nil {
return nn, err
}
checkValid, err = rw.checkPayloadSum()
if checkValid {
rw.Finish = true
}
return nn, err
}
}
}