Files
obitools4/pkg/obiutils/gzipfile.go
Eric Coissac 2a11adb346 Add some doc and switch to the parallel gzip library
Former-commit-id: 2c1187001f989ba3de5895f516d4c8b54d52a4c4
2023-08-25 14:36:38 +02:00

102 lines
1.5 KiB
Go

package obiutils
import (
"bufio"
gzip "github.com/klauspost/pgzip"
"io"
"os"
)
type Wfile struct {
compressed bool
close bool
out io.WriteCloser
gf *gzip.Writer
fw *bufio.Writer
}
func OpenWritingFile(name string, compressed bool, append bool) (*Wfile, error) {
flags := os.O_WRONLY | os.O_CREATE
if append {
flags |= os.O_APPEND
}
fi, err := os.OpenFile(name, flags, 0660)
if err != nil {
return nil, err
}
var gf *gzip.Writer
var fw *bufio.Writer
if compressed {
gf = gzip.NewWriter(fi)
fw = bufio.NewWriter(gf)
} else {
gf = nil
fw = bufio.NewWriter(fi)
}
return &Wfile{
compressed: compressed,
close: true,
out: fi,
gf: gf,
fw: fw,
}, nil
}
func CompressStream(out io.WriteCloser, compressed bool, close bool) (*Wfile, error) {
var gf *gzip.Writer
var fw *bufio.Writer
if compressed {
gf = gzip.NewWriter(out)
fw = bufio.NewWriter(gf)
} else {
gf = nil
fw = bufio.NewWriter(out)
}
return &Wfile{
compressed: compressed,
close: close,
out: out,
gf: gf,
fw: fw,
}, nil
}
func (w *Wfile) Write(p []byte) (n int, err error) {
return w.fw.Write(p)
}
func (w *Wfile) WriteString(s string) (n int, err error) {
return w.fw.Write([]byte(s))
}
func (w *Wfile) Close() error {
var err error
err = nil
w.fw.Flush()
if w.compressed {
err = w.gf.Close()
}
var err2 error
err2 = nil
if w.close {
err2 = w.out.Close()
}
if err == nil {
err = err2
}
return err
}