From 38bd1ccf4250ab07c75277edbd818cddbab75373 Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Mon, 20 Jun 2022 22:47:03 +0900 Subject: [PATCH 1/2] replace io.ReadSeeker with io.Reader --- log/slow/parser.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/log/slow/parser.go b/log/slow/parser.go index 4db2469..266c4df 100644 --- a/log/slow/parser.go +++ b/log/slow/parser.go @@ -60,7 +60,7 @@ var ( // SlowLogParser parses a MySQL slow log. It implements the LogParser interface. type SlowLogParser struct { - reader io.ReadSeeker + reader io.Reader opt log.Options // -- stopChan chan bool @@ -77,7 +77,7 @@ type SlowLogParser struct { } // NewSlowLogParser returns a new SlowLogParser that reads from the open file. -func NewSlowLogParser(r io.ReadSeeker, opt log.Options) *SlowLogParser { +func NewSlowLogParser(r io.Reader, opt log.Options) *SlowLogParser { if opt.DefaultLocation == nil { // Old MySQL format assumes time is taken from SYSTEM. opt.DefaultLocation = time.Local @@ -129,8 +129,14 @@ func (p *SlowLogParser) Start() error { // Seek to the offset, if any. // @todo error if start off > file size if p.opt.StartOffset > 0 { - if _, err := p.reader.Seek(int64(p.opt.StartOffset), os.SEEK_SET); err != nil { - return err + if reader, ok := p.reader.(io.ReadSeeker); ok { + if _, err := reader.Seek(int64(p.opt.StartOffset), os.SEEK_SET); err != nil { + return err + } + } else { + if _, err := io.CopyN(io.Discard, p.reader, int64(p.opt.StartOffset)); err != nil { + return err + } } } From 4ccbe9051c47d46adc5de62eda678a0445c25bdb Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Mon, 20 Jun 2022 22:47:45 +0900 Subject: [PATCH 2/2] add test for parsing log from io.MultiReader --- log/slow/parser_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/log/slow/parser_test.go b/log/slow/parser_test.go index 1b0ea79..873b8ab 100644 --- a/log/slow/parser_test.go +++ b/log/slow/parser_test.go @@ -32,6 +32,7 @@ package slow_test import ( "bytes" + "io" l "log" "os" "path" @@ -1953,3 +1954,27 @@ SELECT fruit FROM trees; assert.NotEqual(t, 0, len(got)) } + +func TestParseFromMultiReader(t *testing.T) { + query1 := ` +# Time: 071218 11:48:27 +# User@Host: [SQL_SLAVE] @ [] +# Thread_id: 3 Schema: db1 +# Query_time: 0.000012 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0` + query2 := ` +use db2; +SELECT fruit FROM trees; +` + + buf1 := bytes.NewReader([]byte(query1)) + buf2 := bytes.NewReader([]byte(query2)) + p := parser.NewSlowLogParser(io.MultiReader(buf1, buf2), opt) + + got := []log.Event{} + go p.Start() + for e := range p.EventChan() { + got = append(got, *e) + } + + assert.NotEqual(t, 0, len(got)) +}