@@ -50,6 +50,13 @@ func (p *BinlogParser) ParseFile(name string, offset int64, onEvent OnEventFunc)
50
50
51
51
if offset < 4 {
52
52
offset = 4
53
+ } else if offset > 4 {
54
+ // FORMAT_DESCRIPTION event should be read by default always (despite that fact passed offset may be higher than 4)
55
+ if _ , err = f .Seek (4 , os .SEEK_SET ); err != nil {
56
+ return errors .Errorf ("seek %s to %d error %v" , name , offset , err )
57
+ }
58
+
59
+ p .getFormatDescriptionEvent (f , onEvent )
53
60
}
54
61
55
62
if _ , err = f .Seek (offset , os .SEEK_SET ); err != nil {
@@ -59,55 +66,82 @@ func (p *BinlogParser) ParseFile(name string, offset int64, onEvent OnEventFunc)
59
66
return p .ParseReader (f , onEvent )
60
67
}
61
68
62
- func (p * BinlogParser ) ParseReader (r io.Reader , onEvent OnEventFunc ) error {
69
+
70
+
71
+ func (p * BinlogParser ) getFormatDescriptionEvent (r io.Reader , onEvent OnEventFunc ) error {
72
+ _ , err := p .parseSingleEvent (& r , onEvent )
73
+ return err
74
+ }
75
+
76
+
77
+
78
+ func (p * BinlogParser ) parseSingleEvent (r * io.Reader , onEvent OnEventFunc ) (bool , error ) {
63
79
var err error
64
80
var n int64
65
81
66
- for {
67
- headBuf := make ([]byte , EventHeaderSize )
82
+ headBuf := make ([]byte , EventHeaderSize )
68
83
69
- if _ , err = io .ReadFull (r , headBuf ); err == io .EOF {
70
- return nil
71
- } else if err != nil {
72
- return errors .Trace (err )
73
- }
84
+ if _ , err = io .ReadFull (* r , headBuf ); err == io .EOF {
85
+ return true , nil
86
+ } else if err != nil {
87
+ return false , errors .Trace (err )
88
+ }
74
89
75
- var h * EventHeader
76
- h , err = p .parseHeader (headBuf )
77
- if err != nil {
78
- return errors .Trace (err )
79
- }
90
+ var h * EventHeader
91
+ h , err = p .parseHeader (headBuf )
92
+ if err != nil {
93
+ return false , errors .Trace (err )
94
+ }
80
95
81
- if h .EventSize <= uint32 (EventHeaderSize ) {
82
- return errors .Errorf ("invalid event header, event size is %d, too small" , h .EventSize )
96
+ if h .EventSize <= uint32 (EventHeaderSize ) {
97
+ return false , errors .Errorf ("invalid event header, event size is %d, too small" , h .EventSize )
98
+ }
83
99
84
- }
100
+ var buf bytes.Buffer
101
+ if n , err = io .CopyN (& buf , * r , int64 (h .EventSize )- int64 (EventHeaderSize )); err != nil {
102
+ return false , errors .Errorf ("get event body err %v, need %d - %d, but got %d" , err , h .EventSize , EventHeaderSize , n )
103
+ }
85
104
86
- var buf bytes.Buffer
87
- if n , err = io .CopyN (& buf , r , int64 (h .EventSize )- int64 (EventHeaderSize )); err != nil {
88
- return errors .Errorf ("get event body err %v, need %d - %d, but got %d" , err , h .EventSize , EventHeaderSize , n )
89
- }
105
+ data := buf .Bytes ()
106
+ rawData := data
90
107
91
- data := buf .Bytes ()
92
- rawData := data
108
+ eventLen := int (h .EventSize ) - EventHeaderSize
93
109
94
- eventLen := int (h .EventSize ) - EventHeaderSize
110
+ if len (data ) != eventLen {
111
+ return false , errors .Errorf ("invalid data size %d in event %s, less event length %d" , len (data ), h .EventType , eventLen )
112
+ }
95
113
96
- if len (data ) != eventLen {
97
- return errors .Errorf ("invalid data size %d in event %s, less event length %d" , len (data ), h .EventType , eventLen )
114
+ var e Event
115
+ e , err = p .parseEvent (h , data )
116
+ if err != nil {
117
+ if _ , ok := err .(errMissingTableMapEvent ); ok {
118
+ return false , nil
98
119
}
120
+ return false , errors .Trace (err )
121
+ }
99
122
100
- var e Event
101
- e , err = p .parseEvent (h , data )
123
+ if err = onEvent (& BinlogEvent {rawData , h , e }); err != nil {
124
+ return false , errors .Trace (err )
125
+ }
126
+
127
+
128
+ return false , nil
129
+ }
130
+
131
+
132
+ func (p * BinlogParser ) ParseReader (r io.Reader , onEvent OnEventFunc ) error {
133
+
134
+ for {
135
+ done , err := p .parseSingleEvent (& r , onEvent );
102
136
if err != nil {
103
137
if _ , ok := err .(errMissingTableMapEvent ); ok {
104
138
continue
105
139
}
106
140
return errors .Trace (err )
107
141
}
108
142
109
- if err = onEvent ( & BinlogEvent { rawData , h , e }); err != nil {
110
- return errors . Trace ( err )
143
+ if done {
144
+ break
111
145
}
112
146
}
113
147
0 commit comments