func (rowCache *InvalidationProcessor) buildDmlData(event *mysqlctl.UpdateResponse) (*proto.DmlType, error) { if !isDmlEvent(event.SqlType) { rowCache.updateErrCounters(NewInvalidationError(INVALID_EVENT, fmt.Sprintf("Bad Dml type, '%v'", event.SqlType), event.BinlogPosition.String())) return nil, nil } dml := new(proto.DmlType) dml.Table = event.TableName dml.Keys = make([]interface{}, 0, len(event.PkValues)) sqlTypeKeys := make([]sqltypes.Value, 0, len(event.PkColNames)) for _, pkTuple := range event.PkValues { sqlTypeKeys = sqlTypeKeys[:0] if len(pkTuple) == 0 { continue } for _, pkVal := range pkTuple { key, err := sqltypes.BuildValue(pkVal) if err != nil { rowCache.updateErrCounters(NewInvalidationError(INVALID_EVENT, fmt.Sprintf("Error building invalidation key '%v'", err), event.BinlogPosition.String())) return nil, nil } sqlTypeKeys = append(sqlTypeKeys, key) } invalidateKey := buildKey(sqlTypeKeys) if invalidateKey != "" { dml.Keys = append(dml.Keys, invalidateKey) } } return dml, nil }
func (rci *RowcacheInvalidator) handleDmlEvent(event *blproto.StreamEvent) { dml := new(proto.DmlType) dml.Table = event.TableName dml.Keys = make([]string, 0, len(event.PKValues)) sqlTypeKeys := make([]sqltypes.Value, 0, len(event.PKColNames)) for _, pkTuple := range event.PKValues { sqlTypeKeys = sqlTypeKeys[:0] for _, pkVal := range pkTuple { key, err := sqltypes.BuildValue(pkVal) if err != nil { log.Errorf("Error building invalidation key for %#v: '%v'", event, err) internalErrors.Add("Invalidation", 1) return } sqlTypeKeys = append(sqlTypeKeys, key) } invalidateKey := buildKey(sqlTypeKeys) if invalidateKey != "" { dml.Keys = append(dml.Keys, invalidateKey) } } rci.qe.InvalidateForDml(dml) }