github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/uploader/resumable_recorder.go (about)

     1  package uploader
     2  
     3  import (
     4  	"context"
     5  
     6  	resumablerecorder "github.com/qiniu/go-sdk/v7/storagev2/uploader/resumable_recorder"
     7  	"github.com/qiniu/go-sdk/v7/storagev2/uploader/source"
     8  	"github.com/qiniu/go-sdk/v7/storagev2/uptoken"
     9  )
    10  
    11  func tryToOpenResumableRecorderForReading(ctx context.Context, src source.Source, multiPartsObjectOptions *MultiPartsObjectOptions, multiPartsUploaderOptions *MultiPartsUploaderOptions) resumablerecorder.ReadableResumableRecorderMedium {
    12  	if options := makeResumableRecorderOpenArgs(ctx, src, multiPartsObjectOptions, multiPartsUploaderOptions); options != nil {
    13  		if resumableRecorder := multiPartsUploaderOptions.ResumableRecorder; resumableRecorder != nil {
    14  			return resumableRecorder.OpenForReading(options)
    15  		}
    16  	}
    17  	return nil
    18  }
    19  
    20  func tryToOpenResumableRecorderForAppending(ctx context.Context, src source.Source, multiPartsObjectOptions *MultiPartsObjectOptions, multiPartsUploaderOptions *MultiPartsUploaderOptions) resumablerecorder.WriteableResumableRecorderMedium {
    21  	if options := makeResumableRecorderOpenArgs(ctx, src, multiPartsObjectOptions, multiPartsUploaderOptions); options != nil {
    22  		if resumableRecorder := multiPartsUploaderOptions.ResumableRecorder; resumableRecorder != nil {
    23  			medium := resumableRecorder.OpenForAppending(options)
    24  			if medium == nil {
    25  				medium = resumableRecorder.OpenForCreatingNew(options)
    26  			}
    27  			return medium
    28  		}
    29  	}
    30  	return nil
    31  }
    32  
    33  func tryToDeleteResumableRecorderMedium(ctx context.Context, src source.Source, multiPartsObjectOptions *MultiPartsObjectOptions, multiPartsUploaderOptions *MultiPartsUploaderOptions) {
    34  	if options := makeResumableRecorderOpenArgs(ctx, src, multiPartsObjectOptions, multiPartsUploaderOptions); options != nil {
    35  		if resumableRecorder := multiPartsUploaderOptions.ResumableRecorder; resumableRecorder != nil {
    36  			resumableRecorder.Delete(options)
    37  		}
    38  	}
    39  }
    40  
    41  func makeResumableRecorderOpenArgs(ctx context.Context, src source.Source, multiPartsObjectOptions *MultiPartsObjectOptions, multiPartsUploaderOptions *MultiPartsUploaderOptions) *resumablerecorder.ResumableRecorderOpenArgs {
    42  	sourceID, err := src.SourceID()
    43  	if err != nil || sourceID == "" {
    44  		return nil
    45  	}
    46  
    47  	upToken, err := getUpToken(multiPartsUploaderOptions.Credentials, &multiPartsObjectOptions.ObjectOptions, multiPartsUploaderOptions.UpTokenProvider)
    48  	if err != nil {
    49  		return nil
    50  	}
    51  	accessKey, err := upToken.GetAccessKey(ctx)
    52  	if err != nil {
    53  		return nil
    54  	}
    55  
    56  	bucketName, err := guessBucketName(ctx, multiPartsObjectOptions.BucketName, upToken)
    57  	if err != nil {
    58  		return nil
    59  	}
    60  
    61  	var objectName string
    62  	if multiPartsObjectOptions.ObjectName != nil {
    63  		objectName = *multiPartsObjectOptions.ObjectName
    64  	}
    65  
    66  	var totalSize uint64
    67  	if sizedSource, ok := src.(source.SizedSource); ok {
    68  		if ts, err := sizedSource.TotalSize(); err == nil {
    69  			totalSize = ts
    70  		}
    71  	}
    72  
    73  	regions, err := getRegions(ctx, upToken, bucketName, &multiPartsUploaderOptions.Options)
    74  	if err != nil || len(regions) == 0 {
    75  		return nil
    76  	}
    77  
    78  	return &resumablerecorder.ResumableRecorderOpenArgs{
    79  		AccessKey:   accessKey,
    80  		BucketName:  bucketName,
    81  		ObjectName:  objectName,
    82  		SourceID:    sourceID,
    83  		PartSize:    multiPartsObjectOptions.PartSize,
    84  		TotalSize:   totalSize,
    85  		UpEndpoints: regions[0].Up,
    86  	}
    87  }
    88  
    89  func guessBucketName(ctx context.Context, bucketName string, upTokenProvider uptoken.Provider) (string, error) {
    90  	if bucketName == "" {
    91  		if putPolicy, err := upTokenProvider.GetPutPolicy(ctx); err != nil {
    92  			return "", err
    93  		} else if bucketName, err = putPolicy.GetBucketName(); err != nil {
    94  			return "", err
    95  		}
    96  	}
    97  	return bucketName, nil
    98  }