in pkg/datasource/sql/undo/executor/executor.go [107:167]
func (b *BaseExecutor) queryCurrentRecords(ctx context.Context, conn *sql.Conn) (*types.RecordImage, error) {
if b.undoImage == nil {
return nil, fmt.Errorf("undo image is nil")
}
tableMeta := b.undoImage.TableMeta
pkNameList := tableMeta.GetPrimaryKeyOnlyName()
pkValues := b.parsePkValues(b.undoImage.Rows, pkNameList)
if len(pkValues) == 0 {
return nil, nil
}
where := buildWhereConditionByPKs(pkNameList, len(b.undoImage.Rows), maxInSize)
checkSQL := fmt.Sprintf(checkSQLTemplate, b.undoImage.TableName, where)
params := buildPKParams(b.undoImage.Rows, pkNameList)
rows, err := conn.QueryContext(ctx, checkSQL, params...)
if err != nil {
return nil, err
}
defer rows.Close()
image := types.RecordImage{
TableName: b.undoImage.TableName,
TableMeta: tableMeta,
SQLType: types.SQLTypeSelect,
}
rowImages := make([]types.RowImage, 0)
for rows.Next() {
columnTypes, err := rows.ColumnTypes()
if err != nil {
return nil, err
}
slice := datasource.GetScanSlice(columnTypes)
if err = rows.Scan(slice...); err != nil {
return nil, err
}
colNames, err := rows.Columns()
if err != nil {
return nil, err
}
columns := make([]types.ColumnImage, 0)
for i, val := range slice {
actualVal := val
if v, ok := val.(driver.Valuer); ok {
actualVal, _ = v.Value()
}
columns = append(columns, types.ColumnImage{
ColumnName: colNames[i],
Value: actualVal,
})
}
rowImages = append(rowImages, types.RowImage{Columns: columns})
}
if err := rows.Err(); err != nil {
return nil, err
}
image.Rows = rowImages
return &image, nil
}