5
5
"fmt"
6
6
7
7
. "github.com/go-mysql-org/go-mysql/mysql"
8
+ "github.com/go-mysql-org/go-mysql/replication"
8
9
"github.com/siddontang/go/hack"
9
10
)
10
11
@@ -30,6 +31,13 @@ type Handler interface {
30
31
HandleOtherCommand (cmd byte , data []byte ) error
31
32
}
32
33
34
+ type ReplicationHandler interface {
35
+ // handle Replication command
36
+ HandleRegisterSlave (data []byte ) error
37
+ HandleBinlogDump (pos Position ) (* replication.BinlogStreamer , error )
38
+ HandleBinlogDumpGTID (gtidSet * MysqlGTIDSet ) (* replication.BinlogStreamer , error )
39
+ }
40
+
33
41
func (c * Conn ) HandleCommand () error {
34
42
if c .Conn == nil {
35
43
return fmt .Errorf ("connection closed" )
@@ -131,6 +139,40 @@ func (c *Conn) dispatch(data []byte) interface{} {
131
139
}
132
140
133
141
return eofResponse {}
142
+ case COM_REGISTER_SLAVE :
143
+ if h , ok := c .h .(ReplicationHandler ); ok {
144
+ return h .HandleRegisterSlave (data )
145
+ } else {
146
+ return c .h .HandleOtherCommand (cmd , data )
147
+ }
148
+ case COM_BINLOG_DUMP :
149
+ if h , ok := c .h .(ReplicationHandler ); ok {
150
+ pos , err := parseBinlogDump (data )
151
+ if err != nil {
152
+ return err
153
+ }
154
+ if s , err := h .HandleBinlogDump (pos ); err != nil {
155
+ return err
156
+ } else {
157
+ return s
158
+ }
159
+ } else {
160
+ return c .h .HandleOtherCommand (cmd , data )
161
+ }
162
+ case COM_BINLOG_DUMP_GTID :
163
+ if h , ok := c .h .(ReplicationHandler ); ok {
164
+ gtidSet , err := parseBinlogDumpGTID (data )
165
+ if err != nil {
166
+ return err
167
+ }
168
+ if s , err := h .HandleBinlogDumpGTID (gtidSet ); err != nil {
169
+ return err
170
+ } else {
171
+ return s
172
+ }
173
+ } else {
174
+ return c .h .HandleOtherCommand (cmd , data )
175
+ }
134
176
default :
135
177
return c .h .HandleOtherCommand (cmd , data )
136
178
}
@@ -139,6 +181,10 @@ func (c *Conn) dispatch(data []byte) interface{} {
139
181
type EmptyHandler struct {
140
182
}
141
183
184
+ type EmptyReplicationHandler struct {
185
+ EmptyHandler
186
+ }
187
+
142
188
func (h EmptyHandler ) UseDB (dbName string ) error {
143
189
return nil
144
190
}
@@ -160,6 +206,18 @@ func (h EmptyHandler) HandleStmtClose(context interface{}) error {
160
206
return nil
161
207
}
162
208
209
+ func (h EmptyReplicationHandler ) HandleRegisterSlave (data []byte ) error {
210
+ return fmt .Errorf ("not supported now" )
211
+ }
212
+
213
+ func (h EmptyReplicationHandler ) HandleBinlogDump (pos Position ) (* replication.BinlogStreamer , error ) {
214
+ return nil , fmt .Errorf ("not supported now" )
215
+ }
216
+
217
+ func (h EmptyReplicationHandler ) HandleBinlogDumpGTID (gtidSet * MysqlGTIDSet ) (* replication.BinlogStreamer , error ) {
218
+ return nil , fmt .Errorf ("not supported now" )
219
+ }
220
+
163
221
func (h EmptyHandler ) HandleOtherCommand (cmd byte , data []byte ) error {
164
222
return NewError (
165
223
ER_UNKNOWN_ERROR ,
0 commit comments