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
}