55 "fmt"
66
77 . "github.com/go-mysql-org/go-mysql/mysql"
8+ "github.com/go-mysql-org/go-mysql/replication"
89 "github.com/siddontang/go/hack"
910)
1011
@@ -30,6 +31,13 @@ type Handler interface {
3031 HandleOtherCommand (cmd byte , data []byte ) error
3132}
3233
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+
3341func (c * Conn ) HandleCommand () error {
3442 if c .Conn == nil {
3543 return fmt .Errorf ("connection closed" )
@@ -131,6 +139,40 @@ func (c *Conn) dispatch(data []byte) interface{} {
131139 }
132140
133141 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+ }
134176 default :
135177 return c .h .HandleOtherCommand (cmd , data )
136178 }
@@ -139,6 +181,10 @@ func (c *Conn) dispatch(data []byte) interface{} {
139181type EmptyHandler struct {
140182}
141183
184+ type EmptyReplicationHandler struct {
185+ EmptyHandler
186+ }
187+
142188func (h EmptyHandler ) UseDB (dbName string ) error {
143189 return nil
144190}
@@ -160,6 +206,18 @@ func (h EmptyHandler) HandleStmtClose(context interface{}) error {
160206 return nil
161207}
162208
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+
163221func (h EmptyHandler ) HandleOtherCommand (cmd byte , data []byte ) error {
164222 return NewError (
165223 ER_UNKNOWN_ERROR ,
0 commit comments