func()

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
}