76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
package reads
|
|
|
|
import (
|
|
"github.com/influxdata/influxdb/storage/reads/datatypes"
|
|
"github.com/influxdata/influxdb/tsdb/cursors"
|
|
)
|
|
|
|
type StringIteratorStream interface {
|
|
Send(*datatypes.StringValuesResponse) error
|
|
}
|
|
|
|
type StringIteratorWriter struct {
|
|
stream StringIteratorStream
|
|
res *datatypes.StringValuesResponse
|
|
err error
|
|
|
|
sz int // estimated size in bytes for pending write
|
|
vc int // total value count
|
|
}
|
|
|
|
func NewStringIteratorWriter(stream StringIteratorStream) *StringIteratorWriter {
|
|
siw := &StringIteratorWriter{
|
|
stream: stream,
|
|
res: &datatypes.StringValuesResponse{
|
|
Values: nil,
|
|
},
|
|
}
|
|
|
|
return siw
|
|
}
|
|
|
|
func (w *StringIteratorWriter) Err() error {
|
|
return w.err
|
|
}
|
|
|
|
func (w *StringIteratorWriter) WrittenN() int {
|
|
return w.vc
|
|
}
|
|
|
|
func (w *StringIteratorWriter) WriteStringIterator(si cursors.StringIterator) error {
|
|
if si == nil {
|
|
return nil
|
|
}
|
|
|
|
for si.Next() {
|
|
v := si.Value()
|
|
if v == "" {
|
|
// no value, no biggie
|
|
continue
|
|
}
|
|
|
|
w.res.Values = append(w.res.Values, []byte(v))
|
|
w.sz += len(v)
|
|
w.vc++
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w *StringIteratorWriter) Flush() {
|
|
if w.err != nil || w.sz == 0 {
|
|
return
|
|
}
|
|
|
|
w.sz, w.vc = 0, 0
|
|
|
|
if w.err = w.stream.Send(w.res); w.err != nil {
|
|
return
|
|
}
|
|
|
|
for i := range w.res.Values {
|
|
w.res.Values[i] = nil
|
|
}
|
|
w.res.Values = w.res.Values[:0]
|
|
}
|