func replyError(err error) error { if mysql.ErrorEqual(err, mysql.ErrBadConn) { return sqldriver.ErrBadConn } else { return errors.Trace(err) } }
func (c *Canal) travelRowsEventHandler(e *RowsEvent) error { c.rsLock.Lock() defer c.rsLock.Unlock() var err error for _, h := range c.rsHandlers { if err = h.Do(e); err != nil && !mysql.ErrorEqual(err, ErrHandleInterrupted) { log.Errorf("handle %v err: %v", h, err) } else if mysql.ErrorEqual(err, ErrHandleInterrupted) { log.Errorf("handle %v err, interrupted", h) return ErrHandleInterrupted } } return nil }
// Parse the dump data with Dumper generate. // It can not parse all the data formats with mysqldump outputs func Parse(r io.Reader, h ParseHandler) error { rb := bufio.NewReaderSize(r, 1024*16) var db string var binlogParsed bool for { line, err := rb.ReadString('\n') if err != nil && err != io.EOF { return errors.Trace(err) } else if mysql.ErrorEqual(err, io.EOF) { break } line = line[0 : len(line)-1] if !binlogParsed { if m := binlogExp.FindAllStringSubmatch(line, -1); len(m) == 1 { name := m[0][1] pos, err := strconv.ParseUint(m[0][2], 10, 64) if err != nil { return errors.Errorf("parse binlog %v err, invalid number", line) } if err = h.BinLog(name, pos); err != nil && err != ErrSkip { return errors.Trace(err) } binlogParsed = true } } if m := useExp.FindAllStringSubmatch(line, -1); len(m) == 1 { db = m[0][1] } if m := valuesExp.FindAllStringSubmatch(line, -1); len(m) == 1 { table := m[0][1] values, err := parseValues(m[0][2]) if err != nil { return errors.Errorf("parse values %v err", line) } if err = h.Data(db, table, values); err != nil && err != ErrSkip { return errors.Trace(err) } } } return nil }