@@ -142,22 +142,9 @@ func (c *Canal) runSyncBinlog() error {
142
142
continue
143
143
}
144
144
for _ , stmt := range stmts {
145
- nodes := parseStmt (stmt )
146
- for _ , node := range nodes {
147
- if node .db == "" {
148
- node .db = string (e .Schema )
149
- }
150
- if err = c .updateTable (ev .Header , node .db , node .table ); err != nil {
151
- return errors .Trace (err )
152
- }
153
- }
154
- if len (nodes ) > 0 {
155
- savePos = true
156
- force = true
157
- // Now we only handle Table Changed DDL, maybe we will support more later.
158
- if err = c .eventHandler .OnDDL (ev .Header , pos , e ); err != nil {
159
- return errors .Trace (err )
160
- }
145
+ err := c .handleQueryEvent (ev , e , stmt , pos , & savePos , & force )
146
+ if err != nil {
147
+ c .cfg .Logger .Errorf ("handle query event(%s) err %v" , e .Query , err )
161
148
}
162
149
}
163
150
if savePos && e .GSet != nil {
@@ -336,3 +323,45 @@ func (c *Canal) CatchMasterPos(timeout time.Duration) error {
336
323
337
324
return c .WaitUntilPos (pos , timeout )
338
325
}
326
+
327
+ // handleQueryEvent is handle some common query events (e.g., DDL,CREATE or DROP USER,GRANT),
328
+ // others use UnknownQueryEvent unified callbacks to expose to users
329
+ func (c * Canal ) handleQueryEvent (ev * replication.BinlogEvent , e * replication.QueryEvent ,
330
+ stmt ast.StmtNode , pos mysql.Position , savePos , force * bool ) error {
331
+ switch t := stmt .(type ) {
332
+ case * ast.RenameTableStmt , * ast.AlterTableStmt , * ast.DropTableStmt , * ast.CreateTableStmt , * ast.TruncateTableStmt :
333
+ return c .handleDDLEvent (ev , e , t , pos , savePos , force )
334
+ default :
335
+ return c .handleUnknownQueryEvent (ev , e , t , pos , savePos , force )
336
+ }
337
+ }
338
+
339
+ func (c * Canal ) handleDDLEvent (ev * replication.BinlogEvent , e * replication.QueryEvent ,
340
+ stmt ast.StmtNode , pos mysql.Position , savePos , force * bool ) error {
341
+ nodes := parseStmt (stmt )
342
+ for _ , node := range nodes {
343
+ if node .db == "" {
344
+ node .db = string (e .Schema )
345
+ }
346
+ if err := c .updateTable (ev .Header , node .db , node .table ); err != nil {
347
+ return errors .Trace (err )
348
+ }
349
+ }
350
+ if len (nodes ) > 0 {
351
+ * savePos = true
352
+ * force = true
353
+ // Now we only handle Table Changed DDL, maybe we will support more later.
354
+ if err := c .eventHandler .OnDDL (ev .Header , pos , e ); err != nil {
355
+ return errors .Trace (err )
356
+ }
357
+ }
358
+ return nil
359
+ }
360
+
361
+ func (c * Canal ) handleUnknownQueryEvent (ev * replication.BinlogEvent , e * replication.QueryEvent ,
362
+ stmt ast.StmtNode , pos mysql.Position , savePos , force * bool ) error {
363
+ if err := c .eventHandler .OnQueryEvent (ev .Header , e ); err != nil {
364
+ return errors .Trace (err )
365
+ }
366
+ return nil
367
+ }
0 commit comments