func()

in oss/filelike.go [654:698]


func (f *AppendOnlyFile) writeFrom(r io.Reader) (n int64, err error) {
	offset := f.offset

	request := &AppendObjectRequest{
		Bucket:       &f.bucket,
		Key:          &f.key,
		Position:     Ptr(f.offset),
		Body:         r,
		RequestPayer: f.requestPayer,
	}

	f.applyCreateParamIfNeed(request)

	var roffset int64
	var rs io.Seeker
	rs, ok := r.(io.Seeker)
	if ok {
		roffset, _ = rs.Seek(0, io.SeekCurrent)
	}

	var result *AppendObjectResult
	if result, err = f.client.AppendObject(f.context, request); err == nil {
		f.offset = result.NextPosition
		f.hashCRC64 = result.HashCRC64
		f.created = true
	} else {
		var serr *ServiceError
		if errors.As(err, &serr) && serr.Code == "PositionNotEqualToLength" {
			if position, hashcrc, ok := f.nextAppendPosition(); ok {
				if rs != nil {
					if curr, e := rs.Seek(0, io.SeekCurrent); e == nil {
						if offset+(curr-roffset) == position {
							f.offset = position
							f.hashCRC64 = hashcrc
							f.created = true
							err = nil
						}
					}
				}
			}
		}
	}

	return f.offset - offset, err
}