mirror of
https://github.com/rclone/rclone.git
synced 2025-01-10 16:28:30 +01:00
ffe97865a7
... fix error handling for metadata upload ... fix metadata wrapping ... make sure not to leave any orphaned data when overwriting existing files with Put, Copy or Move ... switch from id01/go-lz4 to pierrec/lz4 ... use klauspost/compress/gzip for gzip ... use ulikunitz/xz for xz ... remove snappy
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package press
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
|
|
"github.com/klauspost/compress/gzip"
|
|
)
|
|
|
|
// AlgGzip represents gzip compression algorithm
|
|
type AlgGzip struct {
|
|
level int
|
|
blockSize uint32
|
|
}
|
|
|
|
// InitializeGzip initializes the gzip compression Algorithm
|
|
func InitializeGzip(bs uint32, level int) Algorithm {
|
|
a := new(AlgGzip)
|
|
a.blockSize = bs
|
|
a.level = level
|
|
return a
|
|
}
|
|
|
|
// GetFileExtension returns file extension
|
|
func (a *AlgGzip) GetFileExtension() string {
|
|
return ".gz"
|
|
}
|
|
|
|
// GetHeader returns the Lz4 compression header
|
|
func (a *AlgGzip) GetHeader() []byte {
|
|
return []byte{}
|
|
}
|
|
|
|
// GetFooter returns
|
|
func (a *AlgGzip) GetFooter() []byte {
|
|
return []byte{}
|
|
}
|
|
|
|
// CompressBlock that compresses a block using gzip
|
|
func (a *AlgGzip) CompressBlock(in []byte, out io.Writer) (compressedSize uint32, uncompressedSize uint64, err error) {
|
|
// Initialize buffer
|
|
bufw := bufio.NewWriterSize(out, int(a.blockSize+(a.blockSize)>>4))
|
|
|
|
// Initialize block writer
|
|
outw, err := gzip.NewWriterLevel(bufw, a.level)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
|
|
// Compress block
|
|
_, err = outw.Write(in)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
|
|
// Finalize gzip file, flush buffer and return
|
|
err = outw.Close()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
blockSize := uint32(bufw.Buffered())
|
|
err = bufw.Flush()
|
|
|
|
return blockSize, uint64(len(in)), err
|
|
}
|
|
|
|
// DecompressBlock decompresses Lz4 compressed block
|
|
func (a *AlgGzip) DecompressBlock(in io.Reader, out io.Writer, BlockSize uint32) (n int, err error) {
|
|
gzipReader, err := gzip.NewReader(in)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
written, err := io.Copy(out, gzipReader)
|
|
return int(written), err
|
|
}
|