@@ -12,7 +12,7 @@ import (
12
12
)
13
13
14
14
type JSONLReader struct {
15
- scanner * bufio.Scanner
15
+ reader * bufio.Reader
16
16
}
17
17
18
18
// Assert JSONLReader satisfies the interface processors.DataProcessor
@@ -21,26 +21,34 @@ var _ processors.DataProcessor = &JSONLReader{}
21
21
// NewJSONLReader returns a new JSONLReader wrapping the given io.Reader object
22
22
func NewJSONLReader (r io.Reader ) * JSONLReader {
23
23
return & JSONLReader {
24
- scanner : bufio .NewScanner (r ),
24
+ reader : bufio .NewReader (r ),
25
25
}
26
26
}
27
27
28
28
func (r * JSONLReader ) ProcessData (d data.JSON , outputChan chan data.JSON , killChan chan error ) {
29
- var line []byte
30
- for r .scanner .Scan () {
31
- line = r .scanner .Bytes ()
29
+ // TODO: This allocates more than is necessary but at least it can handle large lines
30
+ Outer:
31
+ for {
32
+ var line []byte
33
+ for {
34
+ chunk , isPrefix , err := r .reader .ReadLine ()
35
+ if err != nil {
36
+ if err == io .EOF {
37
+ break Outer
38
+ }
39
+ util .KillPipelineIfErr (err , killChan )
40
+ }
41
+ line = append (line , chunk ... )
42
+ if ! isPrefix {
43
+ break
44
+ }
45
+ }
32
46
33
47
if ! json .Valid (line ) {
34
48
util .KillPipelineIfErr (errors .New ("Not valid JSON" ), killChan )
35
49
}
36
50
37
- // scanner.Bytes will overwrite our slice on the next iteration so we send a copy
38
- // to the output channel
39
- outputChan <- append ([]byte (nil ), line ... )
40
- }
41
-
42
- if err := r .scanner .Err (); err != nil {
43
- util .KillPipelineIfErr (err , killChan )
51
+ outputChan <- line
44
52
}
45
53
}
46
54
0 commit comments