lazy part_set reader
This commit is contained in:
parent
cb80a7aa42
commit
a34f9e082e
|
@ -230,6 +230,8 @@ func (ps *PartSet) GetReader() io.Reader {
|
|||
if !ps.IsComplete() {
|
||||
PanicSanity("Cannot GetReader() on incomplete PartSet")
|
||||
}
|
||||
return NewPartSetReader(ps.parts)
|
||||
|
||||
buf := []byte{}
|
||||
for _, part := range ps.parts {
|
||||
buf = append(buf, part.Bytes...)
|
||||
|
@ -237,6 +239,41 @@ func (ps *PartSet) GetReader() io.Reader {
|
|||
return bytes.NewReader(buf)
|
||||
}
|
||||
|
||||
type PartSetReader struct {
|
||||
i int
|
||||
parts []*Part
|
||||
reader *bytes.Reader
|
||||
}
|
||||
|
||||
func NewPartSetReader(parts []*Part) *PartSetReader {
|
||||
return &PartSetReader{
|
||||
i: 0,
|
||||
parts: parts,
|
||||
reader: bytes.NewReader(parts[0].Bytes),
|
||||
}
|
||||
}
|
||||
|
||||
func (psr *PartSetReader) Read(p []byte) (n int, err error) {
|
||||
readerLen := psr.reader.Len()
|
||||
if readerLen >= len(p) {
|
||||
return psr.reader.Read(p)
|
||||
} else if readerLen > 0 {
|
||||
n1, err := psr.Read(p[:readerLen])
|
||||
if err != nil {
|
||||
return n1, err
|
||||
}
|
||||
n2, err := psr.Read(p[readerLen:])
|
||||
return n1 + n2, err
|
||||
}
|
||||
|
||||
psr.i += 1
|
||||
if psr.i >= len(psr.parts) {
|
||||
return 0, fmt.Errorf("Attempt to read from PartSet but no parts left")
|
||||
}
|
||||
psr.reader = bytes.NewReader(psr.parts[psr.i].Bytes)
|
||||
return psr.Read(p)
|
||||
}
|
||||
|
||||
func (ps *PartSet) StringShort() string {
|
||||
if ps == nil {
|
||||
return "nil-PartSet"
|
||||
|
|
Loading…
Reference in New Issue