func()

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
		}
	}
}