MCPcopy
hub / github.com/minio/minio-go / AppendObject

Method AppendObject

api-append-object.go:189–244  ·  view source on GitHub ↗

AppendObject - S3 Express Zone https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-append.html Note that appending on a server without append support may overwrite the object.

(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64,
	opts AppendObjectOptions,
)

Source from the content-addressed store, hash-verified

187// AppendObject - S3 Express Zone https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-append.html
188// Note that appending on a server without append support may overwrite the object.
189func (c *Client) AppendObject(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64,
190 opts AppendObjectOptions,
191) (info UploadInfo, err error) {
192 if objectSize < 0 && opts.ChunkSize == 0 {
193 return UploadInfo{}, errors.New("object size must be provided when no chunk size is provided")
194 }
195
196 if err = opts.validate(c); err != nil {
197 return UploadInfo{}, err
198 }
199
200 oinfo, err := c.StatObject(ctx, bucketName, objectName, StatObjectOptions{Checksum: true})
201 if err != nil {
202 return UploadInfo{}, err
203 }
204 if oinfo.ChecksumMode != "" && oinfo.ChecksumMode != ChecksumFullObjectMode.String() {
205 return UploadInfo{}, fmt.Errorf("Append() is not allowed on objects that are not of FULL_OBJECT checksum type: %s", oinfo.ChecksumMode)
206 }
207 opts.setChecksumParams(oinfo) // set the appropriate checksum params based on the existing object checksum metadata.
208 opts.setWriteOffset(oinfo.Size) // First append must set the current object size as the offset.
209
210 if opts.ChunkSize > 0 {
211 finalObjSize := int64(-1)
212 if objectSize > 0 {
213 finalObjSize = info.Size + objectSize
214 }
215 totalPartsCount, partSize, lastPartSize, err := OptimalPartInfo(finalObjSize, opts.ChunkSize)
216 if err != nil {
217 return UploadInfo{}, err
218 }
219 buf := make([]byte, partSize)
220 var partNumber int
221 for partNumber = 1; partNumber <= totalPartsCount; partNumber++ {
222 // Proceed to upload the part.
223 if partNumber == totalPartsCount {
224 partSize = lastPartSize
225 }
226 n, err := readFull(reader, buf)
227 if err != nil {
228 return info, err
229 }
230 if n != int(partSize) {
231 return info, io.ErrUnexpectedEOF
232 }
233 rd := newHook(bytes.NewReader(buf[:n]), opts.Progress)
234 uinfo, err := c.appendObjectDo(ctx, bucketName, objectName, rd, partSize, opts)
235 if err != nil {
236 return info, err
237 }
238 opts.setWriteOffset(uinfo.Size)
239 }
240 }
241
242 rd := newHook(reader, opts.Progress)
243 return c.appendObjectDo(ctx, bucketName, objectName, rd, objectSize, opts)
244}

Callers

nothing calls this directly

Calls 8

StatObjectMethod · 0.95
appendObjectDoMethod · 0.95
OptimalPartInfoFunction · 0.85
newHookFunction · 0.85
setChecksumParamsMethod · 0.80
setWriteOffsetMethod · 0.80
validateMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected