71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package tsm1
|
|
|
|
import (
|
|
"bufio"
|
|
"compress/gzip"
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
type DigestReader struct {
|
|
r io.ReadCloser
|
|
gr *gzip.Reader
|
|
}
|
|
|
|
func NewDigestReader(r io.ReadCloser) (*DigestReader, error) {
|
|
gr, err := gzip.NewReader(bufio.NewReader(r))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &DigestReader{r: r, gr: gr}, nil
|
|
}
|
|
|
|
func (w *DigestReader) ReadTimeSpan() (string, *DigestTimeSpan, error) {
|
|
var n uint16
|
|
if err := binary.Read(w.gr, binary.BigEndian, &n); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
b := make([]byte, n)
|
|
if _, err := io.ReadFull(w.gr, b); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
var cnt uint32
|
|
if err := binary.Read(w.gr, binary.BigEndian, &cnt); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
ts := &DigestTimeSpan{}
|
|
for i := 0; i < int(cnt); i++ {
|
|
var min, max int64
|
|
var crc uint32
|
|
|
|
if err := binary.Read(w.gr, binary.BigEndian, &min); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
if err := binary.Read(w.gr, binary.BigEndian, &max); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
if err := binary.Read(w.gr, binary.BigEndian, &crc); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
if err := binary.Read(w.gr, binary.BigEndian, &n); err != nil {
|
|
return "", nil, err
|
|
}
|
|
ts.Add(min, max, int(n), crc)
|
|
}
|
|
|
|
return string(b), ts, nil
|
|
}
|
|
|
|
func (w *DigestReader) Close() error {
|
|
if err := w.gr.Close(); err != nil {
|
|
return err
|
|
}
|
|
return w.r.Close()
|
|
}
|