func()

in pkg/datasource/sql/undo/builder/mysql_multi_delete_undo_log_builder.go [48:102]


func (u *MySQLMultiDeleteUndoLogBuilder) BeforeImage(ctx context.Context, execCtx *types.ExecContext) ([]*types.RecordImage, error) {
	deletes := strings.Split(execCtx.Query, ";")
	if len(deletes) == 1 {
		return GetMySQLDeleteUndoLogBuilder().BeforeImage(ctx, execCtx)
	}

	values := make([]driver.Value, 0, len(execCtx.NamedValues)*2)
	if execCtx.Values == nil {
		for n, param := range execCtx.NamedValues {
			values[n] = param.Value
		}
	}

	multiQuery, args, err := u.buildBeforeImageSQL(deletes, values)
	if err != nil {
		return nil, err
	}

	var (
		stmt driver.Stmt
		rows driver.Rows

		record  *types.RecordImage
		records []*types.RecordImage

		meDataMap = execCtx.MetaDataMap[execCtx.ParseContext.DeleteStmt.
				TableRefs.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName).Name.O]
	)

	for _, sql := range multiQuery {
		stmt, err = execCtx.Conn.Prepare(sql)
		if err != nil {
			log.Errorf("build prepare stmt: %+v", err)
			return nil, err
		}

		rows, err = stmt.Query(args)
		if err != nil {
			log.Errorf("stmt query: %+v", err)
			return nil, err
		}

		record, err = u.buildRecordImages(rows, &meDataMap)
		if err != nil {
			log.Errorf("record images : %+v", err)
			return nil, err
		}
		records = append(records, record)

		lockKey := u.buildLockKey(rows, meDataMap)
		execCtx.TxCtx.LockKeys[lockKey] = struct{}{}
	}

	return records, nil
}