mirror of
https://github.com/restic/restic.git
synced 2024-08-19 19:03:22 +02:00
88 lines
1.4 KiB
Go
88 lines
1.4 KiB
Go
package backend
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/zlib"
|
|
"crypto/sha256"
|
|
"io/ioutil"
|
|
"sync"
|
|
)
|
|
|
|
var idPool = sync.Pool{New: func() interface{} { return ID(make([]byte, IDSize)) }}
|
|
|
|
// Each lists all entries of type t in the backend and calls function f() with
|
|
// the id and data.
|
|
func Each(be Server, t Type, f func(id ID, data []byte, err error)) error {
|
|
ids, err := be.List(t)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, id := range ids {
|
|
data, err := be.Get(t, id)
|
|
if err != nil {
|
|
f(id, nil, err)
|
|
continue
|
|
}
|
|
|
|
f(id, data, nil)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Each lists all entries of type t in the backend and calls function f() with
|
|
// the id.
|
|
func EachID(be Server, t Type, f func(ID)) error {
|
|
ids, err := be.List(t)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, id := range ids {
|
|
f(id)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Compress applies zlib compression to data.
|
|
func Compress(data []byte) []byte {
|
|
// apply zlib compression
|
|
var b bytes.Buffer
|
|
w := zlib.NewWriter(&b)
|
|
_, err := w.Write(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
w.Close()
|
|
|
|
return b.Bytes()
|
|
}
|
|
|
|
// Uncompress reverses zlib compression on data.
|
|
func Uncompress(data []byte) []byte {
|
|
b := bytes.NewBuffer(data)
|
|
r, err := zlib.NewReader(b)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
buf, err := ioutil.ReadAll(r)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
r.Close()
|
|
|
|
return buf
|
|
}
|
|
|
|
// Hash returns the ID for data.
|
|
func Hash(data []byte) ID {
|
|
h := sha256.Sum256(data)
|
|
id := idPool.Get().(ID)
|
|
copy(id, h[:])
|
|
return id
|
|
}
|