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
}