Source File
copy.go
Belonging Package
cloud.google.com/go/storage
package storage
import (
raw
)
func ( *ObjectHandle) ( *ObjectHandle) *Copier {
return &Copier{dst: , src: }
}
ProgressFunc func(copiedBytes, totalBytes uint64)
func ( *Copier) ( context.Context) ( *ObjectAttrs, error) {
= trace.StartSpan(, "cloud.google.com/go/storage.Copier.Run")
defer func() { trace.EndSpan(, ) }()
if := .src.validate(); != nil {
return nil,
}
if := .dst.validate(); != nil {
return nil,
}
if .DestinationKMSKeyName != "" && .dst.encryptionKey != nil {
return nil, errors.New("storage: cannot use DestinationKMSKeyName with a customer-supplied encryption key")
:= .ObjectAttrs.toRawObject("")
for {
, := .callRewrite(, )
if != nil {
return nil,
}
if .ProgressFunc != nil {
.ProgressFunc(uint64(.TotalBytesRewritten), uint64(.ObjectSize))
}
if .Done { // Finished successfully.
return newObject(.Resource), nil
}
}
}
func ( *Copier) ( context.Context, *raw.Object) (*raw.RewriteResponse, error) {
:= .dst.c.raw.Objects.Rewrite(.src.bucket, .src.object, .dst.bucket, .dst.object, )
.Context().Projection("full")
if .RewriteToken != "" {
.RewriteToken(.RewriteToken)
}
if .DestinationKMSKeyName != "" {
.DestinationKmsKeyName(.DestinationKMSKeyName)
}
if .PredefinedACL != "" {
.DestinationPredefinedAcl(.PredefinedACL)
}
if := applyConds("Copy destination", .dst.gen, .dst.conds, ); != nil {
return nil,
}
if .dst.userProject != "" {
.UserProject(.dst.userProject)
} else if .src.userProject != "" {
.UserProject(.src.userProject)
}
if := applySourceConds(.src.gen, .src.conds, ); != nil {
return nil,
}
if := setEncryptionHeaders(.Header(), .dst.encryptionKey, false); != nil {
return nil,
}
if := setEncryptionHeaders(.Header(), .src.encryptionKey, true); != nil {
return nil,
}
var *raw.RewriteResponse
var error
setClientHeader(.Header())
= runWithRetry(, func() error { , = .Do(); return })
if != nil {
return nil,
}
.RewriteToken = .RewriteToken
return , nil
}
func ( *ObjectHandle) ( ...*ObjectHandle) *Composer {
return &Composer{dst: , srcs: }
}
func ( *Composer) ( context.Context) ( *ObjectAttrs, error) {
= trace.StartSpan(, "cloud.google.com/go/storage.Composer.Run")
defer func() { trace.EndSpan(, ) }()
if := .dst.validate(); != nil {
return nil,
}
if len(.srcs) == 0 {
return nil, errors.New("storage: at least one source object must be specified")
}
.Destination = .ObjectAttrs.toRawObject(.dst.bucket)
if .SendCRC32C {
.Destination.Crc32c = encodeUint32(.ObjectAttrs.CRC32C)
}
for , := range .srcs {
if := .validate(); != nil {
return nil,
}
if .bucket != .dst.bucket {
return nil, fmt.Errorf("storage: all source objects must be in bucket %q, found %q", .dst.bucket, .bucket)
}
if .encryptionKey != nil {
return nil, fmt.Errorf("storage: compose source %s.%s must not have encryption key", .bucket, .object)
}
:= &raw.ComposeRequestSourceObjects{
Name: .object,
}
if := applyConds("ComposeFrom source", .gen, .conds, composeSourceObj{}); != nil {
return nil,
}
.SourceObjects = append(.SourceObjects, )
}
:= .dst.c.raw.Objects.Compose(.dst.bucket, .dst.object, ).Context()
if := applyConds("ComposeFrom destination", .dst.gen, .dst.conds, ); != nil {
return nil,
}
if .dst.userProject != "" {
.UserProject(.dst.userProject)
}
if .PredefinedACL != "" {
.DestinationPredefinedAcl(.PredefinedACL)
}
if := setEncryptionHeaders(.Header(), .dst.encryptionKey, false); != nil {
return nil,
}
var *raw.Object
setClientHeader(.Header())
= runWithRetry(, func() error { , = .Do(); return })
if != nil {
return nil,
}
return newObject(), nil
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |