func()

in pkg/datasource/sql/undo/builder/mysql_update_undo_log_builder.go [53:99]


func (u *MySQLUpdateUndoLogBuilder) BeforeImage(ctx context.Context, execCtx *types.ExecContext) ([]*types.RecordImage, error) {
	if execCtx == nil || execCtx.ParseContext == nil || execCtx.ParseContext.UpdateStmt == nil {
		return nil, nil
	}

	vals := execCtx.Values
	if vals == nil {
		vals = make([]driver.Value, 0)
		for _, param := range execCtx.NamedValues {
			vals = append(vals, param.Value)
		}
	}
	// use
	selectSQL, selectArgs, err := u.buildBeforeImageSQL(ctx, execCtx, vals)
	if err != nil {
		return nil, err
	}

	tableName, _ := execCtx.ParseContext.GetTableName()
	metaData, err := datasource.GetTableCache(types.DBTypeMySQL).GetTableMeta(ctx, execCtx.DBName, tableName)
	if err != nil {
		return nil, err
	}

	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
	}

	lockKey := u.buildLockKey2(image, *metaData)
	execCtx.TxCtx.LockKeys[lockKey] = struct{}{}
	image.SQLType = execCtx.ParseContext.SQLType

	return []*types.RecordImage{image}, nil
}