func()

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
}