putCompress compresses the input data and uploads it to the remote, returning the new object and its metadata
( ctx context.Context, f *Fs, in io.Reader, src fs.ObjectInfo, options []fs.OpenOption, mimeType string, )
| 91 | |
| 92 | // putCompress compresses the input data and uploads it to the remote, returning the new object and its metadata |
| 93 | func (z *zstdModeHandler) putCompress( |
| 94 | ctx context.Context, |
| 95 | f *Fs, |
| 96 | in io.Reader, |
| 97 | src fs.ObjectInfo, |
| 98 | options []fs.OpenOption, |
| 99 | mimeType string, |
| 100 | ) (fs.Object, *ObjectMetadata, error) { |
| 101 | // Unwrap reader accounting |
| 102 | in, wrap := accounting.UnWrap(in) |
| 103 | |
| 104 | // Add the metadata hasher |
| 105 | metaHasher := md5.New() |
| 106 | in = io.TeeReader(in, metaHasher) |
| 107 | |
| 108 | // Compress the file |
| 109 | pipeReader, pipeWriter := io.Pipe() |
| 110 | |
| 111 | resultsZstd := make(chan compressionResult[SzstdMetadata]) |
| 112 | go func() { |
| 113 | writer, err := NewWriterSzstd(pipeWriter, zstd.WithEncoderLevel(zstd.EncoderLevel(f.opt.CompressionLevel))) |
| 114 | if err != nil { |
| 115 | resultsZstd <- compressionResult[SzstdMetadata]{err: err} |
| 116 | close(resultsZstd) |
| 117 | return |
| 118 | } |
| 119 | _, err = io.Copy(writer, in) |
| 120 | if wErr := writer.Close(); wErr != nil && err == nil { |
| 121 | err = wErr |
| 122 | } |
| 123 | if cErr := pipeWriter.Close(); cErr != nil && err == nil { |
| 124 | err = cErr |
| 125 | } |
| 126 | |
| 127 | resultsZstd <- compressionResult[SzstdMetadata]{err: err, meta: writer.GetMetadata()} |
| 128 | close(resultsZstd) |
| 129 | }() |
| 130 | |
| 131 | wrappedIn := wrap(bufio.NewReaderSize(pipeReader, bufferSize)) |
| 132 | |
| 133 | ht := f.Fs.Hashes().GetOne() |
| 134 | var hasher *hash.MultiHasher |
| 135 | var err error |
| 136 | if ht != hash.None { |
| 137 | wrappedIn, wrap = accounting.UnWrap(wrappedIn) |
| 138 | hasher, err = hash.NewMultiHasherTypes(hash.NewHashSet(ht)) |
| 139 | if err != nil { |
| 140 | return nil, nil, err |
| 141 | } |
| 142 | wrappedIn = io.TeeReader(wrappedIn, hasher) |
| 143 | wrappedIn = wrap(wrappedIn) |
| 144 | } |
| 145 | |
| 146 | o, err := f.rcat(ctx, makeDataName(src.Remote(), src.Size(), f.mode), io.NopCloser(wrappedIn), src.ModTime(ctx), options) |
| 147 | if err != nil { |
| 148 | return nil, nil, err |
| 149 | } |
| 150 |
nothing calls this directly
no test coverage detected