in pkg/datasource/sql/undo/builder/mysql_update_undo_log_builder.go [101:145]
func (u *MySQLUpdateUndoLogBuilder) AfterImage(ctx context.Context, execCtx *types.ExecContext, beforeImages []*types.RecordImage) ([]*types.RecordImage, error) {
if execCtx.ParseContext.UpdateStmt == nil {
return nil, nil
}
if len(beforeImages) == 0 || len(beforeImages[0].Rows) == 0 {
return []*types.RecordImage{{}}, nil
}
if beforeImages == nil || len(beforeImages) == 0 || len(beforeImages[0].Rows) == 0 {
return beforeImages, nil
}
var beforeImage *types.RecordImage
if len(beforeImages) > 0 {
beforeImage = beforeImages[0]
}
tableName, _ := execCtx.ParseContext.GetTableName()
metaData, err := datasource.GetTableCache(types.DBTypeMySQL).GetTableMeta(ctx, execCtx.DBName, tableName)
if err != nil {
return nil, err
}
selectSQL, selectArgs := u.buildAfterImageSQL(beforeImage, metaData)
stmt, err := execCtx.Conn.Prepare(selectSQL)
if err != nil {
log.Errorf("build prepare stmt: %+v", err)
return nil, err
}
rows, err := stmt.Query(selectArgs)
if err != nil {
log.Errorf("stmt query: %+v", err)
return nil, err
}
image, err := u.buildRecordImages(rows, metaData)
if err != nil {
return nil, err
}
image.SQLType = execCtx.ParseContext.SQLType
return []*types.RecordImage{image}, nil
}